动态文本的国际化
一般在Java项目中,文本的国际化可以通过property文件来实现。对于静态文本来说(比如按钮名称、表格列名等),property文件非常合适;但对于动态文本来说(比如业务表的状态字段),property文件的形式就有些局限了。
这里简单解释下动态文本和静态文本的差异。
动态文本是在运行期间,根据客户的实际情况,可能会有变化的内容。比如现在有一个业务字段,叫“差异原因”,现在有2种原因。随着业务的开展,将来可能有3,4,5种甚至更多。也就是说是会动态增长的。
而静态文本是不会变的。比如某个按钮,业务再怎么变,这个按钮还是在那里,除非对按钮有可见的限制,但那已经不是文本国际化的问题,而是可见权限的管理问题。
之前我一直有种误解,就是认为动态文本还分为两种,区分的标准就是,程序中是否会使用其code值做业务判断。比如业务状态字段,程序中可能会根据对状态值的判断,走不同的流程分支。因此,程序中会使用它,应该由程序员来维护和管理。另一种就是程序根本不关心该字段的具体内容,字段内容只是用作简单的显示使用。
但是后来我发现,这种区分标准的界限很模糊。你很难确定说,这个字段的值将来程序是否会使用。因为分类不同,其实现方式就不同。如果从一种分类变为另一种分类,就需要大量的修改代码。
现在我认为,其本质都是一种都是动态文本。程序员关心的始终都是动态文本的key,所有key对应的value,都应该交由java国际化框架来解决。
其实property文件也只是Java国际化文本的一种存储介质而已,你完全可以采用数据库、xml、Java类等等其他的持久化方案。或者,你完全可以自己写一套,就像以前很多老系统中,存在的字典表这种简化的国际化方案(基本只需支持中文,并且会有很严重的性能问题,因为你需要频繁的将字典表与业务表进行关联)。
property文件方案对于解决动态文本国际化的局限性主要有:
- 需要访问生产服务器的文件系统并定位具体文件(如果你的property文件分散,就更难维护了);
- 修改后需要重启服务器;
- 如果你像我一样是非英文用户,那每次编辑完文件后,你都要用native2ascii工具转换一下property文件(或者你使用一个支持这种编码转换的editor),因为property文件默认都是iso-8859-1编码(具体可参见wikipedia的相应段落http://en.wikipedia.org/wiki/.properties);
上面的第一点和第三点,就完全否决了由非java程序员进行维护的的可能。
因此,我们需要修改方案,使运维人员可以方便的维护动态文本。property数据库持久方案就可以解决以上问题。
关于采用数据库实现java国际化,网上也有很多现成的例子,我主要参考的是这篇文章:http://java.dzone.com/articles/resource-bundle-tricks-and
以下是我对ResourceBundle的Control的实现
public class ResourceBundleDBControl extends Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
return new MyResources(baseName,locale);
}
protected class MyResources extends ListResourceBundle {
@SuppressWarnings("unused")
private Locale locale;
private String baseName;
public MyResources(String baseName,Locale locale) {
this.baseName = baseName;
this.locale = locale;
}
@Override
protected Object[][] getContents() {
DetachedCriteria dc = DetachedCriteria.forClass(Code.class);
dc.createAlias("codeType", "type");
dc.setProjection(Projections.projectionList()
.add(Projections.property("key"))
.add(Projections.property("value")));
dc.add(Restrictions.eq("type.code", baseName));
ApplicationContext ctx = ApplicationContextProvider.getContext();
IQueryService queryService = (IQueryService) ctx.getBean("queryService");
@SuppressWarnings("unchecked")
Listresult = (List) queryService.query(dc); Object [][] r = new Object[result.size()][2]; for(int i = 0;i < result.size(); i++){ r[i][0] = result.get(i)[0]; r[i][1] = result.get(i)[1]; } return r; } }}
ResourceBundle的control机制可以参考其API文档。默认ResourceBundle可以从class和property文件加载内容。通过客户化control的实现,我们可以从数据库加载ResourceBundle。
对于新的ResourceBundle的使用可以参考以下代码(即将customerized control作为参数传入即可):
public String getTextFromDB(String bundleName,String key){
ResourceBundle b = ResourceBundle.getBundle(bundleName, new ResourceBundleDBControl());
return b.getString(key);
}
注意:ResourceBundle本身有缓存机制。比如ListResourceBundle本身有一个map作为内部的缓存。因此,修改动态文本后,需要重启应用服务器。或者修改ListResourceBundle的实现,不应用缓存。
下图中的lookup即为内部缓存:
相关推荐
国际化文本工具是一款基于Python开发的专业应用,主要用于减轻国际化过程中对Excel母表的管理和维护工作。在软件全球化的大背景下,确保应用程序能够支持多种语言是至关重要的,而这个过程往往涉及到大量文本的整理...
菜单国际化主要是指将菜单项的文本从源代码中分离出来,存储在资源文件中,这样就可以根据用户的地区设置加载相应的语言版本。以下步骤展示了如何实现: 1. **创建资源文件**:在项目中右键点击,选择“添加” -> ...
为了使网站或应用对全球用户友好,我们需要将其文本翻译成目标语言,这就是“file input 按钮国际化”的目标。 实现这个功能的方法有多种,下面介绍几种常见的技术: 1. **使用HTML5的`lang`属性**:HTML5允许我们...
C# 多国语言国际化(Internationalization)是开发支持多种语言的应用程序的关键技术。在WinForms应用程序中,C#提供了一套完整的框架来实现这一功能,使得开发者可以轻松地为不同地区和语言的用户提供定制化的界面...
国际化标签库提供了一种标准化的方式来管理和显示各种语言的文本资源,使开发者可以轻松地将应用内容翻译成不同语言,以满足全球用户的需求。 首先,我们要理解什么是“标签”。在编程领域,标签通常指的是用于标识...
3. **资源文件**:在实现国际化时,需要创建一个或多个资源文件,存储不同语言的文本。例如,对于英文和中文,可能有`en.json`和`zh.json`,分别包含对应的翻译字符串。 4. **加载策略**:根据应用需求,可以选择...
国际化不仅仅是翻译文本,它涉及到整个应用的适应性,包括日期、时间、数字格式、货币、排序规则等。在iOS中,国际化主要通过`Localizable.strings`文件和`InfoPlist.strings`文件来实现。 1. `Localizable.strings...
《Kiwi国际化全流程解决方案》 在当今全球化的背景下,软件产品的国际化和本地化已经成为不可或缺的环节,特别是对于JavaScript开发者来说,理解并掌握这一流程至关重要。本文将深入探讨Kiwi项目提供的国际化全流程...
2. **I18N Lib**:开源库,提供了更方便的API来处理国际化,包括动态加载资源、自动处理编码转换等。 3. **Eclipse IDE**:集成开发环境中,Eclipse提供国际化支持,可以方便地编辑和管理资源文件。 综上所述,Java...
5. 在视图中使用国际化文本:在JSP或其他视图文件中,可以使用Spring标签库提供的标签来显示国际化文本,或者直接使用代码中获取的文本值。 6. 浏览器请求的国际化实现:可以通过配置Accept-Language请求头,让...
这个“jquery国际化demo”项目提供了一个简单的示例,帮助初学者快速理解和应用jQuery的国际化功能。 首先,jQuery的国际化通常依赖于jQuery-i18n-plugin。这是一个用于处理翻译文本的插件,它可以加载不同语言的...
arguments)` 方法可以将消息模板中的占位符替换为实际的值,从而实现动态生成国际化文本。 #### 四、Struts 1.2 对国际化的支持 Struts 1.2 在其框架内集成了上述 Java 国际化支持的关键组件,并提供了以下特性:...
在这个“ZK 国际化(动态切换资源文件)1.0”主题中,我们将深入探讨如何实现ZK应用中的国际化,特别是如何动态地切换资源文件以支持多语言环境。 1. **ZK资源文件**:在ZK框架中,资源文件通常是以.properties格式...
国际化字符转码是IT领域中一个重要的概念,特别是在软件开发和网页设计中,因为全球化的市场需求使得软件和服务需要支持多种语言和字符集。这个过程涉及到将不同编码格式的字符转换成统一的标准,以便在不同的系统和...
在Android应用开发中,为了使应用能够适应全球市场,国际化的支持是必不可少的。"Android 一键国际化"是一个针对Android Studio的高效插件,旨在帮助开发者便捷地为应用添加多语言支持,尤其对于那些需要快速扩展到...
实际项目中,可能会使用更复杂的库如`i18next`或`formatjs`来管理国际化,它们提供了更完善的功能,比如动态加载、缓存、Pluralization规则支持等。 总结来说,JavaScript中的国际化涉及到资源文件的管理和本地化...
本文将深入探讨Js国际化插件的工作原理、功能以及如何实现静态和动态国际化映射。 首先,我们需要理解什么是国际化(i18n)。i18n 是“internationalization”的缩写,其中数字8代表单词中的字母数量,它指的是设计...
在国际化的场景中,可能需要存储各种语言的文本资源,此时可以创建一个`Translation`实体类,包含`key`(对应message的ID)、`language`和`value`(翻译后的文本)字段。通过JPA,可以方便地进行增删改查操作。 4. ...
1. 页面国际化:在JSP页面中,可以使用`s:text`标签输出国际化文本,或者在`s:textfield`的`key`属性中指定资源文件中的键。还可以使用`s:i18n`标签直接查找资源文件中的内容。 2. Action国际化:在Action类中,...
3、在jsp中采用标签来读取国际化消息文本 4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置,设置语言到session中的,key为Globals.LOCALE_KEY,value为当前设置的语言. * 参见:...