所以,我为我的应用程序设置了一个小翻译系统,我们生成一个标记为可翻译的所有字符串的列表,将其转储为CSV作为翻译模板,然后翻译填写下一栏有翻译。
我试图解决的问题是如何从代码库中提取一堆标记的字符串,以自动生成翻译模板。
c#代码的示例行类似于:
textBoxName.Text = string.Format(Translate.tr("Create {0}"), NextAutoName());
c ++看起来像:
info_out << tr( L"Grip weights range from {0} to {1}" )(low_weight)(high_weight) << endl;
在c ++方面,为模板生成构建字符串列表使用c ++解析器(请参阅my previous question),该解析器作为项目中所有c ++代码的外部构建的一部分运行。基本上,自动提取放置在tr()调用中的任何字符串。
使用c#有比使用另一个解析器更好的解决方案吗?我想要一个在编译时生成的字符串列表,或者我可以在运行时访问的字符串列表。 List<string>
会很棒。
我想保持相同的翻译文件格式,因为这样可以更加简单地协调双方。正如您所期望的那样,我们重用了很多字符串。
现在,在c ++中更方便的是保持翻译模板的最新状态 - 我只需要确保我想要翻译的字符串包含在tr()中,解析器处理其余部分。在c#中,我目前手动检查所有字符串,并使用新字符串更新c ++端的虚函数。我接近崩溃,只是写另一个解析器。我希望c#具有高级功能,可以在这里做得更好。
答案 0 :(得分:1)
我做了类似的事情(我只是提取了一个字符串常量列表)并且我对C#和C ++使用了相同的解析器。虽然它比解析器更有词法分析器,因为这两种语言具有非常相似的词法结构。
获得字符串列表后,可以将其写入C#源文件并将其编译到程序中。您的代码将生成如下文件:
namespace MyProject
{
class MyStrings
{
public string[] Strings = {
"pony",
"cob",
"stallion"
};
}
}
然后,您可以在项目中包含此文件,以便您的代码可以访问其字符串列表。
如果您将工具作为预构建事件运行,它将作为构建的一部分发生。
然而,正如汉斯所说,你可能会更好地看看内置的本地化支持。
答案 1 :(得分:1)
我有一个实际上做同样事情的项目。只有翻译解析器本身是用C#编写的(它的名字是c3po)。除了解析项目之外,c3po还负责生成要发送给翻译供应商的文件,以及生成.net项目用于存储翻译字符串的文件。我们发现它比“传统的”.Net资源文件有几个优点:
1)因为c3po维护着它自己的本地化字符串内部数据库,我们可以跟踪我们自己的翻译记忆库,并确保每个月只向翻译人员发送新的字符串。它还会删除不再需要的字符串。这为我们的文学节省了数千美元的翻译费用。
2)开发人员可以随意编写他们想要的任何字符串,无论他们想要什么,他们都不必担心资源文件。
3)c3po同时为几个不同的项目提供服务,简化了我们与翻译供应商的互动。
4)我们可以通过我们的CI服务器自动化c3po,所以每次开发人员办理登机手续时(或者每晚一次或其他什么)我们都可以完成所有任务,包括向翻译人员发送文件,选择新的短语,等。