2015-04-09 9 views
12

Jak mogę uzyskać uproszczony chiński opis (简体)? Z dostępnej lokalizacji Locale.SIMPLIFIED_CHINESE, żadna metoda nie wydaje się, aby powrócić do tego opisu:Pierwsze ustawienie regionalne dla uproszczonego chińskiego

  • getDisplayLanguage() zwraca poprawną nazwę języka, ale bez wariantu.
  • zwraca poprawną nazwę i kraj języka, ale także bez wariantu.
  • getDisplayVariant() zwraca pusty ciąg znaków.

Próbowałem również zbudować nowy Locale przy użyciu różnych konstruktorów, również bez skutku.

new Locale("zh", "CN"); 
new Locale("zh", "CN", "Hans"); 

Sprawdziłem Android source code for LocalePicker i mam stwierdziła, że ​​jest loaded from the resources (special_locale_codes i special_locale_names).

Jakieś rozwiązanie oprócz konieczności używania kodu twardego/uwzględnienia tego ciągu w moich zasobach?

+1

rozwiązany. Był zabawny problem. :) – Drakes

+0

@ Drakes, które chcesz! Po prostu żartuję, ale spróbuj :) – m0skit0

Odpowiedz

1

Można prawdopodobnie uzyskać dostęp do android zasób wewnętrzny: com.android.internal.R.array.special_locale_names w ten sam sposób to zrobić w LocalePicker:

final Resources resources = context.getResources(); 
final String[] specialLocaleNames = resources.getStringArray(com.android.internal.R.array.special_locale_names); 

Ale to chyba bezpieczniej jest używać własnego zasobu tutaj (unikanie o wykorzystaniu wewnętrznych)

+0

Myślę, że musiałbym użyć programu PackageManager, aby pobrać zasoby aplikacji zewnętrznej, ponieważ Ustawienia to osobny plik APK. – m0skit0

5

Pozwolę sobie wyjaśnić proces, w jaki sposób to rozwiązałem. Po pierwsze, uważam, że ten blok kodu w LocalePicker.java

private static String getDisplayName(Locale l, String[] specialLocaleCodes, String[] specialLocaleNames) { 
    String code = l.toString(); 

    for (int i = 0; i < specialLocaleCodes.length; i++) { 
     if (specialLocaleCodes[i].equals(code)) { 
      return specialLocaleNames[i]; 
     } 
    } 
    return l.getDisplayName(l); 
} 

która odbywa się w Locale jak już wiesz. Następnie próbuje znaleźć kod lokalny w tablicy łańcuchowej specialLocaleCodes. specialLocaleNames szukasz uzyskuje się z arrays.xml jak już usłużnie stwierdził:

<string-array translatable="false" name="special_locale_codes"> 
    <item>ar_EG</item> 
    <item>zh_CN</item> 
    <item>zh_TW</item> 
</string-array> 

i odpowiadające im języki

<string-array translatable="false" name="special_locale_names"> 
    <item>العربية</item> 
    <item>中文 (简体)</item> 
    <item>中文 (繁體)</item> 
</string-array> 

Wskazówka kod z chińskim uproszczonym jest zh_CN a ostatnie dwa znaki są pisane wielką literą.

Jednakże

Locale locale = new Locale("zh_CN"); 
System.out.println("Locale: " + locale); 

drukuje

lokalizacyjnych: zh_cn

komunikatu dolnej części obudowy. Więc nie ma mowy, że specialLocaleCodes[i].equals(code) zwróci true.Więc potem szturchnął wokół Locale.java i, krótko mówiąc, możemy ominąć takim przypadku zmieniających zbieraniną w ten sposób (i trzeba zachować 3rd parametr jako pusty ciąg znaków to zadziałało):

Locale locale = new Locale("zh", "CN", ""); 
System.out.println("Locale: " + locale); 

Prints

Locale: zh_CN

Mając to powinieneś być w stanie to zrobić:

Locale locale = new Locale("zh", "CN", ""); 
System.out.println("Name:" + locale.getDisplayName(locale)); 

Po dalszej inspekcji na KitKat pomocą tego (dziękuję Andrew!)

int specialLocaleNamesId = Resources.getSystem().getIdentifier("special_locale_names", "array", "android"); 
String[] specialLocaleNames = Resources.getSystem().getStringArray(specialLocaleNamesId); 

możliwe było wydrukowanie

العربية, 中文 (简体), alfabetyczny (Spis)

zgodnie z oczekiwaniami. Jednak coś w KitKat nadal uniemożliwia wyświetlanie prawidłowego łańcucha. Denerwujący.


Jednak w Lollipop 5.0+ i Java 1.7 to działa przy użyciu forLanguageTag() w Locale.

Locale locale = Locale.forLanguageTag("zh-Hans"); 
System.out.println("getDisplayName:" + locale.getDisplayName(locale)); 
System.out.println("getDisplayLanguage:" + locale.getDisplayLanguage(locale)); 

drukowany

GetDisplayName: alfabetyczny (简体 alfabetyczny)
getDisplayLanguage: alfabetyczny

+0

Dzięki, ale to wciąż nie działa w systemie Android 4.1: 'Locale to 中文 (中国)'. +1 za wysiłek :) – m0skit0

+1

Jedyne, co mogę myśleć to to, że "com.android.internal.R" jest specyficzne dla dostawcy. Próbuję uzyskać zawartość 'String [] specialLocaleNames = resources.getStringArray (R.array.special_locale_names); 'od kogoś. To by wskazywało, co tam zapisał telefon. – Drakes

+0

Albo może zdecydowanie zmienić się z jednej wersji Androida na inną. W której wersji testowałeś to? – m0skit0

Powiązane problemy