字本地化核心接口 INumberToWordsConverter 完全解析:從方法簽名到多語言實現(xiàn))
開發(fā)工具【免費下載鏈接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities項目地址https://gitcode.com/gh_mirrors/hu/Humanizer點擊查看免費下載Humanizer.Localisation.NumberToWords命名空間承載著 Humanizer 中“把數(shù)字變成當(dāng)?shù)卣Z言單詞”這一核心能力的抽象層。本文將以該命名空間唯一公開接口INumberToWordsConverter為主線完整梳理其方法簽名、參數(shù)語義、擴(kuò)展方法調(diào)用鏈、注冊表配置機(jī)制并結(jié)合倉庫內(nèi) 40 個具體轉(zhuǎn)換器實現(xiàn)與測試用例說明如何將該能力本地化到任意語言。讀完本文你將能夠理解ToWords/ToOrdinalWords/ToTuple等擴(kuò)展方法背后的完整執(zhí)行路徑并掌握接入自定義語言轉(zhuǎn)換器的全部接口契約。命名空間概覽面向數(shù)字本地化的唯一公開接口在 version-2.11.10 的 API 文檔中該命名空間下僅列出一個公開接口接口說明INumberToWordsConverter需要實現(xiàn)以本地化ToWords和ToOrdinalWords方法的接口這意味著Humanizer 將“數(shù)字 → 單詞”的規(guī)則完全抽象為單一契約所有語言的轉(zhuǎn)換器英文、中文、俄語、印度語、希伯來語等都通過實現(xiàn)該接口接入系統(tǒng)而面向用戶的擴(kuò)展方法如123.ToWords()只與該接口打交道不感知具體語言實現(xiàn)。接口的完整定義位于 src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs其 XML 注釋概括了職責(zé)“將數(shù)字轉(zhuǎn)換為區(qū)域相關(guān)的單詞、序數(shù)詞與元組名稱”Converts numbers into locale-specific words, ordinals, and tuple names。接口方法全景基數(shù)詞、序數(shù)詞與元組轉(zhuǎn)換2.11.10 版本的接口文檔Humanizer.Localisation.NumberToWords.INumberToWordsConverter.md定義了 5 個方法而當(dāng)前倉庫源碼中的接口已擴(kuò)展為 10 個重載覆蓋了基數(shù)詞、序數(shù)詞和元組三類轉(zhuǎn)換能力。以下以當(dāng)前源碼為準(zhǔn)并標(biāo)注與舊版文檔的對應(yīng)關(guān)系?;鶖?shù)詞轉(zhuǎn)換Convert(long) 系列string Convert(long number);說明使用區(qū)域默認(rèn)的語法性別grammatical gender將數(shù)字轉(zhuǎn)換為字符串。參數(shù)numberSystem.Int64。返回System.String本地化的基數(shù)詞。string Convert(long number, bool addAnd);說明使用區(qū)域默認(rèn)語法性別并決定是否在復(fù)合數(shù)字中插入?yún)^(qū)域特定的連接詞conjunction。參數(shù)addAndSystem.Boolean指定是否添加 And。string Convert(long number, GrammaticalGender gender, bool addAnd true);說明使用指定的語法性別進(jìn)行轉(zhuǎn)換addAnd默認(rèn)值為true。參數(shù)genderGrammaticalGender在區(qū)域區(qū)分性別形式時使用。當(dāng)前源碼在此基礎(chǔ)上新增了三個重載用于組合WordForm詞形與上述選項string Convert(long number, WordForm wordForm); string Convert(long number, bool addAnd, WordForm wordForm); string Convert(long number, WordForm wordForm, GrammaticalGender gender, bool addAnd true);這些重載解決的是同一語言內(nèi)“同一數(shù)字在不同句法位置存在不同拼寫”的問題例如西班牙語中21在句尾寫veintiuno在名詞前修飾時寫veintiún詳見下文WordForm一節(jié)。序數(shù)詞轉(zhuǎn)換ConvertToOrdinal(int) 系列string ConvertToOrdinal(int number);說明使用區(qū)域默認(rèn)語法性別將數(shù)字轉(zhuǎn)換為序數(shù)詞字符串。注意參數(shù)類型是System.Int32與基數(shù)詞的long不同。string ConvertToOrdinal(int number, GrammaticalGender gender);說明使用指定的語法性別轉(zhuǎn)換序數(shù)詞。當(dāng)前源碼又補(bǔ)充了帶WordForm的兩個重載string ConvertToOrdinal(int number, WordForm wordForm); string ConvertToOrdinal(int number, GrammaticalGender gender, WordForm wordForm);序數(shù)詞轉(zhuǎn)換的價值在于輸出如first、primero西語“第一”這類詞形與Ordinalize輸出1st這類后綴式序數(shù)化是兩條不同的路徑。元組名稱轉(zhuǎn)換ConvertToTuple(int)string ConvertToTuple(int number);說明將整數(shù)轉(zhuǎn)換為區(qū)域特定的命名元組如英文的single、double當(dāng)區(qū)域未定義對應(yīng)名稱時返回數(shù)字回退形式。這是1.ToTuple()擴(kuò)展方法的底層實現(xiàn)入口。關(guān)鍵參數(shù)類型語法性別與詞形要正確使用接口需要理解兩個參數(shù)枚舉GrammaticalGendersrc/Humanizer/GrammaticalGender.cs取值Masculine陽性、Feminine陰性、Neuter中性。俄語、希伯來語、葡萄牙語等語言中數(shù)字會隨性別變形例如俄語1的陽性為один、陰性為одна巴西葡萄牙語1.ToOrdinalWords(GrammaticalGender.Masculine)輸出primeiro陰性輸出primeira。WordFormsrc/Humanizer/WordForm.cs取值Normal正常詞形、Abbreviation縮略詞形、Eifeler盧森堡語 Eifeler 規(guī)則詞形依據(jù)后隨輔音/元音決定是否省音。西班牙語是典型場景21.ToWords(WordForm.Normal)→veintiuno而21.ToWords(WordForm.Abbreviation)→veintiún序數(shù)詞同樣適用如3.ToOrdinalWords(WordForm.Normal)→tercero3.ToOrdinalWords(WordForm.Abbreviation)→tercer。擴(kuò)展方法調(diào)用鏈從 ToWords 到接口用戶日常使用的并不是接口方法而是 src/Humanizer/NumberToWordsExtension.cs 中的一組擴(kuò)展方法。它們的共同特征是全部委托給Configurator.GetNumberToWordsConverter(culture)解析出的轉(zhuǎn)換器實例。典型調(diào)用鏈如下public static string ToWords(this long number, CultureInfo? culture null, bool addAnd true) Configurator.GetNumberToWordsConverter(culture).Convert(number, addAnd);即123.ToWords()→Configurator.GetNumberToWordsConverter(null)→INumberToWordsConverter.Convert(123, true)。其他重載依此類推ToOrdinalWords(this int, ...)→ConvertToOrdinal(...)其中1.ToOrdinalWords()還帶有特殊處理對丹麥語f?rste、印尼語/馬來語pertama、斯洛伐克語按性別返回prvy/prvá/prvé、祖魯語okokuqala等文化直接返回原生“第一”詞見擴(kuò)展方法內(nèi)部的TryGetNativeFirstOrdinalWordToTuple(this int, CultureInfo?)→ConvertToTuple(number)ToIndianWords(this long, IndianScaleStyle)則繞開當(dāng)前文化配置強(qiáng)制解析en-IN轉(zhuǎn)換器并按NamedScales印度命名刻度或CroreBased基于 crore 的口語表達(dá)如lakh crore、shankh兩套刻度表轉(zhuǎn)換。culture參數(shù)為null時使用當(dāng)前線程文化顯式傳入CultureInfo即可實現(xiàn)跨文化轉(zhuǎn)換這正是本地化測試的基礎(chǔ)。注冊表與配置轉(zhuǎn)換器如何被解析接口實例由 src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs 管理class NumberToWordsConverterRegistry : LocaliserRegistryINumberToWordsConverter { public NumberToWordsConverterRegistry() : base(_ NumberToWordsProfileCatalog.Resolve(en, CultureInfo.InvariantCulture)) NumberToWordsConverterRegistryRegistrations.Register(this); }兩點值得注意默認(rèn)回退到英文當(dāng)某個文化沒有注冊專用轉(zhuǎn)換器時ResolveForCulture會落到基類默認(rèn)工廠即解析en不區(qū)分區(qū)域性的轉(zhuǎn)換器保證任何文化下ToWords都不會拋異常注冊表由源生成器填充NumberToWordsConverterRegistryRegistrations與NumberToWordsProfileCatalog均來自 src/Humanizer.SourceGenerators 根據(jù) Locales 目錄下的 YAML 數(shù)據(jù) 生成的代碼因此新增語言只需提供 YAML 數(shù)據(jù)與轉(zhuǎn)換器實現(xiàn)即可自動納入注冊。對外暴露的入口在 src/Humanizer/Configuration/Configurator.cspublic static LocaliserRegistryINumberToWordsConverter NumberToWordsConverters { get; } new NumberToWordsConverterRegistry();內(nèi)部通過GetNumberToWordsConverter(CultureInfo?)完成按文化的解析。LocaliserRegistry的語義是優(yōu)先查找完全匹配的CultureInfo匹配失敗時逐級向上回退如zh-CN→zh→ 默認(rèn)英文。默認(rèn)回退實現(xiàn)與 40 個語言轉(zhuǎn)換器當(dāng)區(qū)域確實沒有專用轉(zhuǎn)換器時src/Humanizer/Localisation/NumberToWords/DefaultNumberToWordsConverter.cs 承擔(dān)兜底職責(zé)它直接調(diào)用number.ToString(culture)即輸出文化感知的數(shù)字格式化字符串而非單詞——例如123.ToString(fr-FR)得到123。這是一個刻意保持最小化的實現(xiàn)正如其注釋所述“僅在區(qū)域未提供專用數(shù)字轉(zhuǎn)單詞渲染器時使用”。在 src/Humanizer/Localisation/NumberToWords 目錄下實際存在約 40 個具體轉(zhuǎn)換器實現(xiàn)從文件名即可窺見多語言形態(tài)的工程分治語言專屬MacedonianNumberToWordsConverter、IndianGroupingNumberToWordsConverter含IndianGroupingGenderedNumberToWordsConverter體現(xiàn)印度 3-2-2 分組法詞形變化GenderedNumberToWordsConverter性別化基類、GenderlessNumberToWordsConverter無性別基類、EastSlavicNumberToWordsConverter東斯拉夫語族、WestSlavicGenderedNumberToWordsConverter、SouthSlavicCardinalNumberToWordsConverter結(jié)構(gòu)策略TriadScaleNumberToWordsConverter三位一組、JoinedScaleNumberToWordsConverter、ConjunctionalScaleNumberToWordsConverter、ConjoinedGenderedScaleNumberToWordsConverter支持and連接詞且區(qū)分性別的復(fù)合刻度、LinkedVigesimalNumberToWordsConverter二十進(jìn)制序數(shù)策略HyphenatedOrdinalNumberToWordsConverter連字符序數(shù)、StemmedScaleNumberToWordsConverter詞干變化、TerminalOrdinalScaleNumberToWordsConverter、LongScaleStemOrdinalNumberToWordsConverter等??梢酝茢噙@些類構(gòu)成了一個“基類抽取共性 子類定制差異”的繼承體系例如GenderlessNumberToWordsConverter提供Convert(long, GrammaticalGender, bool)的默認(rèn)轉(zhuǎn)發(fā)實現(xiàn)性別化語言的子類再覆蓋性別分支。這種設(shè)計讓每種語言只需實現(xiàn)自己獨特的語法片段而將三位分組、刻度表、連接詞等通用邏輯收斂到各抽象基類中。測試與契約驗證倉庫測試從多個角度鎖定該接口的行為tests/Humanizer.Tests/Localisation/LocaleTheoryMatrixCompletenessTests.cs 斷言每個已注冊區(qū)域都至少有一個INumberToWordsConverter可用回退到英文也算滿足防止語言矩陣出現(xiàn)“漏注冊”tests/Humanizer.Tests/Localisation/NumberWordPhraseTests.cs 直接調(diào)用Configurator.NumberToWordsConverters.ResolveForCulture(...)并按區(qū)域斷言輸出tests/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.Approve_Public_Api.*.verified.txt 通過 API 快照確認(rèn)INumberToWordsConverter的公開簽名、Configurator.NumberToWordsConverters屬性以及ToTuple/ToIndianWords等擴(kuò)展方法在各目標(biāo)框架.NET 8、.NET 10/11、.NET Framework 4.8下保持一致tests/Humanizer.Tests/Localisation/ur/UrduOrdinalTests.cs 專門驗證烏爾都語經(jīng)由該接口路徑輸出的帶性別序數(shù)詞一致性。這些測試共同保證只要實現(xiàn)接口并注冊ToWords/ToOrdinalWords/ToTuple就能被所有上層調(diào)用方透明使用。小結(jié)Humanizer.Localisation.NumberToWords是 Humanizer 本地化能力的樞紐之一INumberToWordsConverter以 10 個重載定義了基數(shù)詞、序數(shù)詞、元組三類轉(zhuǎn)換契約NumberToWordsExtension將契約包裝為對開發(fā)者友好的擴(kuò)展方法NumberToWordsConverterRegistry與Configurator.NumberToWordsConverters提供按文化解析與英文兜底約 40 個具體轉(zhuǎn)換器則承載各語言的語法細(xì)節(jié)。若需為自定義語言接入數(shù)字轉(zhuǎn)單詞能力只需實現(xiàn)該接口并通過注冊機(jī)制登記即可復(fù)用整套擴(kuò)展方法與測試體系。贊分享開發(fā)工具【免費下載鏈接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities項目地址https://gitcode.com/gh_mirrors/hu/Humanizer點擊查看免費下載相關(guān)推薦Humanizer 序數(shù)詞本地化解析從 IOrdinalizer 接口到多語言 Ordinalize 實現(xiàn)Humanizer 序數(shù)詞本地化解析從 IOrdinalizer 接口到多語言 Ordinalize 實現(xiàn) 本篇技術(shù)指南以 Humanizer 倉庫中 Hum開發(fā)工具Humanizer 數(shù)字轉(zhuǎn)文字核心接口 INumberToWordsConverter 完全指南本地化基數(shù)詞、序數(shù)詞與元組名的統(tǒng)一抽象Humanizer 數(shù)字轉(zhuǎn)文字核心接口 INumberToWordsConverter 完全指南本地化基數(shù)詞、序數(shù)詞與元組名的統(tǒng)一抽象 Humanizer 是開發(fā)工具Humanizer 的 INumberToWordsConverter深入解析數(shù)字轉(zhuǎn)單詞的多語言轉(zhuǎn)換接口Humanizer 的 INumberToWordsConverter深入解析數(shù)字轉(zhuǎn)單詞的多語言轉(zhuǎn)換接口 導(dǎo)讀 INumberToWordsConverter開發(fā)工具上一篇Chinese-BERT-wwm 項目常見問題解決方案下一篇【免費下載】 Chinese-BERT-wwm 安裝和配置指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考