2015-04-09 17 views
12

Come è possibile ottenere la descrizione cinese semplificata (简体)? Dal locale a disposizione Locale.SIMPLIFIED_CHINESE, nessun metodo sembra tornare questa descrizione:Visualizzazione della variante locale per il cinese semplificato

  • getDisplayLanguage() restituisce il nome della lingua corretta, ma senza la variante.
  • getDisplayName() restituisce il nome della lingua e il Paese corretti, ma anche senza la variante.
  • getDisplayVariant() restituisce una stringa vuota.

Ho anche provato a creare un nuovo Locale utilizzando i diversi costruttori, anche senza alcun risultato.

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

Ho controllato il Android source code for LocalePicker e ho concluso che si tratta di loaded from the resources (special_locale_codes e special_locale_names).

Qualsiasi soluzione oltre a dover hardcode/includere questa stringa nelle mie risorse?

+1

risolto. È stato un problema divertente :) – Drakes

+0

@Drakes che desideri! Sto solo scherzando, bel tentativo però :) – m0skit0

risposta

1

Probabilmente si poteva accedere l'androide risorsa interna: com.android.internal.R.array.special_locale_names allo stesso modo in cui è fatto in LocalePicker:

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

Ma è probabilmente più sicuro di utilizzare il proprio risorsa qui (evitando l'uso di interni)

+0

Penso che dovrei usare PackageManager per ottenere le risorse di un'app esterna, poiché Impostazioni è un APK separato. – m0skit0

5

Lasciatemi spiegare il mio processo su come l'ho affrontato. In primo luogo, ho trovato questo blocco di codice in 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); 
} 

che prende in un Locale come già sapete. Quindi cerca di trovare il codice locale nell'array di stringhe specialLocaleCodes. Il specialLocaleNames si sta cercando sono ottenuti da arrays.xml come hai utilmente dichiarato:

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

e le lingue corrispondenti

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

Avviso il codice con il cinese semplificato è zh_CN e gli ultimi due caratteri sono in maiuscolo.

Tuttavia,

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

stampe

Locale: zh_cn

Avviso minuscolo. Quindi non c'è modo specialLocaleCodes[i].equals(code) restituirà true.Allora ho curiosato Locale.java e, per farla breve, possiamo ignorare che guazzabuglio che cambia caso per fare questo (e si deve mantenere il terzo parametro come una stringa vuota per questo lavoro):

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

Stampe

Locale: zh_CN

Con questo si dovrebbe essere in grado di fare questo:

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

Ulteriori controlli in seguito su Kitkat utilizzare questo (grazie Andrea!)

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

è stato possibile stampare

العربية, 中文 (简体), 中文 (繁體)

come previsto. Tuttavia, qualcosa in Kitkat sta ancora impedendo la corretta visualizzazione della stringa. Frustrante.


Tuttavia, in Lollipop 5.0+ e Java 1.7 questo funziona utilizzando forLanguageTag() in Locale.

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

che stampa

getDisplayName: 中文 (简体 中文)
getDisplayLanguage: 中文

+0

Grazie ma non funziona ancora su Android 4.1: 'Locale è 中文 (中国)'. +1 per lo sforzo però :) – m0skit0

+1

L'unica cosa che posso pensare è che "com.android.internal.R" è specifico del venditore. Sto cercando di ottenere il contenuto di 'String [] specialLocaleNames = resources.getStringArray (R.array.special_locale_names); 'da qualcuno. Ciò mostrerebbe ciò che un telefono ha effettivamente memorizzato in là. – Drakes

+0

O potrebbe sicuramente cambiare da una versione Android a un'altra. In quale versione hai provato questo? – m0skit0

Problemi correlati