如何在java中找出与语言环境相关的文本方向?

时间:2013-12-28 12:29:40

标签: java android internationalization

在我编写格式和解析引擎时,我想找出 - 给定j.u.Locale,如果一般文本方向是从右到左(字母字符)。我所看到的是:

1。)Character#getDirectionality(char)这需要了解要解析的具体char,由于可能的填充字符,这并不总是很容易。

2。)java.awt.ComponentOrientation #getOrientation(Locale)这个方法对我来说有两个问题。首先,我不想依赖于awt或其他gui库(预期Java可能会在以后的模块化)。第二个也是更重要的:在OpenJDK和Android中实现这个方法只是使用一种非常简单的方法,即:如果语言是(ar,fa,iw,ur)之一,那么方法就是RIGHT_TO_LEFT。但是看Wikipedia-ISO-639,似乎有更多的语言有从右到左的方向,例如ISO-639代码'他'(希伯来语)。

所以现在我的问题是,你知道更好的方法吗?目前我倾向于使用维基百科列表,即使用更好的语言列表来优化java.awt.ComponentOrientation方法。

2 个答案:

答案 0 :(得分:11)

经过一些进一步的研究后,我发现语言代码'iw'只是'他'的旧形式。表达式new Locale("he").getLanguage()将提供结果“iw”!

然而,ComponentOrientation方法显然不是最新的,因为它根据维基百科缺少以下语言:

yi(yiddish plus old form ji),dv(maldivian),ps(普什图语)和ha(hausa)

所以我改进了ComponentOrientation的方法并添加了这些缺少的语言。最终代码如下所示:

private static final Set<String> RTL;

static {
  Set<String> lang = new HashSet<String>();
  lang.add("ar");
  lang.add("dv");
  lang.add("fa");
  lang.add("ha");
  lang.add("he");
  lang.add("iw");
  lang.add("ji");
  lang.add("ps");
  lang.add("sd");
  lang.add("ug");
  lang.add("ur");
  lang.add("yi");
  RTL = Collections.unmodifiableSet(lang);
}

public static boolean isTextRTL(Locale locale) {
  return RTL.contains(locale.getLanguage());
}

答案 1 :(得分:0)

基于上述内容,我创建了:

/**
 * This static block sets up the locale's which have a right-to-left text orientation
 */
private static final Set<String> RTL;

static
{
    Set<String> lang = new HashSet<String>();

    // we go through the new Locale(), then getLanguage(), because the language codes are not always stable, according to the Locale.getLanguage() documentation
    // stripExtensions() is used so only the language and not country specific codes are used. ie: "en" rather than "en_CA"
    lang.add( new Locale( "ar" ).stripExtensions().getLanguage() ); // Arabic          //$NON-NLS-1$
    lang.add( new Locale( "dv" ).stripExtensions().getLanguage() ); // Divehi          //$NON-NLS-1$
    lang.add( new Locale( "fa" ).stripExtensions().getLanguage() ); // Persian         //$NON-NLS-1$
    lang.add( new Locale( "ha" ).stripExtensions().getLanguage() ); // Hausa           //$NON-NLS-1$
    lang.add( new Locale( "he" ).stripExtensions().getLanguage() ); // Hebrew          //$NON-NLS-1$
    lang.add( new Locale( "iw" ).stripExtensions().getLanguage() ); // Hebrew          //$NON-NLS-1$
    lang.add( new Locale( "ji" ).stripExtensions().getLanguage() ); // Yiddish         //$NON-NLS-1$
    lang.add( new Locale( "ps" ).stripExtensions().getLanguage() ); // Pushto          //$NON-NLS-1$
    lang.add( new Locale( "sd" ).stripExtensions().getLanguage() ); // Sindhi          //$NON-NLS-1$
    lang.add( new Locale( "ug" ).stripExtensions().getLanguage() ); // Uighur          //$NON-NLS-1$
    lang.add( new Locale( "ur" ).stripExtensions().getLanguage() ); // Urdu            //$NON-NLS-1$
    lang.add( new Locale( "yi" ).stripExtensions().getLanguage() ); // Yiddish         //$NON-NLS-1$

    RTL = Collections.unmodifiableSet( lang );
}

以及:

/**
 * Returns either SWT.RIGHT_TO_LEFT or SWT.LEFT_TO_RIGHT dependent on the Locale's orientation
 */
public static int getSWTOrientation( Locale locale )
{
    return RTL.contains( locale.stripExtensions().getLanguage() ) ? SWT.RIGHT_TO_LEFT : SWT.LEFT_TO_RIGHT;
}

/**
 * Returns true if the Locale has a Right To Left text orientation
 */
public static boolean isRightToLeft( Locale locale )
{
    return RTL.contains( locale.stripExtensions().getLanguage() );
}

谢谢