【问题标题】:Localization with string.Format使用 string.Format 进行本地化
【发布时间】:2024-01-14 12:55:01
【问题描述】:

目前我主要通过将键值对放入Resources.resw 文件来进行本地化。所以我想知道我应该如何本地化需要格式化的字符串或用不同的语言说出具有不同语法顺序的字符串。下面的例子可能更容易理解我的意思。

例如,正如 official document 中用于本地化的这部分所暗示的那样,一种语言的日期格式可以是

string.Format("Every {0} {1}", monthName, dayNumber);

其他用途

string.Format("Every {1} {0}", monthName, dayNumber);

在这种情况下,本地化这样一个字符串的最佳方法是什么?

事物/语法可能比这个例子复杂得多。 official document 中的建议对我来说并不好,因为日期可能无法预测。或者您可以枚举日期,但这需要大量工作。或者假设我们有一个接受用户输入的字符串,比如

 string.Format("Do you want to delete {name}?", name);

在另一种语言中,它可能具有这种语法顺序

string.Format("You want to delete {name} do?", name);

不可能按照文档中的示例对整个句子进行本地化。

我能想到的唯一避免这种情况的方法是不要输入用户输入......

【问题讨论】:

  • 我真的不明白你的问题。为什么不能使用字符串Do you want to delete {0}? 表示英语而Möchten Sie {0} entfernen? 表示德语?
  • @Dirk 我没有拒绝那个选项。我主要在Resources.resw 文件中进行本地化。我只是想知道这个问题是否仍然可以使用它来解决,或者我必须在 csharp 代码中解决。
  • 如果您想要一种更好的方法来指示哪种参数在哪个位置,您将不得不推出自己的解决方案。您可以根据需要使其简单(按原样使用 string.format)或复杂(处理复数和结尾差异,根据参数值替换单词等)。

标签: c# uwp


【解决方案1】:

如果您可以访问日期,您可以使用The Month ("M", "m") Format Specifier

来自文档:

DateTime date1 = new DateTime(2008, 4, 10, 6, 30, 0);
Console.WriteLine(date1.ToString("m", 
                  CultureInfo.CreateSpecificCulture("en-us")));
// Displays April 10                        
Console.WriteLine(date1.ToString("m", 
                  CultureInfo.CreateSpecificCulture("ms-MY")));
// Displays 10 April

string.Format("Do you want to delete {name}?", name);你可以

$"Do you want to delete the following user? '{name}'";

【讨论】:

  • string.Format 中使用没有任何格式参数的插值字符串看起来很奇怪。只需删除string.Format 问题是资源中的插值字符串 - 需要可本地化 - 不受支持。
  • 如果 name 包含花括号,最后一个会抛出异常,因为如果有人将他的名字输入为 {0} string.Format 会抛出,因为它需要一个参数 0。所以最后一个不是一个选项。
  • @ckuri 如果你声称var name = "{ckuri}";Console.WriteLine($"Do you want to delete the following user? '{name}'"); 会抛出,那你就错了。
  • 不,但如果你的名字是{0},它会。
  • 不,我认为不会。为什么会这样?
【解决方案2】:

我刚刚发现的一种方法是将这个键值对放入Resources.resw

密钥:RemoveText

值:Do you want to delete {0}?

在你得到本地化的字符串之后像做

var msg = Localize('RemoveText');

然后

var result = string.Format(msg, name)

可以给你预期的结果。

基本上,您需要在每种语言中适当地输入{0}。此解决方案的唯一缺陷是用户输入中不应允许{0}

如果您仍希望{0} 出现,您可以将{0} 更改为其他您认为太复杂且太长而用户无法输入的字符串,例如'{usersAreVeryUnlikelyToTypeInThisInTheirInputs}'。然后使用

msg.replace('{usersAreVeryUnlikelyToTypeInThisInTheirInputs}', name)

获取本地化字符串。

【讨论】:

    最近更新 更多