如何国际化/本地化JSP/Servlet web应用程序?

如何国际化/本地化JSP/Servlet web应用程序?,jsp,unicode,localization,internationalization,Jsp,Unicode,Localization,Internationalization,我从谷歌那里了解到,国际化是我实现梦想的过程 使用所有语言的web应用程序。我想了解Unicode的国际化过程,所以我从和学习了Unicode 我能够理解Unicode是如何将字符集编码为字节,然后再将字节解码为字符集的。但我不知道如何进一步前进。我想学习如何比较字符串,我需要知道如何在我的web应用程序中实现国际化。有什么建议吗?请引导我 我的目标: 我的主要目标是开发一个用于翻译的Web应用程序(英语到阿拉伯语,反之亦然)。我想跟随国际化。我希望在所有三种浏览器(即FF、Chrome和IE)

我从谷歌那里了解到,国际化是我实现梦想的过程 使用所有语言的web应用程序。我想了解Unicode的国际化过程,所以我从和学习了Unicode

我能够理解Unicode是如何将字符集编码为字节,然后再将字节解码为字符集的。但我不知道如何进一步前进。我想学习如何比较字符串,我需要知道如何在我的web应用程序中实现国际化。有什么建议吗?请引导我

我的目标:


我的主要目标是开发一个用于翻译的Web应用程序(英语到阿拉伯语,反之亦然)。我想跟随国际化。我希望在所有三种浏览器(即FF、Chrome和IE)中运行我的web应用程序进行翻译。我如何实现这一点?

对于基本的JSP/Servlet web应用程序,基本方法将结合使用。资源束包含键值对,其中键是一个常量,对于所有语言都是相同的,并且每个语言的值都不同。资源束通常由API加载。但是,这可以自定义,以便您可以从例如数据库中加载键值对

下面是一个示例,说明如何使用基于文件的资源包属性对Web应用程序的登录表单进行国际化


  • 创建以下文件并将它们放在一些包中,例如
    com.example.i18n
    (对于Maven,将它们放在
    src/main/resources
    中的包结构中)

    text.properties
    (包含默认语言的键值对,通常为英语)


    text_es.properties
    (包含西班牙语(
    es
    )键值对)

    管理当前语言。如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置。否则,如果会话中以前已经设置了该语言,请改为使用该语言。否则,请在请求标头中使用用户提供的区域设置

    设置资源束的区域设置。这一行在
    前面很重要

    通过其基本名称(即完整的限定包名称)初始化资源包,直到使用不带
    \ll\u CC
    说明符的唯一名称为止

    通过指定的绑定键检索消息值

    通知搜索机器人程序页面使用的是什么语言,这样它就不会被标记为重复内容(因此,有利于SEO)

    当选择另一种语言时,JavaScript将立即提交语言下拉列表,页面将用新选择的语言刷新


  • 但是,您需要记住,默认情况下,属性文件是使用ISO-8859-1字符编码读取的。您需要通过unicode转义来转义它们。这可以使用JDK提供的
    native2ascii.exe
    工具来完成。有关更多详细信息,请参见


    一个理论上的替代方案是提供一个包,其中包含一个自定义的UTF-8加载这些文件,但遗憾的是,基本JSTL
    fmt
    taglib不支持这一点。您需要在
    过滤器的帮助下自行管理它。有一些(MVC)框架可以以更透明的方式处理这个问题,比如JSF,另请参见。

    除了BalusC所说的,您还必须注意方向性(因为英语是从左到右写的,阿拉伯语是从左到右写的)。最简单的方法是将
    dir
    属性添加到JSP网页的
    html
    元素并将其外部化,因此值来自属性文件(与其他元素或属性一样):

    
    ...
    
    此外,设计这样的应用程序的样式也没有什么问题——至少应该避免绝对定位。如果由于某种原因无法避免这种情况,您可以使用每种(每种?)语言的不同样式表,或者做一些不必要的事情,即使用表来管理布局。如果您想使用div元素,我建议使用具有“对称”左右样式属性的相对定位(两者具有相同的值),因为这就是切换方向性的原因

    你可以找到更多关于双向网站的信息。

    基于,我在GAE-Google的应用程序引擎上使用以下内容:

    jsp文件如下所示:

    <%@ page import="java.io.* %>
    <% 
      String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
      ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
    %>                 
    
    <!DOCTYPE html>
    <%@ page contentType="text/html;charset=UTF-8" language="java"%>
    <head>
    </head>
    <body>
      <p>      
        <%= RB.getString("greeting") %>
      </p>
    </body>
    
    app.properties
    包含:

    greeting=Hello!
    

    这就是全部

    是的,的确,这也必须考虑在内。
    。默认值是
    这个不错的解决方案有一个问题:从请求中获取的区域设置可以是语言和国家,如“en_US”,它将给出无效的HTML。必须仅使用区域设置中的语言部分“en”作为lang属性的值。上述国际化方法不会根据显示的语言修改url。对于如何根据语言更新url,您有什么建议吗。我这样问是因为,对于索引,建议不同的语言有不同的URL:如果您将语言资源(test.properties和text_en.properties文件)文件放在应用程序/资源根目录下,您可以这样设置fmt:bundle:@bahadirT:假设“test”是一个拼写错误,这是正确的。
    basename
    必须表示不带文件扩展名的基本名称。不在包中组织它只是一种糟糕的做法。@theyuv:
    用户拥有{0}审查{0,选择,0#s | 1 | 1
    login.label.username = Nombre de usuario
     login.label.password = Contraseña
     login.button.submit = Acceder
    
    <html dir="${direction}">
    ...
    </html>
    
    <%@ page import="java.io.* %>
    <% 
      String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
      ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
    %>                 
    
    <!DOCTYPE html>
    <%@ page contentType="text/html;charset=UTF-8" language="java"%>
    <head>
    </head>
    <body>
      <p>      
        <%= RB.getString("greeting") %>
      </p>
    </body>
    
    greeting=Bonjour!
    
    greeting=Hello!