asp.net - resource - net core cultureinfo




單數和復數的ASP.NET本地化 (5)

沒有內置任何東西,我們最終編寫了這樣的代碼:另一個解決方案可以是:

在資源文件字符串中使用{CAR}之類的佔位符為“car”維護單數和復數單詞的單獨資源條目:CAR_SINGULAR car
CAR_PLURAL汽車

用這個邏輯開發一個類:

class MyResource
 {

    private List<string> literals = new List<string>();
    public MyResource() { literals.Add("{CAR}") }
    public static string GetLocalizedString(string key,bool isPlural)
    {
       string val = rm.GetString(key);
       if(isPlural)
       {
          val = ReplaceLiteralWithPlural(val);
       }
       else
       {
          val = ReplaceLiteralWithSingular(val);   
       }     
    }  
}

string ReplaceLiteralWithPlural(string val)
{
   StringBuilder text = new StringBuilder(val)
   foreach(string literal in literals)
   {
      text = text.Replace(literal,GetPluralKey(literal));
   }
}

string GetPluralKey(string literal)
{
  return literal + "_PLURAL";
}

我可以用ASP.NET資源/本地化翻譯字符串以簡單的方式依賴於一個或其他(英語語法),就像我在翻譯中傳遞數字1,它返回“你有一輛車”或0,2和更高,“你有%n輛車”?

或者我被迫在我看來有邏輯來看它是單數還是複數?


邏輯不需要在你的視圖中,但它肯定不在DotNet框架的資源模型中。 你是一個足夠簡單的情況,你可以逃脫創建一個簡單的格式字符串單數,一個複數。 “你有1輛車。”/“你有{0}輛車。” 然後你需要寫一個區分複數和單數情況的方法。

就我所知,沒有一種語言要求比單數/複數更複雜的語言,但是在表達“你有0輛汽車”相當於是不對的。 還有一些語言,在單數和復數之間沒有區別,但是這只需要在資源字符串中重複一點。 (編輯添加:性別,有時候結尾的變化取決於許多語言單位的數量,但只要區分單數和復數句子,而不僅僅是單詞)。

微軟大多放棄了語義上的巧妙本地化,因為很難將一些像多元化這樣的東西推廣到30多種語言。 這就是為什麼在大多數翻譯成多種語言的應用程序中,您可以看到如“無聊:{0}”這樣無聊的數字量。 這聽起來蹩腳,但令人驚訝的是,我最後一次檢查,可用性研究實際上並不贊成在大多數情況下冗長的自然語言表達。


moodforaday寫道:

這適用於所有情況,而不僅僅是數字。 例如,“%s被刪除”這樣的片段也是不可譯的,因為動詞的形式取決於名詞的性別,這在這裡是不可用的。 我能做的最好的波蘭語是相當於“已刪除:%s”,但我只能做到這一點,只要%s的佔位符包含在可翻譯的資源。 如果我所有的東西都被“刪除”了,而不知道指稱名詞,我只能大聲咒罵我的狗,最後我還是要產生垃圾語法。

我想在這裡指出的一點是,永遠不會包含名詞作為參數。 許多歐洲語言根據其性別來修飾名詞,而在德語的情況下,無論是主語,賓語還是間接賓語。 只需使用單獨的消息。 而不是“%s已被刪除”,為每個類型使用單獨的轉換字符串:“事務已被刪除”。 “用戶被刪除了。” 等等

這樣,每個字符串都可以正確翻譯。

處理不同語言的複數形式的解決方案可以在這裡找到: http : //www.gnu.org/software/gettext/manual/html_node/Plural-forms.html

雖然您不能在商業應用程序中使用上述軟件(它在GPL下涵蓋),但您可以使用相同的概念。 它們的複數形式表達式與.NET中的lambda表達式完美匹配。 涵蓋大量語言的複數形式表達式的數量是有限的。 您可以將特定的語言映射到一個lambda表達式,該表達式根據語言計算使用哪種複數形式。 然後,在.NET resx文件中查找適當的複數形式。


AFAIK,沒有什麼內置的框架來做到這一點..

以下是針對該問題的一個廣義解決方案的示例:

http://dotnetperls.com/plural


我一直在圖書館工作,協助應用程序的國際化。 它被稱為SmartFormat ,在GitHub上是開源的。

它包含許多語言的“語法數字”規則,根據語言環境確定正確的單數/複數形式。 在翻譯含有數量的單詞的短語時,指定多個表單,格式化程序根據這些規則選擇正確的表單。

例如:

var message = "There {0:is:are} {0} {0:item:items} remaining.";
var output = Smart.Format(culture, message, items.Count);

它與String.Format(...)語法非常相似,但是有很多很棒的功能,可以很容易地創建自然和語法正確的消息。

它還處理可能的性別特定格式,列表等等。





localization