gpt4 book ai didi

c# - 每种语言的 .NET 本地化项目结构子文件夹

转载 作者:行者123 更新时间:2023-11-30 12:41:56 24 4
gpt4 key购买 nike

我已经创建了一个新的 C# 类库项目,它将包含所有翻译的资源文件。我看到的示例具有扁平结构,每种语言都有一个巨大的资源文件,如下所示:

  • 消息.resx
  • Messages.fr-FR.resx

但是对于这个特定的项目,最好将资源文件分成逻辑组:

  • 系统消息.resx
  • 用户消息.resx
  • SystemMessages.fr-FR.resx
  • UserMessages.fr-FR.resx

当我们添加更多资源文件和更多翻译时,这会变得困惑,因此为每种语言设置子文件夹会更易于管理,例如

  • zh-CN\SystemMessages.resx
  • zh-CN\UserMessages.resx
  • fr-FR\SystemMessages.fr-FR.resx
  • fr-FR\UserMessages.fr-FR.resx

但是这样做会将语言代码添加到命名空间中,例如Translations.en-GB.SystemMessages.MyString 并且我假设因为 en-GB 现在位于资源管理器将不再能够找到 的命名空间中fr-FR 翻译。

如何根据语言代码将资源放入子文件夹?

最佳答案

假设您的项目如下所示:

enter image description here

您可以根据线程文化使用不同的 ResourceManager。
使用一个小的 T4 模板,您可以使其成为强类型的(迭代资源文件并为每个字符串创建一个属性)

using ConsoleApplication6.Translations.French;
using System;
using System.Resources;

namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SystemMessagesManager.GetString("Title"));
Console.ReadLine();
}

public static class SystemMessagesManager
{
static ResourceManager rsManager;
static SystemMessagesManager()
{
//Get the current manager based on the current Culture
if (Thread.CurrentThread.CurrentCulture.Name == "fr-FR")
rsManager = SystemMessagesFrench.ResourceManager;
else if (Thread.CurrentThread.CurrentCulture.Name == "el-GR")
rsManager = SystemMessagesGreek.ResourceManager;
else
rsManager = SystemMessagesEnglish.ResourceManager;
}
public static string GetString(string Key)
{
return rsManager.GetString(Key) ?? SystemMessagesEnglish.ResourceManager.GetString(Key);
}
}
}
}

关于T4模板,检查这个:
How to use a resx resource file in a T4 template
您可以在下面看到示例代码。
假设您的项目中有这个: enter image description here

使用下面的模板你可以自动生成类:

<#@ template debug="false" hostspecific="true" language="C#" #>

<#@ assembly name="System" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>

<#@ output extension=".cs" #>
using System.Resources;
using System.Threading;

namespace YourNameSpace
{
public static class SystemMessagesManager
{
static ResourceManager rsManager;
static SystemMessagesManager()
{
//Get the current manager based on the current Culture
if (Thread.CurrentThread.CurrentCulture.Name == "fr-FR")
rsManager = SystemMessagesFrench.ResourceManager;
else if (Thread.CurrentThread.CurrentCulture.Name == "el-GR")
rsManager = SystemMessagesGreek.ResourceManager;
else
rsManager = SystemMessagesEnglish.ResourceManager;
}
private static string GetString(string Key)
{
return rsManager.GetString(Key) ?? SystemMessagesEnglish.ResourceManager.GetString(Key);
}

<#
XmlDocument xml = new XmlDocument();
xml.Load(Host.ResolvePath(@"ResourceStrings.resx"));

foreach(string key in xml.SelectNodes("root/data").Cast<XmlNode>().Select(xn => xn.Attributes["name"].Value)){
#>
public static string <#= key #> { get { return GetString("<#=key#>"); } }
<# } #>
}
}

关于c# - 每种语言的 .NET 本地化项目结构子文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com