【问题标题】:C# localization [duplicate]C#本地化[重复]
【发布时间】:2011-07-10 00:40:56
【问题描述】:

可能重复:
C# localization , really confusing me

有人可以分享他们针对大型C# 应用程序的本地化步骤吗?

我很确定,在谈论中小型项目时,基于资源的基本策略可能会奏效。

但是,如果我们谈论大型产品,这种方法应该与自定义构建步骤和语言学家专门使用的一些第 3 方应用程序结合使用。

那么,您能否建议/分享一些在您的应用程序中使用的全球本地化策略(足够大,显然 :)

谢谢。

【问题讨论】:

  • @Kon 这不是重复的,因为我已经看到了与C# localization 相关的每个问题。人们谈论使用自定义构建步骤和简洁的操作来使本地化更加舒适。但是,他们只提到了它们,我希望看到一个完整的答案。
  • 当然,您需要的实际上是国际化(您需要先准备您的应用程序)。你可以想象它有been answered before...
  • 对不起,我一定误会了……请忽略我之前的评论。

标签: c# localization internationalization


【解决方案1】:

基于资源的基本策略甚至适用于大型企业应用程序。这是内置且易于理解的解决方案,因此每个程序员都可以毫无问题地使用它。

唯一的问题是,您需要以某种方式将资源文件转换为翻译记忆库文件(即 tmx)并返回 - 以便翻译人员可以使用他们的标准工具。

所以你需要的实际上是一个本地化过程。大型应用程序有什么不同吗?好吧,如果您设置正确的流程,它会扩展。现在进入过程。从我的角度来看,它应该是这样的:

  1. 将资源文件复制到适当的文件夹结构中(本地化工程师不应直接使用应用程序代码库)。适当的文件夹结构应该类似于:
    [项目名称]
    .
    .
    [中性] [德语] [日语] [法语]
    .
    .
    (每个文件夹都包含给定语言的可翻译资源,中性通常是英语)
    当然,您需要以某种方式将代码库转换为文件夹结构,但这可以自动化。

  2. 处理您的可翻译资源并创建翻译工具包 - 包含需要翻译的文件的 zip 档案(在这种情况下,它们似乎都是如此)。这些文件可能应该被转换,所以你最终不会发送 resx 文件。转换应用程序应该读取 resx 文件的内容,并将可翻译的字符串放入翻译人员同意的格式的文件中(可能只是 Excel,但我不推荐这种解决方案)。现在,我无法告诉您这些工具的名称,尽管我知道存在一些商业应用程序,因为我只使用过自定义应用程序。

  3. 将译文发送给翻译人员(最有可能是翻译供应商)。

  4. 收到翻译后的文件(transkit)后,需要进行验证(这一步很关键)。您需要确保 transkit 是完整的(即没有丢失可翻译的字符串)并且在技术上是正确的(即文件编码是正确的,通常是 UTF-8 或 UTF-16)。此外,至少可以看一下文件,看看是否没有奇怪的字符,如 1/2、3/4 或其他字符 - 这通常意味着编码损坏。

  5. 导入您的运输工具包。这是 2 的相反步骤 - 您需要将翻译后的字符串放回适当的文件。

  6. 将翻译后的文件复制回原始代码库并运行“本地化”构建。

  7. 测试您的应用程序是否存在本地化问题(即重叠控件、剪切字符串、错误编码等 - 这通常意味着 i18n 未正确完成)。
  8. 修复本地化/国际化(Localizability)缺陷。
  9. 继续执行 1 直到 UI/字符串冻结期。这假设翻译人员会使用某种翻译记忆库,并且不会因重新翻译之前翻译的字符串而向您收费(或减少收费)。
  10. 自动执行所有可能的步骤并完成。

除此之外,您可能不会建立通用术语表并对翻译的内容进行语言审查。

【讨论】:

    【解决方案2】:

    我认为您可以严重依赖 .NET 提供的资源框架,只需进行一些修改,使其更适合大型项目,即独立于应用程序构建和维护资源,并消除引用每个资源的生成属性资源名称。如果还有其他适合大型项目本地化的目标在下面没有解决,请描述它们,以便我也可以考虑它们。

    1. 创建一个独立项目来代表您的资源,该资源可以作为单独的 DLL 加载。
    2. 通过选择项目属性的“资源”选项卡上的链接,将“资源”文件添加到您的项目:“此项目不包含默认资源文件。单击此处创建一个。”
    3. 添加另一个具有相同根名称的资源以表示另一种语言,例如德语的“Resource.de.resx”。 (Visual Studio 显然使用文件名来确定资源文件所代表的语言)。将其移动到与默认资源文件相同的目录/文件夹。 (对每种语言重复。)
    4. 在 Resources.resx 文件的属性中,从自定义工具属性中删除“ResXFileCodeGenerator”,以防止在应用程序的“属性”命名空间中生成默认代码。 (对每种语言重复。)
    5. 显式/手动声明您自己的资源管理器,该管理器使用如下行加载新创建的资源:

      静态 System.Resources.ResourceManager resourceMan = 新的 System.Resources.ResourceManager( "LocalizeDemo.Properties.Resources", typeof(Resources).Assembly);

    6. 实现一个可以生成的文件,其中包含您可以参考的所有资源的列表(见图 1)

    7. 实现一个函数来检索和格式化字符串(见图 2)。

    8. 现在您有足够的能力来引用来自任意数量的应用程序的翻译字符串(参见图 3)。

    9. 使用 System.Resources.ResXResourceWriter(来自 System.Windows.Forms.dll)或 System.Resources.ResourceWriter (System.dll) 来生成资源,而不是让 Resx 文件成为您的主要来源。在我们的项目中,我们有一个 SQL 数据库,它定义了每种语言的所有字符串,并且我们的构建过程的一部分会在构建资源项目之前生成所有 Resx 文件。

    10. 现在您可以从任何格式生成 Resx 文件,您可以使用任何您想要的格式(在我们的例子中是 SQL 数据库,我们从 Excel 电子表格导出和导入)来提供要发送到的文件译者。

    11. 另请注意,已翻译资源正在构建为附属 DLL。可以想象,您可以使用正确的命令行工具独立构建每种语言。如果这是您问题的一部分(如何做到这一点),请告诉我。但目前,我假设您已经了解了这一点,因为您已经提到了自定义构建步骤。

    图 1 - 枚举标识所有可用资源:

    namespace MyResources
    {
       public enum StrId
       {
          Street
          ....
       }
    }
    

    图 2 - 加载和返回格式化资源字符串的代码:

    namespace MyResources
    {
       public class Resources
       {
          static System.Resources.ResourceManager resourceMan =
             new System.Resources.ResourceManager("MyResources.Properties.Resources",
             typeof(Resources).Assembly);
    
          public static string GetString(StrId name,
             System.Globalization.CultureInfo culture = null, params string[] substitutions)
          {
             if (culture == null) culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
             string format = resourceMan.GetString(name.ToString(), culture);
             if (format != null)
             {
                return string.Format(format, substitutions);
             }
             return name.ToString();
          }
       }
    }
    

    图 3 - 访问资源:

    using MyResources;
    
    namespace LocalizationDemo
    {
       class Program
       {
          static void Main(string[] args)
          {
             System.Threading.Thread.CurrentThread.CurrentUICulture =
                new System.Globalization.CultureInfo("de-DE");
             Console.WriteLine(Resources.GetString(StrId.Street));
          }
       }
    }
    

    【讨论】:

    • 请注意,我们的项目不会本地化任何 Windows 窗体,因为我们使用了不与 .NET 本地化集成的第 3 方 UI API。如果您希望 .NET 自动本地化您的 Windows 窗体,而不是手动将字符串从资源文件加载到控件中,您将需要在这里做一些我没有做过的额外探索。
    • 我做了一个测试,似乎可以将来自各种 Form.xx.resx 文件的所有翻译资源合并到主 Resource.xx.resx 文件中,但这确实涉及覆盖一些生成的代码,如果您的表单不在资源 DLL 中。
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多