2015-12-21 44 views
11

W łańcuchach systemu Android można zdefiniować liczby mnogie do obsługi tłumaczeń w zależności od faktycznego numeru dostarczanego do ciągu znaków, zgodnie z opisem here. Ciągi pozwalają również na określenie wielu parametrów pozycyjnych podobnych do tego, co sprintf robi w wielu językach.Ciągi liczbowe w systemie Android z wieloma parametrami

jednak rozważyć następujący ciąg:

<resources> 
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string> 
</resources> 

Zawiera dwie liczby, jak bym przekształcić to do liczby mnogiej w Androidzie? Wszystkie przykłady działają zawsze tylko z jednym parametrem. Czy to możliwe?

Odpowiedz

3

getQuantityString ma przeciążoną wersję, która pobiera identyfikator ciągu, ilość i obiekt o wartości varargs, którego można użyć do sformatowania łańcucha. Chociaż wydaje się, że można użyć liczby mnogiej, dla mnie brzmi to dziwnie. Można użyć metod pomocniczych zawartych w DateUtil, które są już zlokalizowane i dbać o liczbę pojedynczą/mnogą, a następnie uzupełnić ciąg znaków o wyniki tych metod pomocniczych. Na przykład. getRelativeTimeSpanString

<plurals name="numberOfEmails"> 
    <item quantity="one">%d email</item> 
    <item quantity="other">%d emails</item> 
</plurals> 

<plurals name="numberOfMessages"> 
    <item quantity="one">%d message</item> 
    <item quantity="other">%d messages</item> 
</plurals> 

a następnie można użyć getQuantityString odzyskać dwa kawałki i połączyć je w jeden.

+2

getRelativeTimeSpanString wydaje się być dobrym wyborem dla mojego problemu pod ręką, ale nie rozwiąże mojego początkowego pytania. Posiadanie tekstu o wielu numerach nie jest rzadkością ("Masz 5 e-maili i 3 wiadomości", "Zostało 5 dolarów i 83 centów."). Nie widzę, jak bym określił kod XML dla sugerowanej wersji getQuantityString. –

+0

spójrz na pierwszy link, napisałem. Dokumentacja mówi, że ilość będzie używana do wyboru ciągu i trzeciego argumentu, aby go sformatować. – Blackbelt

+1

Niestety, nie rozumiem.Czy możesz rozwinąć swoją odpowiedź na przykładzie: a) XML, aby ustawić ciąg dla 4 form liczby mnogiej potrzebnych do "Masz 5 e-maili i 3 wiadomości" oraz b) wywołanie getQuantityString z pocztami i wiadomościami jako ilości wejściowe? –

-6

Tu jest sposób, który może działać. Utworzyć znacznik liczby mnogiej pod Wartości/strings.xml tak:

<resources> 
    <plurals name="remaining"> 
     <item quantity="one">%1$d hours and</item> 
     <item quantity="other">%2$d minutes remaining.</item> 
    </plurals> 
</resources> 

Następnie aktywności:

Resources res = getResources(); 
String myString = res.getQuantityString(R.plurals.remaining, count, count); 

Mam nadzieję, że to pomaga !!!

+2

To nie jest odpowiedź na pytanie .. . – user2878850

+4

Sugerowane rozwiązanie w ogóle nie działa. Tylko jeden z tekstów zostanie wybrany dla każdego wywołania getQuantityString (...). –

5

Poprzednia odpowiedź używa konkatenacji ciągów, która jest niepoprawna z punktu widzenia i18n. Dla oryginalnego ciągu "% 1 $ d godzin i% 2 $ d minut pozostałych." użycie konkatenacji ciągów zmusiłoby tłumaczenie "pozostałych" do końca, co może nie być odpowiednie w przypadku niektórych języków.

Moje rozwiązanie byłoby:

<resources> 
    <string name="remaining">Time remaining: Hours:%1$d Minutes:%2$d.</string> 
</resources> 

Albo z "Pozostały czas" w nagłówku.

Rozwiązanie to jest wymienione w http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

to często możliwe do uniknięcia ciągów ilościowych za pomocą ilościowych neutralnych sformułowań takich jak „książki: 1”