带编译时检查的 l18n 框架

2024-03-13

我目前正在开发一个更大的 Java 桌面应用程序,现在我想添加翻译。 l18n 系统让我困扰的是,它不提供任何类型的编译时检查。

在java的系统中,你有类似的东西HashMap,其中每个本地化字符串都有一个“Key”,翻译后的字符串就是“Value”。这看起来像这样(取自教程示例 http://docs.oracle.com/javase/tutorial/i18n/intro/after.html):

Locale currentLocale;
ResourceBundle messages;

currentLocale = new Locale(language, country);

messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));

如果您有一个简单/小型的应用程序,这会很有效。但在具有数千个翻译字符串的大型应用程序中,可能会发生“Key”中出现拼写错误并因此得到空字符串或错误字符串的情况。

运气好的话,应用程序会抛出一个RuntimeException告诉您这一点,但即使这样,您也可能没有到达这一点,因为在某些情况下可能不会显示的对话框中使用了错误的“键”(假设这是一个错误对话框)。

为了防止这种情况发生,使用提供所用“密钥”编译时检查的系统将是更好的主意。例如,这在 Android 中使用,您在 XML 文件中指定资源,然后将其索引并映射到类(包括要使用的“键”)。这样,你会得到类似这样的东西(来自安卓文档 http://developer.android.com/guide/topics/resources/accessing-resources.html):

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

如果该“键”中有拼写错误,您将在编译时收到错误(IDE 中还具有“自动完成”功能)。

现在,要完成这样的工作,您需要一个小工具/脚本来执行索引部分并生成资源类(R.java)。在 Android 中,Eclipse 插件(或一般的 IDE)会为您完成此操作。

我现在的问题是:是否已经有一个系统可以用于 Java 中的普通桌面应用程序?还是我说的话严重错误?


对于这个问题有一个相当简单的解决方案。首先,不要使用魔术字符串作为代码,定义常量并引用它们。所以你改变..

messages.getString("greetings");

to

messages.getString(I18.GREETINGS_CODE);

并有相应的班级;

public class I18 {

  public static final String GREETINGS_CODE = "greetings";

}

接下来编写一个测试用例,其中的每个代码I18在每个语言资源文件中查找类。如果任何资源文件缺少代码,则测试失败。这不是编译时间,但如果出现任何问题,您的项目将无法通过测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带编译时检查的 l18n 框架 的相关文章

随机推荐

  • 如何使用“npm login”设置 npm 凭据而不从 stdin 读取?

    我正在尝试自动化npm publish在 Docker 容器内 但是当npm login命令尝试读取用户名和电子邮件 npm login lt lt EOF username password email EOF 它可以在 Bash 终端中
  • 服务器套接字 - 仅接受来自白名单中的 IP 地址的连接

    我有一个套接字服务器 它侦听并接受来自客户端的连接 其工作原理如下 do some pre processing socket binds etc listen to client if listen sockfd BACKLOG 1 pe
  • 将列表列表解压到列表中[重复]

    这个问题在这里已经有答案了 我有元组列表的列表 a 1 2 3 4 5 6 7 8 9 10 我怎样才能制作一个元组列表 b 1 2 3 4 5 6 7 8 9 10 天真的方法是 b for c in a for t in c b app
  • 贝塞尔曲线与线段的交点

    我正在用 Python 使用 pygame 编写一个游戏 它要求我为每个新游戏生成随机但美观的 海洋 经过长时间的搜索 我确定了一种涉及贝塞尔曲线的算法 如padlib py http www pygame org project Pyga
  • TypeScript 抱怨 array.map 不存在于 string[] 类型的数组上

    我有一个使用 TypeScript 的 Angular 2 项目 我不明白为什么 TypeScript 实时编译器会抱怨info map 错误消息 未解析的函数或方法 map 当我在浏览器中运行它时 工作得很好 但我不明白为什么会发生这种情
  • VBScript 函数的返回值

    我有两个函数 我试图在第二个函数中使用一个函数的结果 它将前往else部分 但它没有打印 cus number 的任何内容 如何打印 cus number Function getNumber number 423 End Function
  • Laravel 高级搜索查询修复

    我有一个带有多个输入和选择框的搜索表单 我需要帮助来获取查询中的 if 条件 以便每个部分同时单独工作 这是我的刀片代码
  • pymodbus TcpClient超时

    我遇到 pymodbus TcpClient 超时问题 import logging from pymodbus client sync import ModbusTcpClient logging basicConfig log logg
  • SwiftUI macOS 命令(菜单栏)和视图

    大家好 我开始学习 SwiftUI 和 macOS 开发 我正在使用 SwiftUI 生命周期 如何从菜单栏的聚焦窗口调用函数 除了Apple文档之外 我还发现这个参考 https swiftwithmajid com 2020 11 24
  • 使用Intent发送数据

    如何使用 Intent 将数据 例如字符串 从活动 A 发送到活动 B 而无需离开活动 A 我还需要知道如何捕获活动 B 中的数据并将其添加到文本视图中 您正在寻找的是广播接收器 我应该发送广播的活动 public class Activi
  • 如何在R中提取具有相同名称但不同标识符的列

    抱歉 如果它太基础了 但我对 R 不熟悉 我有一个数据框 其中多个列具有相同的列名 因此在导入到 R 后 已添加标识符 像这样的事情 A c 2 3 5 A 1 c aa bb cc A 2 c TRUE FALSE TRUE B c 1
  • 在 python 中提取和解码字符串化字节字符串?

    我有这样的字符串 其中有一个字符串化的字节子字符串 如下所示 some string b Hurricane Mitch n 提取嵌套 b 字符串以便我可以用 utf8 正确解码它的最佳方法是什么 最直接的方法 仍然比您需要的更强大 但可能
  • 我的 .htaccess 文件无法正常工作

    我已将我的项目添加到免费托管 000webhost 上 我的所有文件都列在 public html 目录中 项目是在codeigniter中构建的 我在 public html htaccess 添加了 htaccess 文件 其中包含 O
  • C for 循环遍历带指针的数组

    我是 C 新手 但我有 Java 和 Android 经验 我的 for 循环有问题 它永远不会结束 只会继续下去 char entered string 50 char p string NULL gets entered string
  • Api-Platform:在 SF 4 中使用 Yaml 配置代替注释

    我想在 Api Platform 中使用 YAML 而不是注释 我没有使用 Api Platform 发行版 而是将 api pack 添加到了现有的 Symfony Flex 项目中 composer req api 文档说 YAML 文
  • “在我的机器上运行” - 如何修复不可重现的错误?

    偶尔 尽管进行了所有测试 我还是收到了客户的错误报告 而我根本无法在办公室重现该错误报告 Apologies to Jeff http www codinghorror com blog archives 000818 html for t
  • PHP 中如何处理并发请求(使用线程、线程池或子进程)

    据我所知 PHP 支持处理多个并发连接 并且根据服务器的不同 可以按照本中提到的方式进行配置answer https stackoverflow com a 1430890 2159867 服务器如何管理多个连接 是为每个请求分叉一个子进程
  • 从 jquery ajax GET 将多个参数传递给 .asmx

    html a fill in names and check it out a br p Enter First Name p
  • JPA 日期文字

    如何在不使用 类型化 参数的情况下表示 JPA 查询中的日期 如果日期确实是固定的 例如 1980 年 3 月 1 日 则代码 TypedQuery
  • 带编译时检查的 l18n 框架

    我目前正在开发一个更大的 Java 桌面应用程序 现在我想添加翻译 l18n 系统让我困扰的是 它不提供任何类型的编译时检查 在java的系统中 你有类似的东西HashMap 其中每个本地化字符串都有一个 Key 翻译后的字符串就是 Val