GWT 国际化为阿拉伯语(RTL 语言)?

GWT Internationalization to Arabic (RTL language)?

当我将我的 Web 应用程序国际化为 RTL 语言时遇到问题(应该是 GWT 功能)。基本上,GWT 功能反映了 RTL 的接口,我不希望这种情况发生。

如何防止 GWT 自动镜像我的界面并只保留翻译后的字符串?

这是我的 *.gwt.xml 代码:

    <!DOCTYPE ... >
<module rename-to='blah'>
    <inherits name='com.google.gwt.user.User' />
    <inherits name='com.google.gwt.user.theme.clean.Clean'/> 
    <inherits name="com.google.gwt.i18n.I18N"/>
    <inherits name="com.google.gwt.json.JSON" />
    <inherits name="com.google.gwt.user.Debug"/> 

    <extend-property name="locale" values="pt"/>
    <extend-property name="locale" values="es"/>
    <extend-property name="locale" values="ar"/>

    <source path="client"/>
    <source path="shared"/>

    <entry-point 
        class="EntryPoint"/>

    <!-- Remote services   -->

</module>

此致

GWT 支持 RTL 和 LTR 语言

  • 如果你想要 LTR(Left to Right) 主题,那么在 *.gwt.xml
  • 中使用 <inherits name="com.google.gwt.user.theme.chrome.Chrome"/>(默认主题)
  • 如果您想要 RTL(从右到左)主题,请使用 <inherits name="com.google.gwt.user.theme.chrome.ChromeRTL"/>in *.gwt.xml

在您的情况下,如果您不希望 GWT 功能将接口镜像到 RTL,则使用 <inherits name="com.google.gwt.user.theme.chrome.Chrome"/>

不幸的是,这是许多 GWT 小部件的功能。这些小部件在内部调用 LocaleInfo.getCurrentLocale().isRTL(),即使您以某种方式更改此调用的 return 值,它也会禁用文本的 rtl。所以那不是一个选择。

我猜你有两个选择。首先,不要使用使用 RTL 检查的小部件,或者其次,在添加小部件时自己检查 isRTL 并将其添加到相反的方向。例如,如果您将小部件添加到 WEST,请在 isRTL() 为真时将其添加到 EAST。这两个选项都不是最佳选择,但我看不到其他解决方案。

我们遇到了同样的问题。使用 GWT 2.6.x,您可以通过使用延迟绑定将 LocaleInfo.isRTL() 的值强制为 false 来实现此目的:

<replace-with class="org.activityinfo.i18n.shared.CldrImplLtr">
    <when-type-is class="com.google.gwt.i18n.client.impl.CldrImpl"/>
    <when-property-is name="locale" value="ar" />
</replace-with>

如果你想强制这样做,你可以省略 <when-property-is 标签 适用于所有语言环境。

然后提供一个简单的CldrImplLtr class:

public class CldrImplLtr extends CldrImpl {

   @Override
   public boolean isRTL() {  return false; }
}

似乎有一些有趣的事情,但它似乎比支持界面的完全从右到左镜像更易于管理。

您可以在项目中的 "com.google.gwt.i18n.client.impl.cldr" 包下创建一个名为 "CldrImpl_ar" 的 class(您必须自己创建此包)。 class 将包含以下代码:

package com.google.gwt.i18n.client.impl.cldr;

import com.google.gwt.i18n.client.impl.CldrImpl;

public class CldrImpl_ar extends CldrImpl {
    @Override
    public boolean isRTL() {
        return false;
    }
}

此 class 已存在于 GWT 库代码中,但那里的 return 值为真。一旦创建了这个独立的 class,它就优先于 GWT 库中的那个,从而达到 "overwriting" 的效果。

这正是您要查找的内容:

  1. 使用阿拉伯语时没有自动镜像效果
  2. 只使用翻译后的字符串

最终结果可能不是阿拉伯语用户的最佳体验,但如果支持从右到左不是您的项目的高优先级,它确实可以节省大量开发时间..