gpt4 book ai didi

c# - 在 PCL 中翻译字符串

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:22 25 4
gpt4 key购买 nike

我的项目中有一系列本地化文件。我当前的语言环境是 de-CH,但服务器的架构是英文的。

在我的 PCL 中,有没有办法将 de-CH 字符串转换为英文形式?

翻译在标准的 resx 文件中。

最佳答案

以下对我有用:

我在 en-US 文件夹中创建了一个带有英文资源文件的 PCL 项目:

<?xml version="1.0" encoding="utf-8"?>
<root>
...
<data name="GoodMorning" xml:space="preserve">
<value>Good morning!</value>
</data>
</root>

...和 ​​de-CH 文件夹中的瑞士资源文件:

<?xml version="1.0" encoding="utf-8"?>
<root>
...
<data name="GoodMorning" xml:space="preserve">
<value>Guten Morgen!</value>
</data>
</root>

这会生成两个可以直接使用的包装类,例如

string english = en_US.Resources.GoodMorning; // Returns "Good morning!"
string swiss = de_CH.Resources.GoodMorning; // Returns "Guten morgen!"

...这可能会回答您的问题。如果不是,ResourceManager.GetString 方法有一个重载,需要一个 CultureInfo;这也可能是一条可行的道路。

所有这些都假定您拥有资源 ID;如果您有瑞士字符串的,并想找到对应的英文字符串,事情就会变得有点复杂。当然,您可以使用的工具取决于您的 PCL 所针对的平台。


编辑:

给定瑞士字符串,您可以使用反射进行查找以获取属性值。为简单起见,这假设瑞士和英语资源完全相同——现实生活中的代码可能必须处理一种或两种语言中丢失的字符串:

public static string GetEnglishString(string swiss)
{
Type englishResources = typeof(en_US.Resources);
Type swissResources = typeof(de_CH.Resources);
PropertyInfo[] infos = swissResources.GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
foreach (PropertyInfo info in infos.Where(info => "Culture" != info.Name && "ResourceManager" != info.Name))
{
string value = info.GetValue(null, null) as string;
if (value == swiss)
{
PropertyInfo englishProperty = englishResources.GetProperty(
info.Name,
BindingFlags.NonPublic | BindingFlags.Static);
string english = englishProperty.GetValue(null, null) as string;
return english;
}
}

return null;
}

这需要 System.Reflection.TypeExtensions ,可通过 NuGet 获得。在现实生活中,只需执行一次此操作并设置瑞士到英语的 Dictionary。并祈祷瑞士字符串集不包含重复值。 :-)

关于c# - 在 PCL 中翻译字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35153631/

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