【发布时间】:2010-09-21 05:07:16
【问题描述】:
因此,我们确信我们将把我们的产品推向国际,并最终需要将其国际化。在我们进行的过程中,您建议我们进行多少国际化?
我想换句话说,是否有任何国际化现在很容易但如果我们让代码库成熟可能会更糟,如果我们选择现在开始这样做不会让我们非常慢?
使用的技术:C#、WPF、WinForms
【问题讨论】:
标签: wpf winforms internationalization
因此,我们确信我们将把我们的产品推向国际,并最终需要将其国际化。在我们进行的过程中,您建议我们进行多少国际化?
我想换句话说,是否有任何国际化现在很容易但如果我们让代码库成熟可能会更糟,如果我们选择现在开始这样做不会让我们非常慢?
使用的技术:C#、WPF、WinForms
【问题讨论】:
标签: wpf winforms internationalization
现在就准备好,然后再将所有字符串写入代码库本身。
现在之后的一切都为时已晚。现在或永远不会!
确实,现在做好准备确实需要付出一些额外的努力,但不这样做最终会变得更加昂贵。
如果您不遵循以下链接中的所有指南,请至少注意摘要中的第 1,2 和 7 点,这些点现在做起来非常便宜,但根据我的经验,这会导致最痛苦。
查看这些指南,亲自了解为什么现在开始并准备好一切会更好。
一点提取物:
【讨论】:
恕我直言,声称“几年后”会发生某些事情,字面意思是“我们希望有一天”,真正的意思是“永远不会”。尽管我仍然会浏览各种教程以确保您不会犯任何可怕的错误。现在做正确的国际化支持将意味着未来的工作量更少,一旦你习惯了它,它不会对今天的生产力产生任何实际影响。但如果你可以用几年来衡量目标,也许现在根本不值得去做。
我参与过两个进行国际化的项目:一个 C# ASP.NET(在我加入项目之前就存在)应用程序和一个 PHP 应用程序(使用免费的国际化控件和我自己的管理应用程序自制的方法)。
您应该将所有文本(标签、按钮文本等)作为数据存储在数据库中。用键引用这些(我更喜欢使用前 4 个单词,大写,转换为下划线的空格和去除非字母数字),当你有重复时,在末尾附加一个数字。这种key方法的好处是程序员只要看key就对文本的内容有很强的理解。
编写一个实用程序来提取数据并构建您添加到项目中以进行编译的 .NET 资源文件。为每种语言创建一个单独的资源文件。在您的代码中,使用键指向正确的条目。
我会浏览有关该主题的 MS 文档: http://www.microsoft.com/globaldev/getwr/dotneti18n.mspx
要避免的一些基本事情:
【讨论】:
我将添加以 Unicode 格式存储和操作字符串数据(MS SQL 中的 NVARCHAR)。
【讨论】:
一些需要思考的问题...
你怎么能承受延迟你的应用程序的英文版的发货,以节省一点成本以后国际化?
如果你不能从快速发布英文版中获得现金流,你还会交易吗?
如果您没有快速从某些客户那里获得反馈,您将如何正确地设计 UI?
在将 UI 国际化之前,您会多久重写一次?
您的英语客户是否希望能够在 UI 中自定义字符串,例如并非每个人都以相同的想法称呼“装运单”。
由于国际化的很大一部分痛苦是确保您不会破坏英文版本,因此 UI 的自动化系统测试是更好的投资吗?
我认为我会一直做的唯一一件事是:“不要使用在运行时从连接的短语构建的复合字符串”,如果你这样做了,请不要传播那些通过许多方法构建单个字符串。
让你的 UI 自动调整大小(和布局)以适应标签的长度等,如果你能以低廉的成本做到这一点,那么多年来将为你节省大量时间。有许多适用于 Windows 窗体的 3rd 方控件集,可让您标记文本框等,而无需将标签作为单独的控件放置。
我刚开始国际化一个 WinForms 应用程序,我们希望大部分能够使用每个控件的“名称”作为查找键,而不必将大量移动到资源文件等中。这并不总是像你那么难一开始想……
【讨论】:
您可以使用 NGettext.Wpf(它可以从 NuGet 安装,是的,我是作者,但我是从其他答案中列出的挫败感中做出来的)。
托管在github repository,这是撰写本文时的入门部分:
NGettext.Wpf 旨在与依赖注入一起工作。您需要在应用程序的入口点调用以下内容:
NGettext.Wpf.CompositionRoot.Compose("ExampleDomainName");
"ExampleDomainName" 字符串是域名。这意味着当当前文化设置为 "da-DK" 时,翻译将从 "Locale\da-DK\LC_MESSAGES\ExampleDomainName.mo" 加载,相对于您的 WPF 应用程序运行的位置(您必须在应用程序中包含 .mo 文件并确保将它们复制到输出目录)。
现在您可以在 XAML 中执行类似的操作:
<Button CommandParameter="en-US"
Command="{StaticResource ChangeCultureCommand}"
Content="{wpf:Gettext English}" />
这展示了这个库的两个特性。最重要的是 Gettext 标记扩展,它将确保 Content 设置为相对于当前文化的“英语”翻译,并在当前文化更改时更新它。它演示的另一个功能是ChangeCultureCommand,它将当前文化更改为给定文化,在本例中为"en-US"。
我还强烈建议阅读 gettext 实用程序手册中的 Preparing Strings。
【讨论】:
国际化将使您的产品在其他国家/地区可用,这很容易并且应该从一开始就完成(这样全世界讲英语的人都可以使用您的软件),这 3 条规则将帮助您顺利到达那里:
本地化是将软件翻译成不同的语言,这既困难又昂贵,一个好的开始是永远不要硬编码字符串,永远不要用较小的字符串构建句子。
【讨论】:
如果您使用测试数据,请使用非英语(例如:俄语、波兰语、挪威语等)字符串。 编码在每个角落都可以看到它的小丑头。如果不在您自己的库中,则在外部库中。
我个人更喜欢俄语,因为虽然我不会说俄语(尽管我的名字来自于我),但它里面有外国字符,而且它比英语占用更多的空间,因此也会测试你的间距。
不知道这是否是特定于语言的东西,或者仅仅是因为我们的俄语翻译喜欢冗长的字符串。
【讨论】: