日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

系統設計 | 多語言設計,你學會了嗎?

來源: 責編: 時間:2024-05-09 09:25:29 209觀看
導讀多語言設計是國際化系統設計的第一步,也是最基本的內容。很多時候,我們會認為多語言設計非常簡單。對于靜態資源來說確實如此,通過加載一個語言包即可,但是對于一些動態內容而言卻不太一樣。這些動態內容可能是消息通知、

多語言設計是國際化系統設計的第一步,也是最基本的內容。很多時候,我們會認為多語言設計非常簡單。對于靜態資源來說確實如此,通過加載一個語言包即可,但是對于一些動態內容而言卻不太一樣。RIS28資訊網——每日最新資訊28at.com

這些動態內容可能是消息通知、服務器生成的導出內容等。這里我整理了一個完整的清單,用來指導多語言的方案設計:RIS28資訊網——每日最新資訊28at.com

  • 前端文案。例如菜單、表單提示信息等。
  • 錯誤信息。表單驗證或者服務器報錯信息的提示。
  • 導出文件。導出 Excel 或者 PDF 文件,往往為后端生成。
  • 郵件和消息通知。為用戶發送通知時,也需要使用對應語言的模板文件。
  • 主數據。例如在電商系統中,管理員需要為支持的語言都添加一份商品數據、商品分類等。
  • 業務增量數據。在業務增量數據中,為了搜索和存檔的目的,有時候需要將一些主數據持久化下來用于搜索或者查看,例如訂單中,需要持久化對應的商品數據。

下面我們逐個討論。RIS28資訊網——每日最新資訊28at.com

多語言的基本概念

在開始進入詳細的內容之前,先了解幾個基本的概念。RIS28資訊網——每日最新資訊28at.com

語言編碼

在國際標準化組織 ISO 的 639-1 標準中,每個語言都被分配了一個特定的編碼。例如中文的編碼為“zh”,英文的編碼為“en”。除了基本的語言標準外,不同地區使用的語言還需要細分,因此拓展了使用地區的編碼,最終的編碼由兩部分組成,由中橫線連接。RIS28資訊網——每日最新資訊28at.com

如果需要表達中國大陸使用的語言,可以使用 “zh-cn”編碼,如果需要表達中國臺灣的語言,可以使用 “zh-tw”。通常來說,中國大陸和新加坡使用簡體中文,中國香港、中國臺灣使用繁體中文。RIS28資訊網——每日最新資訊28at.com

對于英文來說,英國、美國等地區的英文使用習慣不同,在必要時也可以提供不同的語言包。RIS28資訊網——每日最新資訊28at.com

本位語言

在多幣種設計中會介紹一個本位貨幣的概念,在多語言中也會有一個本位語言的概念。RIS28資訊網——每日最新資訊28at.com

本位語言是指在系統設計中的通用語言,通常都會使用英語作為本位語言。本位語言作為其它語言包缺失的情況下的默認語言,也可以作為其它語言包的 key。RIS28資訊網——每日最新資訊28at.com

在動態數據處理中,默認情況下使用本位語言,在需要翻譯的場景使用翻譯拓展表。這樣就避免了到處使用 name_en,name_zh 等和語言相關的字段。RIS28資訊網——每日最新資訊28at.com

I18N 框架

I18N是“Internationalization(國際化)”的縮寫,其中數字18代表首字母I和末字母N之間的字母數。多語言是國際化中最重要的一部分之一,在很多時候,I18N 框架往往就被當做多語言框架。RIS28資訊網——每日最新資訊28at.com

I18N 能力在主流的編程框架中都有提供。在 JavaScript 項目中,i18next 框架提供了一整套 I18N 特性,包括多語言翻譯、數據格式化等內容,對于 Node.js 項目 i18next 也可以在服務端發生作用。RIS28資訊網——每日最新資訊28at.com

而對于服務器端由于前后端分離的發展,相對來說就弱的多。Spring Boot 提供了一個 MessageSource 功能,配合 Java 的 Locale 對象,可以實現翻譯用戶消息的能力。RIS28資訊網——每日最新資訊28at.com

識別和傳遞用戶語言標識

通常來說,多語言的系統會根據優先級識別語言:RIS28資訊網——每日最新資訊28at.com

  • 用戶賬戶的用戶設置。
  • 用戶登錄后會話中的語言信息。
  • 用戶瀏覽器或者 App 的語言設置。
  • 操作系統語言設置。

當用戶安裝瀏覽器時,瀏覽器安裝程序通常會自動選擇與操作系統相同的語言作為默認語言。我們可以通過 JavaScript 的 navigator.language 屬性拿到當前用戶的語言。如果是應用系統本身的語言,可以在登錄后調用 API 獲取用戶的語言設置。RIS28資訊網——每日最新資訊28at.com

識別到語言信息后,需要在前后端傳遞語言信息,通常的做法有:RIS28資訊網——每日最新資訊28at.com

  • 使用 Header 傳遞,通過寫入 HTTP Header 的 Accept-Language 字段。
  • 使用 Query 傳遞,在 URL 參數上增加語言標識。

在實踐中,可以將識別到的用戶語言信息放到瀏覽器 localStorage 或者 App 的本地配置中,然后通過 Header 或者 Query 傳遞。另外也可以將語言信息放入用戶 Session 或 Token 中,不過用戶在修改語言配置后需要刷新 Session 或者重新頒發 Token。RIS28資訊網——每日最新資訊28at.com

除此之外,還有一些不常用的語言標識設置方式:RIS28資訊網——每日最新資訊28at.com

  • cookie
  • sessionStorage/localStorage
  • navigator (這個對象也可以寫入)
  • htmlTag,例如 <html lang=“LANGUAGE” .>
  • URL path
  • 子域名

為了識別復雜的語言標識場景,i18next 還提供了一個 i18next-browser-languageDetector 工具,快速識別當前用戶的語言標識。RIS28資訊網——每日最新資訊28at.com

前端的多語言

在前端開啟多語言有一個經驗需要留意。我們需要為每個語言定義一個語言包,語言包往往由 key value 構成,在一些項目中,有些開發者會使用一個簡短的英文字符串作為 key,并給英文也設置了一個語言包。這種實踐會造成兩個壞處,首先是需要額外定義一個英文語言包,另外當需要排錯時,搜索關鍵詞會變得有一點麻煩。所以,通常來說,我們會直接使用英語作為語言包的 key,這樣可以減少很多工作量。RIS28資訊網——每日最新資訊28at.com

這里以 react-i18next 開啟 React 項目中的多語言設置。RIS28資訊網——每日最新資訊28at.com

導入 react-i18next i18next 兩個庫。RIS28資訊網——每日最新資訊28at.com

npm install react-i18next i18next –save

編寫下面初始化代碼,并確保被 React 入口文件導入。RIS28資訊網——每日最新資訊28at.com

import i18n from "i18next";import { initReactI18next } from "react-i18next";const resources = {  zh: {    translation: {      "Welcome to React": "歡迎使用 React"    }  }};i18n  .use(initReactI18next)  .init({    resources,    lng: "zh"  });export default i18n;

在組件中使用翻譯:RIS28資訊網——每日最新資訊28at.com

import React from 'react';import { useTranslation } from 'react-i18next';function MyComponent () {  const { t, i18n } = useTranslation();  return <h1>{t('Welcome to React')}</h1>}

react-i18next 還提供了其它形式的翻譯方式,例如組件之類的,總之來說使用 t 函數翻譯文本是最簡單的一種形式,也便于搜索和排錯。RIS28資訊網——每日最新資訊28at.com

后端服務的多語言

除了前端的多語言外,后端避免不了需要使用語言標識和翻譯能力, 不過應該盡量避免在后端服務使用 I18N 相關特性。例如,對于錯誤信息來說,盡量通過錯誤碼將錯誤信息放到前端,而不是由后端加工。RIS28資訊網——每日最新資訊28at.com

對于導出、上下游系統等場景后端,后端服務的多語言無法避免,這里以 Spring Boot 為例,演示基本的 I18N 實現。RIS28資訊網——每日最新資訊28at.com

在 Spring Boot 項目中可以添加下面配置。RIS28資訊網——每日最新資訊28at.com

@Configurationpublic class InternationalizationConfig {    @Bean    public MessageSource messageSource() {        // 定義多語言資源位置        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();        // 設置資源目錄        messageSource.setBasename("messages");        messageSource.setDefaultEncoding("UTF-8");        return messageSource;    }    @Bean    public LocaleResolver localeResolver() {        // 設置應用如何讀取語言標識,這里使用了 HTTP 頭信息識別語言標識        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();        localeResolver.setDefaultLocale(Locale.ENGLISH);        return localeResolver;    }}

創建在 resources 目錄下默認語言包: messages.propertiesRIS28資訊網——每日最新資訊28at.com

greeting=Hello

創建一個中文語言包(記得修改 IDE 的文件編碼格式,包括 properties 文件的編碼):RIS28資訊網——每日最新資訊28at.com

greeting=你好

這樣就可以在后端拿到 Locale 對象并進行翻譯了:RIS28資訊網——每日最新資訊28at.com

@GetMapping("/greeting")public String getGreeting(Locale locale) {    return messageSource.getMessage("greeting", null, locale);}

通過傳入合適的語言標識就能獲得相應的翻譯信息了。RIS28資訊網——每日最新資訊28at.com

curl -H "Accept-Language: zh" http://localhost:8080/greeting

拿到合適的 Locale 對象,在后端處理錯誤提示、通知、郵件、導出都可以完成。為 HTTP Client 編寫一個 Interceptor 自動附加 Header 信息,可以把當前請求的語言標識傳遞到下游服務中,解決上下文傳遞的問題。RIS28資訊網——每日最新資訊28at.com

動態數據的多語言設計

動態的數據也需要翻譯,這里分兩種情況:RIS28資訊網——每日最新資訊28at.com

  • 主數據或者基本數據,例如商品、品牌、品類等。
  • 業務增量數據,或者快照數據,例如訂單、預約、工單等。

這兩類數據在國際化的項目中需要分開處理。RIS28資訊網——每日最新資訊28at.com

對于主數據來說,需要在不同的語言區域保持一致,因此需要為每條數據創建翻譯拓展表,以冗余表的方式處理。例如,對于 brand 表中有 name 字段,brand 表本身使用前面介紹的本位語,name 字段使用英語。然后拓展一張 brand_locale 表,表中放置需要翻譯的字段,并增加一個 lang 字段。RIS28資訊網——每日最新資訊28at.com

對于業務增量數據來說,如果按照主數據的處理方式,會導致數據量非常大,通常來說我們通過冗余字段,或不冗余的方式處理。例如,訂單表中產品名稱可以增加一個字段,其中一個字段存儲用戶下單時所用的語言(本地語言),另外一個字段存儲本位語言。這樣的好處是滿足本地用戶查詢、總部人員管理相關數據,并提供足夠好的搜索性能。RIS28資訊網——每日最新資訊28at.com

參考資料

  • 多語言系統搭建 https://zhuanlan.zhihu.com/p/548263662
  • 多語言系統的數據庫設計 https://developer.aliyun.com/article/39819
  • 網址多語言設計 https://learnku.com/articles/58725
  • https://howtodoinjava.com/spring-boot/rest-i18n-example/
  • https://react.i18next.com/
  • https://github.com/i18next/i18next-browser-languageDetector

本文鏈接:http://m.www897cc.com/showinfo-26-87488-0.html系統設計 | 多語言設計,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 工作中最常見的6種OOM(內存溢出)問題,你知道幾個?

下一篇: 使用Ollama和Go基于文本嵌入模型實現文本向量化

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美14一18处毛片| 亚洲午夜视频在线观看| 韩国在线一区| 在线观看亚洲视频| 亚洲欧洲日本专区| 99精品视频一区二区三区| 亚洲午夜高清视频| 欧美一区二视频在线免费观看| 久久爱www久久做| 欧美成人a∨高清免费观看| 亚洲国产影院| 国产在线一区二区三区四区| 国产精品色网| 黄色亚洲精品| 日韩视频―中文字幕| 香蕉成人啪国产精品视频综合网| 久久一综合视频| 欧美日韩美女在线观看| 国产日韩欧美麻豆| 亚洲激情中文1区| 国产精品久久网| 国产曰批免费观看久久久| 亚洲日本激情| 西瓜成人精品人成网站| 欧美成人乱码一区二区三区| 国产精品露脸自拍| 亚洲国产二区| 亚洲欧美日韩视频二区| 欧美电影免费观看高清完整版| 欧美特黄视频| 欧美日韩亚洲激情| 国产综合第一页| 一区二区三区久久| 久久午夜视频| 国产精品免费看久久久香蕉| 在线免费高清一区二区三区| 亚洲女优在线| 欧美母乳在线| 欧美精品在线免费| 国产麻豆精品theporn| 最新国产の精品合集bt伙计| 欧美一区二区三区在线视频 | 欧美国产三级| 国产日韩欧美日韩| aa级大片欧美三级| 久久综合五月天婷婷伊人| 国产精品嫩草99av在线| 亚洲三级免费| 久热精品视频在线观看一区| 国产嫩草一区二区三区在线观看| aa级大片欧美| 欧美国产日韩亚洲一区| 国内精品久久久久久久影视蜜臀 | 久久精品一区二区三区四区| 欧美午夜精品一区二区三区| 国产精品老牛| 亚洲免费电影在线| 美女精品在线| 欧美日韩国产天堂| 亚洲电影在线看| 久久精品成人欧美大片古装| 国产精品国产三级国产专播品爱网 | 国内精品久久久久久久影视蜜臀 | 欧美三级精品| 国产精品夜夜夜| 亚洲人成啪啪网站| 麻豆精品在线视频| 国产综合视频| 欧美自拍偷拍| 国产日韩欧美一区二区三区在线观看 | 久久精品国产亚洲一区二区三区| 免费在线观看精品| 黄色工厂这里只有精品| 欧美一区二区三区在线播放| 国产精品国产三级国产专播品爱网| 99xxxx成人网| 欧美另类视频| 亚洲伦理中文字幕| 欧美激情亚洲| 亚洲乱码精品一二三四区日韩在线| 欧美.日韩.国产.一区.二区| 亚洲高清在线观看一区| 另类酷文…触手系列精品集v1小说| 韩国免费一区| 久久国产一区二区三区| 国产综合色产| 久久久久五月天| 一区二区三区我不卡| 久久综合成人精品亚洲另类欧美 | 日韩视频在线免费| 欧美日本亚洲| 在线视频欧美日韩精品| 欧美午夜电影在线| 亚洲午夜电影网| 国产精品久久久对白| 亚洲一区二区精品视频| 国产精品老女人精品视频| 午夜精品久久久久久久久久久| 国产精品视屏| 久久国产福利| 亚洲春色另类小说| 欧美黄色日本| 国产精品99久久久久久久女警| 国产精品久久久久久久一区探花| 校园春色国产精品| 国产亚洲二区| 老司机一区二区| 亚洲免费久久| 国产精品www.| 久久高清免费观看| 亚洲国产高清aⅴ视频| 欧美国产先锋| 一区二区三区免费观看| 国产精品乱人伦一区二区| 性欧美激情精品| 在线观看视频一区| 欧美精品在线一区| 亚洲男人av电影| 激情偷拍久久| 欧美日韩日日夜夜| 亚洲国产成人高清精品| 欧美巨乳在线观看| 亚洲男人av电影| 136国产福利精品导航| 欧美日韩精品在线| 欧美一区日韩一区| 亚洲激情中文1区| 国产精品免费观看在线| 美女任你摸久久| 一区二区日韩精品| 欧美日本韩国一区二区三区| 亚洲欧美日韩国产中文| 在线观看国产日韩| 欧美色视频日本高清在线观看| 午夜在线精品偷拍| 亚洲激情欧美激情| 国产欧美精品一区| 欧美激情四色 | 亚洲欧美不卡| 尤物精品在线| 欧美日韩免费在线观看| 欧美一区二区三区在线观看| 亚洲精品影院在线观看| 欧美大片一区二区| 亚洲欧美日韩一区二区三区在线| 影音先锋日韩资源| 久久久久国产精品厨房| 亚洲精品中文字幕女同| 国产亚洲午夜| 欧美三级电影精品| 亚洲一区二区三区在线播放| 国模套图日韩精品一区二区| 欧美日韩一区二区三区视频| 久久久久久久网| 亚洲一区尤物| 亚洲日本激情| 国产综合色产| 国产精品免费观看在线| 欧美女同在线视频| 久久久亚洲一区| 亚洲男人影院| 99精品视频免费全部在线| 激情丁香综合| 国产麻豆精品视频| 欧美色欧美亚洲高清在线视频| 久久婷婷综合激情| 亚洲综合激情| 99re6热只有精品免费观看| 激情成人av在线| 国产乱肥老妇国产一区二| 欧美日韩国产色综合一二三四| 在线一区观看| 亚洲精美视频| 韩国一区二区三区美女美女秀| 国产精品99一区二区| 欧美激情视频一区二区三区免费 | 欧美精品乱人伦久久久久久 | 久久高清国产| 午夜视频久久久久久| 一本一道久久综合狠狠老精东影业 | 欧美激情四色| 久久久综合视频| 欧美在线观看视频一区二区三区 | 欧美成年人在线观看| 久久久午夜精品| 欧美一区二区三区四区在线观看 | 亚洲高清自拍| 精品成人一区| 黄色一区二区三区| 狠狠色伊人亚洲综合成人| 国产美女扒开尿口久久久| 国产精品久久久91| 欧美三日本三级三级在线播放| 欧美精品少妇一区二区三区| 蜜桃精品久久久久久久免费影院| 久久久久国产免费免费| 久久精品国产免费| 久久精品官网| 久久精品国产亚洲高清剧情介绍| 欧美影院在线| 欧美在线免费一级片| 欧美一区二区久久久| 欧美一区二区视频在线观看| 欧美在线视频播放|