为多个平台创建翻译文件的最佳实践

时间:2013-03-12 15:43:04

标签: android ios html5 blackberry cross-platform

我们目前面临的问题是为多个平台(iOS,Android,HTML5,BlackBerry ...)的应用创建和托管翻译。是否有任何最佳实践来托管翻译并动态创建所需的翻译文件(en.lproj / Localizable.string,values-fr / strings.xml,...)?

我考虑将翻译及其密钥托管在Google Docs(或其他平台)的桌面上,并将数据导出到csv,而不是使用脚本来创建文件。

我在网上搜索但到目前为止找不到好的起点。

6 个答案:

答案 0 :(得分:4)

您可以尝试使用LocoShuttle作为跨平台本地化工具。

答案 1 :(得分:3)

您知道Transifex吗?

Transifex是一个现代化的开源本地化平台。它是一个自动化复杂国际项目翻译工作流程的网络系统。

答案 2 :(得分:2)

我们成功地将PhraseApp用于多个平台。他们有一个API,所以我们可以在项目树中提供shell脚本,用快速命令更新翻译。您甚至可以将其作为构建步骤。

请注意,由于不同的本地化平台具有不同的功能集,因此这些服务似乎存在一些难以管理的障碍。例如,Android支持iOS不是IIRC的复数。

答案 3 :(得分:1)

http://www.getlocalization.com/

如果您愿意公开发布和分享您的个人字符串及其翻译,则免费。

答案 4 :(得分:1)

我用英语和日语制作应用程序。我所做的是将两个翻译存储在我可以在应用程序中的任何位置访问的文件中,即全局变量,实例,单例或您感觉舒适的内容。
制作内部所需的所有翻译,因为计算机翻译人员不会说得恰到好处。 然后你在哪里使用它们根据一个表示英语或日语的布尔值从列表中拉出它。

答案 5 :(得分:1)

可以满足您要求的开源在线(可部署到您选择的服务器)翻译工具Pootle,它建立在Translate Toolkit之上。我使用Pootle作为LibreCAD的翻译。您可以浏览LibreCAD's Translation Server并查看其实际操作。 LibreCAD使用Qt作为其基础框架,Pootle处理上传和下载TS文件,这些文件用于Qt中的翻译。使用Transifex之后,我可以告诉你,Pootle并不那么花哨(你可能会看到这个,虽然请记住LibreCAD的翻译服务器使用旧版本的Pootle),但它是一点也不差。您应该确定应用程序翻译所需的文件可以从您的翻译服务器导出(并可能导入)。您可以使用网络浏览器进行翻译,也可以离线翻译,然后继续上传已编辑的文件并批量应用所有已更改的翻译。另一种基于网络的翻译工具似乎提供了一种类似但比Pootle更为现代的方法(看起来更好,并且具有严格的版本控制集成),同时基于Translate Toolkit,是Weblate。这也是开源的,可以部署到您选择的服务器上。

为了提供更多见解,如果查看Translation Related File Formats,您将更好地了解Pootle和Translate Toolkit能够导出/导入的内容。从该列表和我的翻译经验中,我可以告诉您INI文件用于Joomla!核心和扩展中的翻译,PHP翻译数组用于Yii应用程序中的翻译,以及Qt Linguist TS文件如前所述,用于Qt应用程序中的翻译。我还尝试了GNU gettext,这是Free Software Foundation库为本地化所认可的。 GNU gettext使用PO文件进行翻译,可以通过Translate Toolkit处理。

所有本地化方法背后的核心理念,无论平台是什么,都或多或少相同。您可以设计具有特定主要语言的代码,并在代码中使用此语言。英语将是理想的选择,但这不是必需的。你应该选择一种所有开发人员都可以使用的语言,这种语言不会减慢开发速度(同时为按钮寻找几个标签,你不想只考虑一个标签几分钟),以及一种语言。您的主要目标受众使用,仅在主要目标受众存在且同时考虑使用其他语言进行开发时,可能会使应用程序在被转换为主要目标后感觉不自然观众的语言。这也是所有翻译人员将接收源语言字符串(因此作为参考点)的语言,以便翻译成所有其他目标语言。您可能不得不妥协,因为我们正在讨论一种且只有一种语言可供开发。继续,在开发过程中,您需要在代码中插入语言字符串,不要直接插入,而是将其包含在由您使用的本地化平台指定的特殊函数调用中。例如,在Qt应用程序中,您可以编写QLabel *label = new QLabel("Password:");而不是QLabel *label = new QLabel(tr("Password:"));。在执行应用程序期间,在tr函数调用内确定用户语言,浏览用户语言的相应语言文件,并检索对应于用户语言的"Password:"的翻译消息并用作标签。语言确定/定义是一种单独的机制,它基本上获取/设置一个全局/静态变量,在上面的例子中调用tr函数时查找该变量。每个平台可以特别处理的是复数形式(基于某些参数的条件转换)。例如,在Yii中,您可以将'n==1#one book|n>1#many books'作为翻译字符串。在您的应用程序中,您将使用Yii::t('app', 'n==1#one book|n>1#many books', 1);,即您还将提供实际数字作为参数,以便可以使用正确的表单(翻译函数中使用的'app'参数指的是特定的名为app的翻译类别,因为在每种语言下,您可以为应用程序的某些部分使用不同的翻译类别。)

要添加一些最终见解,使用通用后端进行翻译将允许您在从一个框架迁移到另一个框架时重复使用绝大多数已翻译的字符串,或者即使存在多个不同的实现同一个申请,例如基于浏览器的应用程序与本机应用程序一起存在。由于实际上是特定于平台的,因此复数形式需要对同一语言字符串进行特殊处理和单独翻译(但是,如果需要,可以通过将条件从翻译字符串域移动到代码域来消除大多数复数形式)。但是应用程序中的绝大多数翻译都是一个字符串到另一个字符串的直接映射。一些框架,如Qt,具有扫描源文件和根据特殊翻译功能(Qt中的tr)的新用途更新翻译文件的工具。如果您选择的框架存在此类工具,则无需手动将转换映射添加到转换文件。扫描源文件后,映射将出现在翻译文件中,默认为原始字符串作为其翻译并等待翻译后的字符串替换它。在提交方法之前调查可能的工作流程。