典型的Java I18N流程 - 将资源文件发送到要翻译的翻译公司
-
03-10-2019 - |
题
关于使用Java ResourceBundles提供多种语言的UI,有很多教程的负载。但是,有一个 过程 关于与翻译公司的典型互动问题,我似乎找不到答案。
例如,假设我不认识法语,并且需要雇用翻译公司来获取我的应用程序的翻译,我会寄给他们
- 默认资源属性文件“ whywhen_en_us.properties”,包括密钥和英语值,然后恢复“ whywhen_fr_fr.properties”?
- 带有空值的“ whywhe_fr_fr.properties”和“ whate_en_us.properties”供参考?
- 其他组合?
解决方案
由于您的问题是关于一个过程,而不是关于技术的,因此我将尝试为您提供详尽的解释。假设您的应用程序没有以前的翻译,则理想过程应该看起来像:
发送英文文件进行翻译。根据您与翻译承包商的协议,您可以使用:
- 您的默认属性文件(您将负责正确重命名它们)
- 卓越的电子表格包含钥匙,英语短语和一个空列用于翻译
- getText *.po file(s)如果要使用getText
- 翻译存储器文件(IE Trados *.tmx文件)
收到文件后,将这些翻译放入产品中,创建本地化构建并进行测试。当然,会有一些UI问题。其中一些您可以自己修复,有些则需要其他翻译(例如硬编码字符串),其他则需要缩短翻译。同样,您将聘请翻译承包商,并为他们提供需要(重新)翻译的字符串。您可以在此处使用电子表格(前提是没有太多需要翻译的字符串)。
如果您想同时运送(所有语言),则需要尽早吸引翻译人员。由于UI字符串会更改(前提是没有硬质量冻结期或翻译冻结期),您将不得不更新翻译。在这种情况下,您将需要使用需要翻译的字符串(用英语)提供已翻译的文件。如果更改真的很小,则只能手动发送英语字符串并合并翻译,否则最好使用某种翻译内存交换格式(getText *.po's or trados *.tmx在这里很棒)。
翻译文件通常不够。由于通常没有给定的上下文,并且不同的单词可能意味着目标语言中的不同事物,因此会发生翻译错误。除非您知道语言,否则无法知道他们在。这就是为什么您需要使用UI屏幕截图并将其发送出去进行审查(您的翻译承包商或其他人可以根据质量要求对其进行审查)。
一旦审查,您将需要应用翻译更改并测试UI问题...
就是这样,如果我们谈论UI字符串翻译过程。但是,请注意,还有很多要正确本地化应用程序(文档,帮助文件,图标,颜色,声音...)。
其他提示
要回答您的问题,我会选择(2)。
在实践中,我发现对我而言,使用其他东西而不是Java资源捆绑包,要容易得多。
我个人使用另一种处理此操作的方式。我使用getText方式(那里有一个名为getTextresource.java的文件,您必须在应用程序中使用该文件,以从GetText扩展中受益 - 请参阅 这里).
如果 您熟悉getText,您肯定会发现这种方法更容易和实用。您只需将翻译人员提供PO文件(可以编辑 Poedit)。从PO文件中,您可以创建您将在应用程序内使用的Java类(这是使用MSGFMT完成的 - 指定PO文件的Java汇编的参数)。使用XgetText命令(从命令行),可以简单地更新PO文件。
当然,一切都在 获取手册.
好处:
GetText为您提供了一种选择复数形式的方法[没有更多消息,例如:“ n file已删除”(其中n是一个数字) - 请参阅 ngetText.
一旦您的Java文件更新了新令牌,用于翻译字符串的脚本脚本方法
无需使用一些宏(例如Translate(Delete_button_macro))访问每个字符串。您只能像这样写代码:
package translateutil; import gnu.gettext.GettextResource; import java.util.ResourceBundle; import java.util.Locale; public class TranslateUtil { private static ResourceBundle myResources =null; public static boolean init(Locale loc, String resourceName) { boolean bRet = true; Locale.setDefault(loc); try { myResources = ResourceBundle.getBundle(resourceName); System.out.printf( _("Current language: %s\n"), Locale.getDefault().getDisplayName() ); System.out.printf( _("%s resource found\n"), myResources.getClass().getName() ); } catch(Exception e) { // let the application go on in English in case the ResourceBundle // was not found. Notify about the error bRet = false; System.out.println( e.toString() ); myResources = null; } return bRet; } public static String _(String str) { if (myResources == null) { return str; } { return GettextResource.gettext(myResources, str); } } public static String _Plural(String singular, String plural, long param) { if (myResources == null) { if (param == 1) { return singular; } else { return plural; } } else { return GettextResource.ngettext(myResources, singular, plural, param); } } }
这是一个样本
// example
// similar for plural
import static translateutil.TranslateUtil._;
System.out.println(_("The english text"));
无论您选择什么:祝您好运!