关于使用Java ResourceBundles提供多种语言的UI,有很多教程的负载。但是,有一个 过程 关于与翻译公司的典型互动问题,我似乎找不到答案。

例如,假设我不认识法语,并且需要雇用翻译公司来获取我的应用程序的翻译,我会寄给他们

  1. 默认资源属性文件“ whywhen_en_us.properties”,包括密钥和英语值,然后恢复“ whywhen_fr_fr.properties”?
  2. 带有空值的“ whywhe_fr_fr.properties”和“ whate_en_us.properties”供参考?
  3. 其他组合?
有帮助吗?

解决方案

由于您的问题是关于一个过程,而不是关于技术的,因此我将尝试为您提供详尽的解释。假设您的应用程序没有以前的翻译,则理想过程应该看起来像:

  1. 发送英文文件进行翻译。根据您与翻译承包商的协议,您可以使用:

    • 您的默认属性文件(您将负责正确重命名它们)
    • 卓越的电子表格包含钥匙,英语短语和一个空列用于翻译
    • getText *.po file(s)如果要使用getText
    • 翻译存储器文件(IE Trados *.tmx文件)
  2. 收到文件后,将这些翻译放入产品中,创建本地化构建并进行测试。当然,会有一些UI问题。其中一些您可以自己修复,有些则需要其他翻译(例如硬编码字符串),其他则需要缩短翻译。同样,您将聘请翻译承包商,并为他们提供需要(重新)翻译的字符串。您可以在此处使用电子表格(前提是没有太多需要翻译的字符串)。

  3. 如果您想同时运送(所有语言),则需要尽早吸引翻译人员。由于UI字符串会更改(前提是没有硬质量冻结期或翻译冻结期),您将不得不更新翻译。在这种情况下,您将需要使用需要翻译的字符串(用英语)提供已翻译的文件。如果更改真的很小,则只能手动发送英语字符串并合并翻译,否则最好使用某种翻译内存交换格式(getText *.po's or trados *.tmx在这里很棒)。

  4. 翻译文件通常不够。由于通常没有给定的上下文,并且不同的单词可能意味着目标语言中的不同事物,因此会发生翻译错误。除非您知道语言,否则无法知道他们在。这就是为什么您需要使用UI屏幕截图并将其发送出去进行审查(您的翻译承包商或其他人可以根据质量要求对其进行审查)。

  5. 一旦审查,您将需要应用翻译更改并测试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"));

无论您选择什么:祝您好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top