【问题标题】:Multilingual winforms application多语言winforms应用程序
【发布时间】:2012-04-08 20:35:34
【问题描述】:

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

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

这使我能够拥有单独的文本文件,其中包含每种语言的短语(将来易于维护单独的翻译 - 只有 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

【问题讨论】:

  • 请注意,您可能还需要根据语言调整标签和按钮的位置,因为与原始文本相比,某些翻译可能会非常长。 (标准的翻译方法已经满足了)
  • 是的,我知道。但出于我的目的,可以不时打开应用程序,切换到每种语言并检查外观。我只有几个表格。如果某些内容太长,我将编辑视觉对象并重新编译。这对我来说比每次有人向我发送新短语时都重新编译要少。但无论如何,谢谢 - 非常好!

标签: c# winforms forms multilingual


【解决方案1】:

Why not use Microsoft's resource file method?您无需通过这种方式编写任何复杂的自定义代码。

【讨论】:

  • 嗯....这不是我想要的...我希望我的应用程序的用户为他们翻译它,因为我不会说所有语言 - 如果人们这样做会更好他们的母语。他们对编程和编码一无所知。每次有用户向我发送翻译更新时,我也没有时间将新的翻译短语添加到应用程序并编译它。我愿意编写一些简单的代码来检查安装目录(在应用程序启动时),如果它找到翻译文件(文件将用一些掩码命名),那么我的应用程序将自动在选项列表中包含这种语言。
【解决方案2】:

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

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

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

编辑:

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

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

编辑 2:

寻求解决方案。 :)

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

en-US.txt

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

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

【讨论】:

  • 我希望它是每种语言的一个单独文件,我还在我的应用程序中使用了几个标准控件,但是关于 MS 资源 - 请检查我上面的评论(根据贾斯汀的回答)
  • 嗯...所以这意味着编写另一个应用程序 - 让我的用户编辑翻译文本。我认为我坚持使用易于编辑的原始文本文件(至少现在是这样),对我来说,与编写整个另一个应用程序相比,它的编码更少。现在的问题是 - 使用什么样的文本文件。 C#(库)对此有更好的支持,因此我可以更轻松、更快地进行编码。我不知道在 C# 中查找 XML 中的短语是否比在纯文本文件中逐行搜索给定的短语/字符串要快...?
  • 我不会使用 XML,因为这会导致用户自我编辑的学习曲线陡峭。也许只是一个简单的逗号分隔的 unicode 文件?
  • 感谢您的努力!看起来我停留在我原来的概念 - 每个短语都在单独的行中(ID 在行的开头)。但是没有表单或控件名称 - 写入文本文件对我来说是额外的工作,并且一些用户松散的人会意外地在控件名称中的某处按下键并且控件不会翻译的额外风险。我也在考虑删除 ID 并只使用行号,但它需要高级文本编辑器(记事本不显示行号),如果有人不小心点击“删除行”的快捷方式,整个应用程序会发疯:)
  • 再次感谢。我将 Mathieu 的答案标记为“已接受”,因为“减半”的想法,但我为您的支持投了赞成票。谢谢!
【解决方案3】:

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

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

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

您切入两段,直到找到正确的路线。这是最快的已知研究方法。

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

【讨论】:

  • 嗯,我不认为资源对于没有编程知识的人来说是简单快捷的解决方案(这意味着没有 VisualStudio,没有高级文本编辑器)。还是有一些简单的方法可以让人们编辑我缺少的资源?无论如何,感谢您的回答和“一半”...
  • 我试图找到一种简单的方法来读取文件并从 X 行跳转到 Y 行,但看起来 C# 没有任何支持这个的库?看起来我会将整个文件(10-20 kB)读入 List obj,然后对其进行处理......或者??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2012-03-21
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
相关资源
最近更新 更多