精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 前端
對于主數據來說,需要在不同的語言區域保持一致,因此需要為每條數據創建翻譯拓展表,以冗余表的方式處理。

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

這些動態內容可能是消息通知、服務器生成的導出內容等。這里我整理了一個完整的清單,用來指導多語言的方案設計:

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

下面我們逐個討論。

多語言的基本概念

在開始進入詳細的內容之前,先了解幾個基本的概念。

語言編碼

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

如果需要表達中國大陸使用的語言,可以使用 “zh-cn”編碼,如果需要表達中國臺灣的語言,可以使用 “zh-tw”。通常來說,中國大陸和新加坡使用簡體中文,中國香港、中國臺灣使用繁體中文。

對于英文來說,英國、美國等地區的英文使用習慣不同,在必要時也可以提供不同的語言包。

本位語言

在多幣種設計中會介紹一個本位貨幣的概念,在多語言中也會有一個本位語言的概念。

本位語言是指在系統設計中的通用語言,通常都會使用英語作為本位語言。本位語言作為其它語言包缺失的情況下的默認語言,也可以作為其它語言包的 key。

在動態數據處理中,默認情況下使用本位語言,在需要翻譯的場景使用翻譯拓展表。這樣就避免了到處使用 name_en,name_zh 等和語言相關的字段。

I18N 框架

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

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

而對于服務器端由于前后端分離的發展,相對來說就弱的多。Spring Boot 提供了一個 MessageSource 功能,配合 Java 的 Locale 對象,可以實現翻譯用戶消息的能力。

識別和傳遞用戶語言標識

通常來說,多語言的系統會根據優先級識別語言:

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

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

識別到語言信息后,需要在前后端傳遞語言信息,通常的做法有:

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

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

除此之外,還有一些不常用的語言標識設置方式:

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

為了識別復雜的語言標識場景,i18next 還提供了一個 i18next-browser-languageDetector 工具,快速識別當前用戶的語言標識。

前端的多語言

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

這里以 react-i18next 開啟 React 項目中的多語言設置。

導入 react-i18next i18next 兩個庫。

npm install react-i18next i18next –save

編寫下面初始化代碼,并確保被 React 入口文件導入。

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;

在組件中使用翻譯:

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 函數翻譯文本是最簡單的一種形式,也便于搜索和排錯。

后端服務的多語言

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

對于導出、上下游系統等場景后端,后端服務的多語言無法避免,這里以 Spring Boot 為例,演示基本的 I18N 實現。

在 Spring Boot 項目中可以添加下面配置。

@Configuration
public 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.properties。

greeting=Hello

創建一個中文語言包(記得修改 IDE 的文件編碼格式,包括 properties 文件的編碼):

greeting=你好

這樣就可以在后端拿到 Locale 對象并進行翻譯了:

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

通過傳入合適的語言標識就能獲得相應的翻譯信息了。

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

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

動態數據的多語言設計

動態的數據也需要翻譯,這里分兩種情況:

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

這兩類數據在國際化的項目中需要分開處理。

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

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

參考資料

責任編輯:武曉燕 來源: DDD和微服務
相關推薦

2024-03-06 08:28:16

設計模式Java

2024-03-05 10:09:16

restfulHTTPAPI

2022-11-11 08:29:24

C語言中文字符代碼

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2024-09-09 09:00:12

架構設計算法

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2023-10-10 11:04:11

Rust難點內存

2024-07-31 08:39:45

Git命令暫存區

2023-12-12 08:02:10

2024-05-06 00:00:00

InnoDBView隔離

2023-01-30 09:01:54

圖表指南圖形化

2023-08-26 21:34:28

Spring源碼自定義

2022-07-13 08:16:49

RocketMQRPC日志

2023-03-26 22:31:29

點贊
收藏

51CTO技術棧公眾號

久久99精品国产91久久来源| 国产精品丝袜在线播放| 久久久一区二区三区捆绑**| 国产成人精品免高潮在线观看 | 在线一区二区三区视频| 不卡的av影片| 国产亚洲精品久久久久婷婷瑜伽| 亚洲少妇激情视频| 国产精品999.| 僵尸再翻生在线观看| 国产精品免费免费| 国产麻豆一区二区三区在线观看| 亚洲国产精品无码久久久| 亚洲最新色图| 亚洲欧美日韩在线高清直播| 欧美日韩久久婷婷| 成人性生活视频| 一区二区三区在线观看欧美| 日本午夜精品一区二区| 亚洲av无码国产综合专区| 久久国产精品久久久久久电车| 久久精品亚洲国产| 一级黄色片大全| 国产精品久久久久av蜜臀| 欧美色视频一区| 鲁一鲁一鲁一鲁一澡| 中文字幕中文字幕在线中高清免费版| 久久久99精品免费观看| 国产精品国产亚洲精品看不卡15 | 一区二区三区人妻| 中文字幕 在线观看| 亚洲精品成a人| 亚洲精品成人a8198a| 五月婷婷深深爱| 国产激情一区二区三区桃花岛亚洲| 国产成人精品久久久| 国产精品100| 国产精品99免费看| 欧美成人精品激情在线观看| 一区二区三区在线播放视频| 小嫩嫩12欧美| 亚洲国产精品va在线看黑人动漫| 日韩av影视大全| 久久亚洲精品人成综合网| 欧美日韩一区二区免费视频| 国产成人在线小视频| 黄色免费在线网站| 亚洲欧洲一区二区在线播放| 亚洲高清资源综合久久精品| 韩国福利在线| 国产欧美日韩三级| 日本在线播放不卡| 色鬼7777久久| 久久中文字幕电影| 欧美成ee人免费视频| 国产免费裸体视频| 刘玥91精选国产在线观看| 国产一区二区三区久久久| 成人亲热视频网站| 97人妻人人澡人人爽人人精品| 日韩高清不卡一区二区三区| 国产精品成人播放| 中文字幕在线观看视频一区| 日本一不卡视频| 国产日韩在线一区| 国产精品无码一区二区桃花视频| 韩国视频一区二区| 亚洲精品欧美一区二区三区| 精品国产黄色片| 国产成人在线免费观看| 丁香婷婷久久久综合精品国产| 亚洲欧美另类视频| 91美女在线视频| 日本不卡一区| 国产h在线观看| 国产精品久久久一本精品 | 国产欧洲精品视频| 国产欧美久久久| 东方欧美亚洲色图在线| 久久精品二区| 成全电影播放在线观看国语| 中文字幕在线一区二区三区| 99er在线视频| 欧美国产大片| 91精品国产入口在线| 一区二区三区四区视频| 午夜精品久久久内射近拍高清| 日韩av超清在线观看| 在线亚洲高清视频| www.污污视频| 欧美电影在线观看免费| 中文字幕亚洲无线码在线一区| 免费看一级大片| 国产一区二区精品| 国产中文欧美精品| 好吊色一区二区| 中文字幕第一区二区| 在线观看av的网址| 日韩av大片站长工具| 91精品在线麻豆| 少妇饥渴放荡91麻豆| 日本一区二区在线看| 欧美精品videossex性护士| 无码人妻aⅴ一区二区三区有奶水| 精品无人码麻豆乱码1区2区| 精品久久久久久中文字幕动漫| 亚洲成人三级| 无码av中文一区二区三区桃花岛| 91极品尤物在线播放国产| 日韩欧洲国产| 在线观看日韩视频| 国产手机在线视频| 国产一区中文字幕| 色综合影院在线观看| 波多野结衣久久| 欧美丰满一区二区免费视频 | 五月天中文字幕| 成人午夜视频在线| 一区二区三区在线视频111| 天堂av在线网| 日韩精品一区二区三区swag| 色婷婷国产精品免| 亚洲在线观看| 国产日韩欧美亚洲一区| 99久久精品免费观看国产| 欧美性受xxxx黑人xyx性爽| 美女伦理水蜜桃4| 亚洲情侣在线| 国产精品久久久久久久久粉嫩av| 五月色婷婷综合| 一区二区不卡在线播放| 182午夜在线观看| 欧美欧美黄在线二区| 国模私拍一区二区三区| www.成人精品| 日韩理论在线观看| 亚洲网中文字幕| 日韩在线二区| 国产日韩换脸av一区在线观看| 国产一区二区影视| 色婷婷综合久久久久中文| 亚洲自拍偷拍精品| 一区免费在线| 国产免费一区| 黄色激情在线播放| 亚洲а∨天堂久久精品喷水| 久久久久久久久精| 成人小视频免费在线观看| 妞干网在线播放| 6080亚洲理论片在线观看| 欧美大奶子在线| av av片在线看| 亚洲精品日日夜夜| 欧美午夜精品一区二区| 欧美午夜久久| 国产精品污www一区二区三区| 亚洲婷婷噜噜| 精品国产一区二区三区忘忧草| 欧美成欧美va| 成人免费看的视频| 国精产品一区一区三区视频| 日本一区福利在线| 日韩美女写真福利在线观看| 成全电影播放在线观看国语| 欧美日韩国产精品成人| 国产精品久久久免费看| 国产在线精品一区二区| 国产免费内射又粗又爽密桃视频| 77成人影视| 4p变态网欧美系列| av小片在线| 91精品在线一区二区| 日本三级欧美三级| 久久综合丝袜日本网| 午夜在线观看av| 欧美成人日韩| 久久国产精品亚洲va麻豆| 日本精品网站| 欧美日韩爱爱视频| 香蕉人妻av久久久久天天| 色综合久久久久久久| 国产麻豆视频在线观看| 成人h版在线观看| 韩国一区二区av| 亚洲精品成人无限看| 成人动漫视频在线观看完整版| www在线观看黄色| 中文欧美日本在线资源| 午夜精品久久久久久久第一页按摩| 亚洲国产精品天堂| 51妺嘿嘿午夜福利| 国产成人精品网址| 免费黄色福利视频| 在线成人激情| 欧美污视频久久久| 亚洲性视频在线| 国产精品久久久久不卡| 少女频道在线观看高清 | 岛国成人毛片| 日韩成人中文字幕| 国产视频在线观看视频| 韩曰欧美视频免费观看| 乱h高h女3p含苞待放| 久久久三级国产网站| 亚洲欧洲日韩综合| 日韩av中文在线观看| 日韩国产成人无码av毛片| 欧美在线免费看视频| 国产精品福利视频| 成人在线免费av| 2018国产精品视频| a视频在线免费看| 在线精品国产欧美| 无码国精品一区二区免费蜜桃| 欧美另类z0zxhd电影| 国产嫩bbwbbw高潮| 午夜精品久久久久久久久久 | 国产一卡二卡三卡四卡| 精品无人区卡一卡二卡三乱码免费卡 | 99青草视频在线播放视| 日韩精品在线私人| www.精品久久| 欧美日本一区二区| 波多野结衣啪啪| 精品久久久一区| 国产小视频在线观看免费| 中文字幕在线观看一区二区| 日韩一区二区a片免费观看| gogogo免费视频观看亚洲一| 亚洲欧美日本一区二区| 视频一区欧美精品| 漂亮人妻被中出中文字幕| 亚洲经典自拍| avav在线播放| 国产综合自拍| 免费看日b视频| 一区二区在线影院| 国产日韩第一页| 中文字幕免费精品| 国产盗摄视频在线观看| 欧美gayvideo| 亚洲精品免费在线看| 精品香蕉视频| 日本精品一区二区三区高清 久久| 亚洲精品亚洲人成在线| 精品久久久久久乱码天堂| 国产精品久久久久久久久久白浆 | www.成年人| 国产在线视频不卡二| 亚洲女人在线观看| 国产成人精品一区二区三区四区 | 欧美日韩电影在线观看| av文字幕在线观看| 免费99精品国产自在在线| 日p在线观看| 久久深夜福利免费观看| 成人短视频在线观看| 欧美大片在线看| 丁香高清在线观看完整电影视频 | 亚洲精品视频在线观看免费视频| 亚洲高清视频在线| 国产成人在线播放视频| 欧美午夜视频一区二区| 日本妇乱大交xxxxx| 欧美日韩精品一区二区天天拍小说| 亚洲综合网av| 日韩三级av在线播放| 日韩一区二区三区不卡| 日韩电影在线观看永久视频免费网站| 欧美日韩激情视频一区二区三区| 中文字幕成人精品久久不卡| 高潮毛片在线观看| 午夜精品视频网站| 成人黄色免费短视频| 国产在线日韩在线| 国产成人在线中文字幕| 欧美下载看逼逼| 99久久夜色精品国产亚洲96 | 天天操天天摸天天舔| 亚洲女人的天堂| 日韩欧美激情视频| 在线精品视频一区二区| av手机免费看| 日韩精品一区二区视频| 欧美成年黄网站色视频| 欧美极度另类性三渗透| 成人爱爱网址| 成人精品一区二区三区电影免费| 久久精品国产亚洲5555| 婷婷亚洲婷婷综合色香五月| 国产在线成人| 污污视频网站免费观看| 国产成人精品在线看| 加勒比综合在线| 一区二区三区美女| 国产一卡二卡三卡| 精品乱人伦小说| yiren22亚洲综合伊人22| 欧美激情成人在线视频| 国产成人精品123区免费视频| 91久久精品www人人做人人爽| 欧美男男gaytwinkfreevideos| 日本丰满大乳奶| 日本欧美一区二区三区乱码| 美女伦理水蜜桃4| 成人欧美一区二区三区黑人麻豆| 国产区一区二区三| 日韩欧美亚洲国产精品字幕久久久 | 日韩精品小视频| av免费在线观看网站| 国产精品第100页| 欧美激情15p| 久久视频免费在线| 麻豆91在线看| 色婷婷在线影院| 亚洲国产sm捆绑调教视频| 97人妻一区二区精品免费视频 | av大大超碰在线| 国产精品美女主播在线观看纯欲| 久久久久久久久久久久久久久久久久久久| 在线视频不卡一区二区三区| 久久中文在线| 污片免费在线观看| 亚洲综合视频在线| 亚洲熟妇无码久久精品| 亚洲小视频在线观看| 国产在线美女| 国产在线一区二| 在线欧美视频| 美女露出粉嫩尿囗让男人桶| 亚洲精品免费在线观看| aaaaaa毛片| 日韩成人网免费视频| 国产91足控脚交在线观看| 成人av免费电影| 欧美日韩少妇| 亚洲欧美高清在线| 亚洲一区二区三区视频在线播放 | 九九九伊在线综合永久| 久久亚洲高清| 校园春色综合网| 91av在线免费| 欧美性猛交xxxx偷拍洗澡| 日本私人网站在线观看| 欧美最猛性xxxxx免费| 香蕉久久精品日日躁夜夜躁| 欧美亚洲精品一区二区| 91网站在线播放| 秋霞精品一区二区三区| 亚洲精品视频免费在线观看| 波多视频一区| 四虎一区二区| 另类小说欧美激情| 波多野结衣家庭教师| 欧美一级搡bbbb搡bbbb| 久久久久黄久久免费漫画| 国产精品免费一区二区三区观看| 亚洲视频狠狠| www.超碰97| 在线免费观看日本欧美| 日本www在线观看视频| 91九色偷拍| 在线亚洲一区| 亚洲黄色小说视频| 欧美精品免费视频| 性欧美ⅴideo另类hd| 国产日韩欧美亚洲一区| 久久精品1区| www成人啪啪18软件| 欧美一区二区人人喊爽| 国模私拍一区二区国模曼安| 日韩av高清在线播放| 国产麻豆一精品一av一免费| 国产午夜精品一区二区理论影院 | 99在线视频免费观看| 一本不卡影院| 亚洲aaa视频| 精品免费国产二区三区| 免费电影日韩网站| 亚洲天堂av免费在线观看| 成人高清视频在线| 国产一区免费看| 欧美成人三级视频网站| 鲁大师精品99久久久| 另类小说色综合| 亚洲成年人影院| 亚洲免费视频一区二区三区| 国产传媒一区二区| 日韩电影一区二区三区| 青青草手机视频在线观看| 精品亚洲国产视频| 精品一区二区三区四区五区| 国产免费黄视频| 日韩一区日韩二区| 九一国产在线| 国产精品福利视频| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品午夜久久久久久久| 色香阁99久久精品久久久| 久久久免费毛片|