2012-04-08 57 views
2

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

  • 我将我在一些文本文件(S),每个“句”的翻译或短语都会有它独特的ID(整数)
  • 的应用程序,我会的启动遍历我应用中所有窗体上的所有控件(我想这应该在每个窗体的'Load'事件处理函数中完成),并且我将测试它的控件类型
  • 即,如果它是按钮或菜单项目,我会读它的默认'文字'属性,找到这个短语在一个文本文件中,读取它的唯一ID,并通过此ID将查找翻译短语在(其他)文本文件
  • 然后我将覆盖“文本”与翻译的短语控制的财产

这使我有短语每个语言单独的文本文件(易于维护的个人翻译未来 - 只有1个文本文件)

  1. 我想听听你的意见 - proffesionals如果有一些更好/更容易/更快/更'亲'的方式如何做到这一点。
  2. 什么格式的翻译文本文件我应该使用(纯文本,XML,ini ....) - 它应该是人类可读的。我不知道在XML中找到一个词组是否比使用纯文本文件逐行搜索给定短语/字符串更快?
  3. 编辑 - 我希望用户(社区)要能没有我的交互翻译我的应用程序为他们成他们的母语(这意味着微软的资源是退出游戏)

非常感谢你提前。

CLOSED - 我的解决办法: 看起来像我住在我原来的概念 - 每一个短语将在纯文本文件的单独行 - 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

+0

请注意,您可能需要调整标签的位置和按钮也取决于语言,因为与原始文本相比,某些翻译可能会非常长。 (翻译的标准方法已经迎合了) – Kuffs 2012-04-10 07:13:05

+0

是的,我知道。但为了我的目的,可以不时打开应用程序,切换到每种语言并检查外观。我只有几个表格。如果太长,我会编辑视觉并重新编译。这对我来说会比较少工作,比每次有人给我发新短语时重新编译。但无论如何感谢 - 非常好的一点! – Enriqe 2012-04-10 10:35:38

回答

1

如果您希望用户通过应用程序编辑的翻译却如此简单快捷,资源文件是最好的。如果你不喜欢它,第二个最好的选择是XML文件。

不过,要回答你如何用文本文件做到最好质疑,这是很简单的:你只要确保你的唯一标识符(int可能)是为了(使用该文件之前验证)。然后快速搜索,您使用半部分的技术。

你找数字X,所以你去文件的中间线。如果ID> X,去到文件4等

你一分为二,直到你到达行权。这是最快的知道研究方法。

注:当心的是外部的应用程序,但需要翻译的东西:数据库中包含的外部文件的项目,信息等

+0

嗯,对于没有编程知识的人(这意味着没有VisualStudio,没有高级文本编辑器),我不认为资源是简单快捷的解决方案。还是有一些简单的方法可以让人们编辑我缺少的资源?无论如何,感谢您的答案和'半'... – Enriqe 2012-04-09 10:43:03

+0

我试图找到一个简单的方法如何读取文件并从X行跳到Y行,但它看起来像C#没有任何lib支持这个?看起来像我将整个文件(10-20 kB)读入一个List obj然后处理它....或者?? – Enriqe 2012-04-10 05:46:23

3

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

+0

呃....那不是我想要的......我希望我的应用程序的用户为他们翻译它,因为我不会说所有的语言 - 如果人们用母语做它会更好。他们对编程和编码毫无头绪。我也没有时间将新的翻译过的短语添加到应用程序中,并且每次有人向我发送翻译更新时都会编译它。我愿意编写一些简单的代码来检查安装目录(在应用程序启动时),并且如果它找到了翻译文件(文件将以某个掩码命名),那么我的应用程序会自动将此语言包含在选项列表中。 – Enriqe 2012-04-08 21:22:58

3

听起来好像你有点投资于“单一文本文件”的想法,否则你可能会倾向于标准的方式并使用微软的资源文件。资源文件的处理是内置的,并且控件已经被键入以支持它。但是,正如您可能知道的那样,每个翻译都会放入自己的资源文件中。所以你留下了多个文件与您的应用程序分发。

使用自定义的自定义解决方案,您可以将其修剪为一个unicode文件。但是您必须通过控件循环来设置文本,然后查找每个文本。在添加控件类型时,您必须在代码中为它们添加支持。此外,随着您添加语言,您的文本文件将大量增加,因此您必须对此进行说明。

我还是稀的使用对资源文件,但你的说法暗示你已经不喜欢这样的解决方案,所以我不认为我已经改变了主意。

编辑:

既然你想从应用程序分离的解决方案,以避免重新编译,你可以发布的SQL CE数据库文件为每种语言类型。您可以将文本值存储在NVARCHAR字段中。

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

编辑2:

驾驶朝向的溶液。 :)

您可以使用一个简单的分隔文本文件,以Unicode编码,具有传统的基于命名系统。例如:

EN-US.txt

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

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

+0

我希望它成为每种语言的一个单独文件,我也在我的应用程序中使用了几个标准控件,但是关于MS资源 - 请检查我上面的评论(请在Justin的答案下) – Enriqe 2012-04-08 21:25:55

+1

已更新我的答案。 – mgnoonan 2012-04-08 22:40:46

+0

嗯...所以这意味着要编写另一个应用程序 - 供我的用户编辑翻译文本。 我认为我坚持原来的文本文件(至少现在是这样),这些文件很容易编辑,对我来说,编码比编写另一个应用程序要少。 现在的问题是 - 使用什么样的文本文件。为此,C#(库)提供了更好的支持,因此我可以更轻松,更快地编写代码。我不知道在XML中找到一个词组是否比使用纯文本文件逐行搜索给定短语/字符串更快? – Enriqe 2012-04-08 23:33:46