2010-11-16 6 views
11

Devo essere in grado di rilevare se la lingua corrente che il mio utente sta visualizzando è una lingua RTL (da destra a sinistra) come l'arabo.C'è un modo per rilevare un linguaggio RTL in Java?

Al momento lo sto rilevando solo in base al codice della lingua dalla proprietà di sistema user.language, ma ci deve essere un modo migliore.

risposta

12
ComponentOrientation.getOrientation(new Locale(System.getProperty("user.language"))).isLeftToRight(); 
4

mi sentivo un po 'sporca basandosi su classi AWT che sono abbastanza datato e avevo a che fare con BCP-47 codici di lingua, così ho finito per copiare il codice da parte di Google di chiusura Modelli:

/** 
* A regular expression for matching right-to-left language codes. 
* See {@link #isRtlLanguage} for the design. 
*/ 
private static final Pattern RtlLocalesRe = Pattern.compile(
    "^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))" + 
    "(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)"); 
/** 
* Check if a BCP 47/III language code indicates an RTL language, i.e. either: 
* - a language code explicitly specifying one of the right-to-left scripts, 
* e.g. "az-Arab", or<p> 
* - a language code specifying one of the languages normally written in a 
* right-to-left script, e.g. "fa" (Farsi), except ones explicitly specifying 
* Latin or Cyrillic script (which are the usual LTR alternatives).<p> 
* The list of right-to-left scripts appears in the 100-199 range in 
* http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and 
* Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, and 
* Tifinagh, which also have significant modern usage. The rest (Syriac, 
* Samaritan, Mandaic, etc.) seem to have extremely limited or no modern usage 
* and are not recognized. 
* The languages usually written in a right-to-left script are taken as those 
* with Suppress-Script: Hebr|Arab|Thaa|Nkoo|Tfng in 
* http://www.iana.org/assignments/language-subtag-registry, 
* as well as Sindhi (sd) and Uyghur (ug). 
* The presence of other subtags of the language code, e.g. regions like EG 
* (Egypt), is ignored. 
*/ 
public static boolean isRtlLanguage(String languageString) { 
    return languageString != null && 
     RtlLocalesRe.matcher(languageString).find(); 
} 

Guarda https://closure-templates.googlecode.com/svn-history/r21/trunk/java/src/com/google/template/soy/internal/i18n/BidiUtils.java

+1

Cosa c'è di sbagliato wi le classi AWT? Non è che siano stati abbandonati o cose del genere. –

+0

Non è molto chiaro quali classi AWT continueranno a funzionare in un ambiente senza testa, per esempio. – Trejkaz