C#本地化

C#本地化,c#,localization,internationalization,C#,Localization,Internationalization,可能重复: 有没有人能分享一下大型C 35;应用程序的本地化步骤 我非常确信,在谈论中小型项目时,基本的基于资源的策略可能会起作用 然而,如果我们谈论大型产品,这种方法应该与定制构建步骤以及语言学家专门使用的一些第三方应用程序相结合 因此,您能否建议/分享一些在您的应用程序中使用的全球本地化策略(显然,足够大:) 谢谢。即使在大型企业应用程序中,基于资源的基本策略也有效。这是一个内置的、易于理解的解决方案,因此每个程序员都可以毫无问题地使用它 唯一的问题是,您需要以某种方式将资源文件转换为翻译

可能重复:

有没有人能分享一下大型
C 35;
应用程序的本地化步骤

我非常确信,在谈论中小型项目时,基本的基于资源的策略可能会起作用

然而,如果我们谈论大型产品,这种方法应该与定制构建步骤以及语言学家专门使用的一些第三方应用程序相结合

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


谢谢。

即使在大型企业应用程序中,基于资源的基本策略也有效。这是一个内置的、易于理解的解决方案,因此每个程序员都可以毫无问题地使用它

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

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

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

  • 处理您的可翻译资源并创建包含需要翻译的文件的transkits-zip归档文件(在本例中,似乎所有文件都需要翻译)。这些文件可能需要进行转换,这样您就不会发送resx文件了。转换应用程序应该读取resx文件的内容,并将可翻译字符串转换成与翻译人员商定的格式(它可以是简单的Excel,但我不推荐这种解决方案)。现在,我不能告诉你这些工具的名称,尽管我知道有些商业应用程序存在,因为我只使用过定制的

  • 将Transkit发送给翻译人员(最有可能是翻译供应商)

  • 在收到翻译后的文件(transkit)后,您需要对其进行验证(这一步至关重要)。您需要确保transkit完整(即不缺少可翻译字符串)且技术正确(即文件编码正确,通常为UTF-8或UTF-16)。另外,至少可以浏览一下文件,看看是否没有像1/2、3/4之类的奇怪字符——这通常意味着编码错误

  • 导入您的transkit。这是第2步的相反步骤-您需要将翻译后的字符串放回适当的文件中

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

  • 测试您的应用程序是否存在本地化问题(例如,控件重叠、剪切字符串、编码错误等-这通常意味着i18n没有正确执行)
  • 修复本地化/国际化(本地化)缺陷
  • 继续执行1,直到UI/字符串冻结期。这假设翻译人员将使用某种类型的翻译内存,并且不会为您重新翻译以前翻译的字符串收取(或更少)费用
  • 自动化所有可能的步骤并完成您的任务

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

    我认为您可以在很大程度上依赖.NET提供的资源框架,只需进行一些修改,使其更适合大型项目,即独立于应用程序构建和维护资源,并消除按名称引用每个资源的生成属性。如果有其他适合于大型项目本地化的目标,请在下面进行描述,这样我也可以考虑它们。
  • 创建一个独立的项目来表示可以作为单独DLL加载的资源
  • 通过选择“项目属性”的“资源”选项卡上的链接,将“资源”文件添加到项目中:“此项目不包含默认资源文件。请单击此处创建一个。”
  • 添加另一个具有相同根名称的资源以表示另一种语言,例如德语的“resource.de.resx”。(VisualStudio显然使用文件名来确定资源文件所代表的语言)。将其移动到与默认资源文件相同的目录/文件夹。(每种语言重复一次。)
  • 在Resources.resx文件的属性中,从自定义工具属性中删除“ResXFileCodeGenerator”,以防止在应用程序的“属性”命名空间中生成默认代码。(每种语言重复一次。)
  • 显式/手动声明您自己的资源管理器,该管理器使用以下行加载新创建的资源:

    静态System.Resources.ResourceManager resourceMan= 新System.Resources.ResourceManager( “LocalizeDemo.Properties.Resources”,typeof(Resources.Assembly)

  • 实现一个可以生成的文件,该文件包含您可以引用的所有资源的列表(参见图1)

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

  • 现在您已经有了足够的资源,可以从任意数量的应用程序中引用已翻译的字符串(参见图3)

  • 使用System.Resources.ResXResourceWriter(来自System.Windows.Forms.dll)或System.Resources.ResourceWriter(System.dll)生成资源,而不是将Resx文件作为主要源。在我们的项目中,我们有一个SQL数据库,它用每种语言定义所有字符串
    namespace MyResources
    {
       public enum StrId
       {
          Street
          ....
       }
    }
    
    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();
          }
       }
    }
    
    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));
          }
       }
    }