65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Java 属性文件进行本地化

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2015 年 6 月 12 日

CPOL

5分钟阅读

viewsIcon

36111

downloadIcon

271

本文通过一个示例,介绍了如何使用 Java 属性文件和“ResourceBundle”类来本地化应用程序。

引言

本文通过一个示例,介绍了如何使用 Java 属性文件和“ResourceBundle”类来本地化应用程序。

背景

本地化在现代应用程序中变得越来越重要。当本地化任务不是很繁重时,我发现属性文件非常方便易用。在此示例中,我将尝试实现两个目标。

  • 我将向您展示如何使用属性文件和“ResourceBundle”类将文本翻译成不同的语言;
  • 如果最佳匹配的属性文件中不存在某个翻译条目,我将讨论翻译循环查找机制的回退规则。

该示例是一个 Maven 项目。如果您不熟悉 Maven,可以查看我早期的文章 这里这里,了解如何将其导入 Eclipse 以及如何在 Eclipse 中运行它。下面是在 Eclipse 项目浏览器中显示的该项目。

本地化器和属性文件

为了简化,让我们直接看“Localizer.java”文件。

package com.song.localization;
    
import java.util.Locale;
import java.util.ResourceBundle;
    
import org.springframework.context.i18n.LocaleContextHolder;
    
public class Localizer {
    private final static String RESOURCE_BUNDLE = "com.song.localization.dictionary";
    private Locale locale = null;
    
    public Localizer() { this(Locale.getDefault()); }
    public Localizer(Locale locale) { this.locale = locale; }
    
    public String getLocalizedText(String key)
    {
        try
        {
            ResourceBundle bundle = ResourceBundle.getBundle(RESOURCE_BUNDLE,
                    locale, this.getClass().getClassLoader());
    
            if (bundle.keySet().contains(key)) {
                return bundle.getString(key);
            }
            else {
                return key + "(No localization entry found)";
            }
        }
        catch (Exception e)
        {
            return "LOCALIZATION FAILED: " + e.toString();
        }
    }
    
    public Locale getLocale() { return this.locale; }
    
    public static Localizer getBrowserLocalizer() {
        return new Localizer(LocaleContextHolder.getLocale());
    }
}
  • “getLocalizedText()”将输入的键翻译成所需语言的字符串。它从资源文件中查找翻译的文本;
  • 当浏览器向服务器发送 HTTP 请求时,它会在请求头中发送所需的响应语言和区域设置。如果您使用 Spring MVC,可以使用“getBrowserLocalizer()” 工厂方法 来获取“Localizer”对象。它会自动将“Localizer”对象的“Locale”设置为浏览器请求的设置。

属性文件的实现如下。

 

如果您查看示例中的属性文件名,您会注意到它有三个部分。

  • “dictionary”是包的捆绑名称;
  • “zh”是语言代码,即中文;
  • “TW”是地区代码,即台湾。在台湾,人们使用略有不同的书写中文形式,有时也称为“繁体中文”。

根据 文档,语言代码应始终小写,地区代码应始终大写。为了展示“Localizer”类的回退规则,我故意在“dictionary_zh.properties”和“dictionary_zh_TW.properties”文件中省略了一些翻译条目。

Spring MVC 控制器和视图

为了向您展示“Localizer”类的工作原理,我创建了一个 Spring MVC Web 应用程序。MVC 控制器实现在“LocalizationExampleController.java”文件中。

package com.song.web.controller;
    
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
    
import com.song.localization.Localizer;
    
@Controller
public class LocalizationExampleController {
    
    @RequestMapping(value ={"/example"}, method = RequestMethod.GET)
    public ModelAndView Example() {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("example.jsp");
    
        Localizer localizer = Localizer.getBrowserLocalizer();
        mv.addObject("welcome_text", localizer.getLocalizedText("welcome_text"));
        mv.addObject("to_text", localizer.getLocalizedText("to_text"));
        mv.addObject("mywebsite_text", localizer.getLocalizedText("mywebsite_text"));
    
        return mv;
    }
}

相应的 MVC 视图实现在“example.jsp”文件中。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%String baseUrl = getServletContext().getInitParameter("BaseUrl");%>
<%
    String welcome_text = (String)request.getAttribute("welcome_text");
    String to_text = (String)request.getAttribute("to_text");
    String mywebsite_text = (String)request.getAttribute("mywebsite_text");
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Localization Example with Property Files</title>
<link rel="stylesheet" type="text/css"
    href="<%out.print(baseUrl); %>styles/site.css">
</head>
<body>
<div class="container">
    <div class="center"><%=welcome_text %></div>
    <div class="center"><%=to_text %></div>
    <div class="center"><%=mywebsite_text %></div>
</div>
</body>
</html>
  • 控制器使用“getBrowserLocalizer()”工厂方法创建“Localizer”对象,并将翻译的文本添加到“ModelAndView”对象中;
  • 然后,视图将翻译的文本写入返回给浏览器的 HTML 内容中。

运行应用程序

如果您想运行该应用程序,可以将其导入 Eclipse 并在开发环境中运行。您也可以发出“mvn clean install”命令来获取“war”文件并将其部署到真正的 J2EE 服务器。为了测试本地化是如何工作的,让我们先配置浏览器的语言偏好。如果您使用 Google Chrome,可以转到“设置”->“显示高级设置...”->“语言”,然后点击“语言和输入设置...”按钮。第一次测试,让我们将意大利语拖到顶部,并将其设置为浏览器的首选语言。

由于我们没有意大利语的属性文件,本地化将转到默认属性文件“dictionary.properties”(恰好是英语)来查找翻译条目。如果我们加载网页,就可以看到默认的翻译文本。

现在,让我们将“中文(繁体)”拖到顶部,并将其设置为浏览器的首选语言。然后,我们可以刷新网页,看看显示的是什么文本。

关于回退规则的讨论

  • 当我们设置浏览器的首选语言为“中文(繁体)”时,浏览器将在请求头中发送“zh_TW”,以告知服务器在可能的情况下发送“繁体中文”文本;
  • 本地化器将首先尝试最佳匹配的属性文件“dictionary_zh_TW.properties”,该文件同时匹配语言和地区。在此文件中,它找到了翻译条目“welcome_text”和翻译文本“欢迎”;
  • 本地化器在“dictionary_zh_TW.properties”文件中找不到翻译条目“to_text”,然后尝试第二个最佳匹配的属性文件“dictionary_zh.properties”,该文件匹配语言,但未指定地区。在此文件中,本地化器找到了翻译条目“to_text”和翻译文本“来到”;
  • 本地化器在最佳或次佳匹配的属性文件中都找不到翻译条目“mywebsite_text”,因此它转到默认属性文件“dictionary.properties”获取翻译文本“My Web Site”;
  • 如果本地化器甚至在默认属性文件中都找不到翻译条目,它将返回查找键,并附加“(未找到本地化条目)”。

关注点

  • 本文通过一个示例,介绍了如何使用 Java 属性文件和“ResourceBundle”类来本地化应用程序;
  • 它向您展示了如何使用属性文件为您的应用程序添加本地化功能;
  • 它还讨论了 Java ResourceBundle 实现的回退规则;
  • 使用属性文件进行本地化的最大优点是简单,但它可能不适合需要翻译大量文本的应用程序。如果您需要翻译大量的文本,我建议您实现自己的本地化机制,以最适合您的需求;
  • 如果您想实现自己的本地化机制,我认为您可能想借鉴回退规则,我认为这些规则非常优雅且合理。

历史

首次修订 - 2015 年 10 月 6 日

© . All rights reserved.