[英]Localization with string.Format
目前,我主要通過將鍵值對放入Resources.resw
文件來進行本地化。 所以我想知道我應該如何本地化需要格式化的字符串或用不同的語言說出具有不同語法順序的字符串。 通過下面的示例可能更容易理解我的意思。
例如,正如本地化官方文檔中的這部分所建議的那樣,一種語言可以具有以下日期格式
string.Format("Every {0} {1}", monthName, dayNumber);
而其他用途
string.Format("Every {1} {0}", monthName, dayNumber);
在這種情況下,本地化此類字符串的最佳方法是什么?
事物/語法可能比這個例子復雜得多。 官方文檔中的建議對我來說看起來不太好,因為日期可能無法預測。 或者您可以枚舉日期,但這需要大量工作。 或者假設我們有一個接受用戶輸入的字符串,比如
string.Format("Do you want to delete {name}?", name);
在另一種語言中,它可能具有這種語法順序
string.Format("You want to delete {name} do?", name);
不可能像文檔中所建議的那樣對整個句子進行本地化。
我能想到的避免情況的唯一方法是不要輸入用戶輸入....
如果您有權訪問日期,則可以使用The Month ("M", "m") 格式說明符
從文檔中:
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
for string.Format("Do you want to delete {name}?", name);
你可以
$"Do you want to delete the following user? '{name}'";
我剛剛發現的一種方法是將這個鍵值對放入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)
獲取本地化字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.