ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Go Web 國際化站點實戰:以 go-i18n 管理多語言套件與模板翻譯

Go Web 國際化站點實戰:以 go-i18n 管理多語言套件與模板翻譯 文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载本篇文章承接《Go Web 程式設計》第 10 章「國際化與本地化」的脈絡聚焦於如何將單一語言的 Web 應用升級為支援多語言的國際化站點。全文以 go-i18n 套件為核心完整覆蓋多語言套件的目錄組織、JSON 語言包設計、程式碼層的翻譯時間貨幣轉換以及將這些能力以自訂模板函式mapfunc的形式注入 Go 模板層讓開發者能在範本中直接以 pipeline 語法輸出多語言內容。讀完本文後你將掌握一套可直接落地的多語言 Web 應用實作方案。從單一 Locale 到多語言包整體思路前一節 10.2 本地化資源 介紹的是單一語言的本地化用一個 Locale 對應一份配置檔案透過 key-value 的方式儲存文字、時間、貨幣等資訊。本節要解決的問題是如何同時管理多個本地化資源多個 Locale如何處理日常高頻需求簡單文字翻譯、時間日期、數字貨幣如何把翻譯能力下沉到模板層讓前端範本直接輸出國際化內容。答案是兩層設計底層用 go-i18n 套件統一管理語言包與預設格式資訊上層用 Go 模板的自訂函式template.FuncMap將Tr.Translate、Tr.Time、Tr.Money等能力開放給範本使用。管理多個本地套件config/locales 目錄與 JSON 語言包開發一個應用時首先要決定支援一種語言還是多種語言。若要支援多種語言必須事先設計好組織結構以方便日後不斷新增語言。本節推薦的結構是所有 Locale 相關檔案集中放在config/locales目錄下。假設要支援中文與英文就在該目錄放置en.json與zh.json兩個語言包內容大致如下# zh.json { zh: { submit: 提交, create: 建立 } } # en.json { en: { submit: Submit, create: Create } }實務提醒標準 JSON 格式並不允許註解範例中的# zh.json、# en.json僅為說明性標記實際專案中語言包檔案內容應是純 JSON不含註解行且檔案命名即對應語言代碼例如en.json、zh.json、en-US.json。這種以「語言代碼 → key → 翻譯文字」兩層結構組織的設計與 10.2 節 中介紹的map[string]map[string]string記憶體結構一脈相承差別在於現在把資料從程式碼中剝離放入 JSON 設定檔方便非程式設計師維護與持續擴充語言。註冊語言包並切換語言NewLocale 與 LoadPath為了支援國際化此處採用國際化相關套件go-i18n。使用前先向 go-i18n 註冊config/locales目錄以載入所有 Locale 檔案Tr:i18n.NewLocale() Tr.LoadPath(config/locales)i18n.NewLocale()建立一個 Locale 管理器實例Tr所有語言包與格式資訊都由它統一持有Tr.LoadPath(config/locales)掃描指定目錄下的全部語言包並載入記憶體。這個套件使用起來非常簡單可以透過下面的方式立刻驗證效果fmt.Println(Tr.Translate(submit)) //輸出 Submit Tr.SetLocale(zh) fmt.Println(Tr.Translate(submit)) //輸出“提交”注意其中兩個關鍵行為未指定語言時Tr.Translate(submit)依賴預設 Locale此處輸出英文Submit呼叫Tr.SetLocale(zh)切換當前語言後同一 key 立即輸出對應翻譯「提交」整個過程只需一行 API無需自行維護 map 查找邏輯對比 10.2 節 中手寫的msg(locale, key)函式可明顯感受到套件的便利性。自動載入本地套件預設格式資訊與 loadDefaultTranslations前面介紹的是自訂語言包的載入方式。事實上go-i18n 函式庫已經預載入了很多預設的格式資訊例如時間格式、貨幣格式使用者可以在自訂配置時改寫這些預設配置。以下是套件載入預設語言包的處理過程即loadDefaultTranslations方法屬於IL型別//載入預設配置檔案這些檔案都放在 go-i18n/locales 下面 //檔案命名 zh.json、en.json、en-US.json 等可以不斷的擴充套件支援更多的語言 func (il *IL) loadDefaultTranslations(dirPath string) error { dir, err : os.Open(dirPath) if err ! nil { return err } defer dir.Close() names, err : dir.Readdirnames(-1) if err ! nil { return err } for _, name : range names { fullPath : path.Join(dirPath, name) fi, err : os.Stat(fullPath) if err ! nil { return err } if fi.IsDir() { if err : il.loadTranslations(fullPath); err ! nil { return err } } else if locale : il.matchingLocaleFromFileName(name); locale ! { file, err : os.Open(fullPath) if err ! nil { return err } defer file.Close() if err : il.loadTranslation(file, locale); err ! nil { return err } } } return nil }從這個原始碼可以讀出完整的載入流程os.Open(dirPath)開啟語言包目錄如 go-i18n 自帶的locales目錄並defer dir.Close()確保資源釋放dir.Readdirnames(-1)一次讀出目錄下所有檔案子目錄名稱遍歷每個名稱用os.Stat判斷型別若是子目錄fi.IsDir()為 true遞迴呼叫il.loadTranslations(fullPath)繼續深入載入若是檔案透過il.matchingLocaleFromFileName(name)從檔案名稱如zh.json、en-US.json解析出語言代碼解析成功則開啟檔案並呼叫il.loadTranslation(file, locale)載入任一環節出錯立即返回 error全部成功則返回nil。從這個設計可以推斷只要按照「語言代碼.json」的規則命名檔案並放入目錄套件即可自動完成載入與註冊無需手動逐個登記這正是「檔案命名 zh.json、en.json、en-US.json 等可以不斷的擴充支援更多語言」的底層保證。預設格式的實際輸出效果透過上述方法將預設配置載入後即使在沒有自訂時間資訊的情況下也能直接取得對應 Locale 的格式化結果。在localezh的環境下執行//localezh 的情況下執行如下程式碼 fmt.Println(Tr.Time(time.Now())) //輸出2009 年 1 月 08 日 星期四 20:37:58 CST fmt.Println(Tr.Time(time.Now(),long)) //輸出2009 年 1 月 08 日 fmt.Println(Tr.Money(11.11)) //輸出:11.11三個 API 各自解決一類需求Tr.Time(t)輸出完整的中文本地化時間含星期與時區底層會依據 Locale 決定格式並處理時區Tr.Time(t, long)第二個參數指定格式級別此處輸出「長格式」的日期只到年月日說明該 API 支援按格式名稱選取不同樣式Tr.Money(11.11)直接輸出帶貨幣符號人民幣 的金額無需自行拼接符號。與 10.2 節 中「手動讀取time_zone、date_format、money等 key 再自行fmt.Printf格式化」的做法相比go-i18n 把這套流程完整封裝成了單一方法呼叫。模板 mapfunc把翻譯能力注入模板層上面的Tr.Translate、Tr.Time、Tr.Money都是基於邏輯層的函式——開發者可以在 handler 中把參數轉換完畢後再渲染輸出。但如果想在模板層直接使用這些函式該怎麼辦在《Go Web 程式設計》前面介紹模板的章節中提到Go 語言的模板支援自訂模板函式。利用template.FuncMap我們可以把 i18n 能力註冊成模板函式然後在範本中透過 pipeline 方式直接呼叫。本節實現了三個便捷的 mapfunc分別覆蓋文字、時間日期與貨幣三類翻譯。1. 文字資訊文字資訊呼叫Tr.Translate來實現相應的資訊轉換mapfunc 的實作如下func I18nT(args ...interface{}) string { ok : false var s string if len(args) 1 { s, ok args[0].(string) } if !ok { s fmt.Sprint(args...) } return Tr.Translate(s) }註冊函式如下t.Funcs(template.FuncMap{T: I18nT})範本中使用如下{{.V.Submit | T}}2. 時間日期時間日期呼叫Tr.Time函式來實現相應的時間轉換mapfunc 的實作如下func I18nTimeDate(args ...interface{}) string { ok : false var s string if len(args) 1 { s, ok args[0].(string) } if !ok { s fmt.Sprint(args...) } return Tr.Time(s) }註冊函式如下t.Funcs(template.FuncMap{TD: I18nTimeDate})範本中使用如下{{.V.Now | TD}}3. 貨幣資訊貨幣呼叫Tr.Money函式來實現相應的金額轉換mapfunc 的實作如下func I18nMoney(args ...interface{}) string { ok : false var s string if len(args) 1 { s, ok args[0].(string) } if !ok { s fmt.Sprint(args...) } return Tr.Money(s) }註冊函式如下t.Funcs(template.FuncMap{M: I18nMoney})範本中使用如下{{.V.Money | M}}三個 mapfunc 的共同模式對比上述三段程式碼可以發現三個函式採用了完全相同的參數處理模式接收args ...interface{}不定參數若恰好只有一個參數且型別為string直接取出使用否則用fmt.Sprint(args...)將任意型別參數轉為字串最後把字串交給對應的 i18n 方法Tr.TranslateTr.TimeTr.Money完成轉換。這種設計讓模板函式既能接受純字串也能接受模板渲染時傳入的任意型別值例如time.Time物件經fmt.Sprint後交給Tr.Time具備良好的容錯性。註冊與使用的完整銜接在實際的 Web 應用中t.Funcs(...)需在模板解析之前呼叫模板解析與渲染的方式與本書前面章節的範例一致。以倉庫中的實際範例為佐證en/code/src/apps/ch.4.1/main.go 展示了典型的模板使用方式t, _ : template.ParseFiles(login.gtpl)在此基礎上只要在ParseFiles之前先執行t.Funcs(template.FuncMap{T: I18nT, TD: I18nTimeDate, M: I18nMoney})模板中的{{.V.Submit | T}}、{{.V.Now | TD}}、{{.V.Money | M}}就會在渲染時自動完成對應 Locale 下的翻譯。pipeline 語法值 | 函式的寫法也與 Go 模板內建函式的使用習慣完全一致學習成本極低。總結透過本節可以掌握實現一個多語言套件 Web 應用的完整路徑自訂語言包將zh.json、en.json等語言包放入config/locales目錄透過i18n.NewLocale()與LoadPath統一載入即可方便地實現多語言配置驅動擴充只需新增語言包檔案就能持續擴充支援更多語言載入邏輯由loadDefaultTranslations自動完成目錄掃描 → 檔名解析 Locale → 載入翻譯內建預設格式go-i18n 預設載入時間、貨幣等公共格式資訊即使不提供自訂配置也能直接使用Tr.Time、Tr.Money模板層整合透過template.FuncMap註冊T、TD、M三個模板函式在開發 Web 應用時可直接在範本中透過 pipeline 方式操作多語言套件實現「渲染即翻譯」。至此單一語言的 Web 應用就具備了完整的國際化能力。接下來可繼續閱讀下一節 10.4 小結 回顧本章 i18n 的整體脈絡或返回 目錄 從頭梳理「國際化與本地化」章節10.1 設定預設地區 → 10.2 本地化資源 → 本節 10.3的完整知識鏈。赞分享文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载相关推荐beego 框架多語言支援i18n實戰整合 go-i18n 打造國際化與本地化應用beego 框架多語言支援i18n實戰整合 go i18n 打造國際化與本地化應用 本文以本書第十四章「擴充套件 Web 框架」中的多語言支援為核心完整文档教程build-web-application-with-golang 第 6 章總結Go 語言 session 管理、儲存與劫持防範實戰build web application with golang 第 6 章總結Go 語言 session 管理、儲存與劫持防範實戰 導讀 本文是 buil文档教程HMCL 在地化架構與翻譯實作指南語言標籤、資源回退機制與多語言貢獻流程HMCL 在地化架構與翻譯實作指南語言標籤、資源回退機制與多語言貢獻流程 HMCLHello Minecraft! Launcher是一套多語系、跨平台的桌面应用游戏开发上一篇使用KiKit实现多板设计工作流的技术指南下一篇CANN/asc-devkit Ascend C矢量除法API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表