2

我希望我的 C# (winforms) 应用程序是多语言的。我的想法是:

  • 我会将我的翻译放在一些文本文件中,每个“句子”或短语都有唯一的 ID(整数)
  • 在应用程序启动时,我将遍历我的应用程序中所有表单上的所有控件(我想这应该在每个表单的“加载”事件处理程序中完成)并且我将测试它的类型的控制
  • 即,如果它是一个按钮或菜单项,我将读取它的默认“文本”属性,在一个文本文件中找到这个短语,读取它的唯一 ID,然后通过这个 ID 将翻译的短语定位在(其他)文本文件中
  • 然后我将用翻译的短语覆盖控件的“文本”属性

这使我能够拥有单独的文本文件,其中包含每种语言的短语(将来易于维护单独的翻译 - 只有 1 个 txt 文件)

  1. 如果有更好/更容易/更快/更“专业”的方法来实现这一点,我想听听你的意见。
  2. 我应该使用什么格式的翻译文本文件(纯文本、XML、ini ......) - 它应该是人类可读的。我不知道在 C# 中查找 XML 中的短语是否比在纯文本文件中逐行搜索给定的短语/字符串要快...?
  3. 编辑- 我希望用户(社区)能够在没有我的交互的情况下为他们将我的应用程序翻译成他们的母语(这意味着微软的资源已经退出了游戏)

非常感谢您提前。

已关闭 - 我的解决方案: 看起来我停留在我原来的概念上 - 每个短语都将位于纯文本文件的单独行中 - Unicode 编码(以及行开头的 ID)。我也在考虑删除 ID 并只使用行号,但它需要高级文本编辑器(记事本不显示行号),如果有人不小心点击了“删除行”的快捷方式并且没有注意到,整个应用程序会疯了 :)

//sample of my translation text file for one language
0001:Text of my first button
0002:Text of my first label
0003:MessageBox title text
...etc etc

4

3 回答 3

3

听起来您对“一个文本文件”的想法有些投入,否则您可能会倾向于标准方式并使用 Microsoft 的资源文件。资源文件的处理是内置的,并且控件已经被键入以支持它。但是,您可能知道,每个翻译都进入它自己的资源文件。因此,您需要处理多个文件以与您的应用程序一起分发。

使用自定义的、您自己的解决方案,您可能可以将其缩减为一个 unicode 文件。但是您必须循环通过控件来设置文本,然后查找每个控件的文本。添加控件类型时,您必须在代码中为它们添加支持。此外,当您添加语言时,您的文本文件会大量增长,因此您也必须考虑到这一点。

我仍然倾向于使用资源文件,但你的措辞表明你已经不喜欢那个解决方案,所以我认为我没有改变你的想法。

编辑:

由于您希望将解决方案与应用程序分开以避免重新编译,因此您可以为每种语言类型分发 SQL-CE 数据库文件。您可以将文本值存储在 NVARCHAR 字段中。

这将使您的查询更容易,但会提高自我编辑的要求。您必须为用户提供一种机制来添加他们自己的翻译文件以及编辑屏幕。

编辑2:

朝着解决方案前进。:)

您可以使用以 Unicode 编码的简单分隔文本文件和基于约定的命名系统。例如:

zh-CN.txt

FormName,ControlName,Text
"frmMain","btnSubmit","Save"
"frmMain","lblDescription","Description"

然后,您可以使用 CurrentUICulture 确定要加载哪个文本文件以进行本地化,如果找不到文件,则回退到 en-US。这让用户可以使用通用文本编辑器创建(也可以更改!)他们自己的本地化文件,而无需任何陡峭的学习曲线。

于 2012-04-08T20:57:36.047 回答
3

为什么不用微软的资源文件方法呢?您不需要以这种方式编写任何复杂的自定义代码。

于 2012-04-08T20:44:49.310 回答
1

如果您希望用户通过您的应用程序编辑翻译,同时保持简单快捷,资源文件是最好的。如果您不喜欢它,那么第二好的选择是 XML 文件。

不过,要回答您有关如何使用文本文件做到最好的问题,这非常简单:您只需确保您的唯一标识符(int可能)是有序的(在使用文件之前进行验证)。然后为了快速搜索,你使用了一半的技术。

您查找数字 X,因此您转到文件的中间行。如果 id > x,则转到文件的 ¼,等等。

你分成两部分,直到你到达正确的路线。这是最快的已知研究方法。

注意:注意应用程序外部但需要翻译的东西:外部文件项、数据库中包含的信息等。

于 2012-04-09T03:07:11.097 回答