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

React-Intl,實現 React 項目的前端國際化

開發 前端
React 項目默認你已經搭建好了。可以用過氣的 CRA,流行的 vite,或者用 React 推薦的 Next.js。

本文講解如何使用 React-Intl 庫給你的 React 應用做國際化。

安裝

React 項目默認你已經搭建好了??梢杂眠^氣的 CRA,流行的 vite,或者用 React 推薦的 Next.js。

安裝 React-Intl。

npm i -S react-intl

或者用 yarn。

yarn add react-intl

使用

接著我們需要將國際化能力注入到 React 應用中。

使用的是經典的 context 上下文方案:

const root = ReactDOM.createRoot(
document.getElementById('root')
);

root.render(
<IntlProvider locale={locale} messages={messageMap[locale]}>
<App />
</IntlProvider>
);

IntlProvider 是一個 context.provider 組件,用來注入一些國際化需要的信息。其中最重要的信息是 locale 和 messages。

locale 是一個字符串,代表一個語言標識,使用了 BCP 47 語言標記規范。比如中文用 ??zh???,英文用 ??en???,簡體用 ??zh-CN??。

標識符是會提供給瀏覽器自帶的 Intl 對象使用的,Intl 對象的方法會通過它確定如何做轉換,比如不同國家數字的分隔符是不同的。

圖片

可以看到,原點、逗號、空格,什么都有。所以你要傳一個正確的語言標識符。

messages 就簡單多了,就是一個 id 到 value 的映射,組件中傳一個 id,就能拿到對應的語言文案了。比如

const zh = {
'command.undo': '撤銷',
'command.redo': '重做',
'arrange.forward': '上移一層',
'arrange.backward': '下移一層',
'arrange.front': '移到頂部',
'arrange.back': '移到底部',
'zoom.zoomIn': '放大',
'zoom.zoomOut': '縮小'
};

const en = {
'command.undo': 'Undo',
'command.redo': 'Redo',
'arrange.forward': 'Forward',
'arrange.backward': 'Backward',
'arrange.front': 'Bring to Front',
'arrange.back': 'Send to Back',
'zoom.zoomIn': 'Zoom In',
'zoom.zoomOut': 'zoom Out',
};

更具體的引入寫法:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { IntlProvider } from 'react-intl';
import { zh } from './locale/zh';
import { en } from './locale/en';

const messageMap = {
zh,
en,
};

const getLocale = () => {
const locale = navigator.language;
return locale.startsWith('zh') ? 'zh' : 'en'; // en 是兜底語言
};
const locale = getLocale();

const root = ReactDOM.createRoot(
document.getElementById('root')
);
root.render(
<IntlProvider locale={locale} messages={messageMap[locale]}>
<App />
</IntlProvider>
);

  1. 計算一個語言標識符,因為網站支持的語言可能就兩三種,當用戶客戶端的語言不在范圍內時,給一個兜底的。
  2. 確認語言后,找出對應的 messages 對象。

然后是一些其他的點:如果語言很多,可以考慮做語言包懶加載。另外還要做用戶修改語言后,更新 locale 和 messages props。

組件

然后是在業務組件中使用國際化文案。

最常用的就是 FormattedMessage 組件了,給 id props 提供 id 即可。

<FormattedMessage id="command.undo" />

如果你需要得到文案字符串,傳入到一些組件中,比如 tooltip,你可以用主流的 hook 寫法:

import { useIntl } from 'react-intl';

const intl = useIntl();

<ToolBtn tooltipCnotallow={intl.formatMessage({ id: 'tool.select' })}><IconSelect /></ToolBtn>

或者可以用 HOC(高階組件),我沒用過,我不寫類組件。

類型安全

如果你用 TypeScript,你會希望傳入的 id 是有類型的,反正寫錯 id。React-Intl 提供了全局類型的設置。你只需要這樣寫:

import { en } from './locale/en';
import { zh } from './locale/zh';


declare global {
namespace FormatjsIntl {
interface Message {
ids: (keyof typeof zh) & (keyof typeof en)
}
}
}

keyof typeof zh 就是將中文 message 對象的 key 提取為一個聯合類型。

這里我巧妙地用了一個 & 交叉類型,這樣不在二者 id 的交集內的 key 會被排除在外,防止使用一個沒有在所有語言中都被定義的 id。

locale 也可以設置類型,防止錯誤設置一些不支持的語言標識。如下:

declare global {
namespace FormatjsIntl {
interface IntlConfig {
locale: 'en' | 'zh'
}
}
}

可能你希望 en 和 zh 的 key 要一致,我這里想到一個比較巧妙的做法。en 作為兜底語言,用 typeof 拿到類型,作為其他語言的類型,防止 id 漏寫。

const en = {
'delete': 'Delete',
}

// zh 對象的類型是 typeof en
const zh: (typeof en) = {
'delete': '刪除',
}

message 不支持嵌套

React-Intl 的 message 是不支持嵌套的。

你可以這樣寫:

const zh = {
'command.undo': '撤銷',
'command.redo': '重做',
}

但不能這樣寫:

const zh = {
'command': {
'undo': '撤銷',
'redo': '重做',
}
}

這個我是支持的。

嵌套并無必要,我們加前綴就好了,并且方便全局搜索,能夠快速定義一個國際化 id 的文本位置。類似 Vue 框架會做大量的駝峰和連線符的變換,全局搜索非常不友好,我不喜歡。

如果你喜歡嵌套的風格,可以考慮寫一些腳本,支持將嵌套的轉換為拍平格式。

結尾

以上是 React-Intl 的一些入門用法。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2024-05-17 08:25:06

數據驅動React語言包

2024-01-17 10:16:22

前端國際化消息鍵

2023-01-31 10:29:26

JavaScript國際化國際化庫

2010-01-04 13:09:51

Silverlight

2017-01-09 16:24:07

滴滴Android 端 App

2009-12-29 15:05:29

WPF支持國際化

2009-01-19 09:06:31

gettextPHP國際化編程

2011-08-18 15:24:40

iPhone國際化

2011-07-20 14:53:28

iPhone NSLocalize 國際化

2011-08-11 13:26:30

iPhoneNSLocalized

2023-07-07 07:22:13

ReactProfiler

2023-07-04 07:30:35

React開發樣式

2011-07-08 11:13:42

Cocoa Touch XCode

2024-04-03 13:27:28

Next.js擴展項目

2020-03-11 20:38:13

JavaScript前端工具

2020-09-16 14:39:13

ReactJavaScript框架

2016-09-20 12:49:29

2021-05-17 10:13:24

iOS名詞復數開發

2018-05-24 15:19:19

AWS創業云服務

2009-06-25 16:04:30

點贊
收藏

51CTO技術棧公眾號

国产精品美女久久久久av爽| 真实乱偷全部视频| 三级黄视频在线观看| 一本综合久久| 亚洲美女激情视频| 中文字幕第36页| 日本小视频在线免费观看| 91亚洲男人天堂| 国产精品亚洲аv天堂网| 青青草原免费观看| 久草在线成人| 欧美一级片免费看| 成人在线激情网| 成人午夜在线影视| 99精品久久99久久久久| 成人精品视频久久久久| 日韩免费在线视频观看| 婷婷激情综合| 日韩久久午夜影院| a级大片免费看| 日韩高清成人| 亚洲一区在线观看免费| 亚洲精品国产精品国自产观看| 亚洲精品久久久蜜桃动漫| 麻豆精品在线播放| 欧美一区二三区| 久久成人在线观看| 午夜片欧美伦| 永久免费看mv网站入口亚洲| xfplay5566色资源网站| www.久久99| 在线一区二区三区四区五区 | 999精彩视频| 婷婷在线播放| 综合在线观看色| 奇米视频888战线精品播放| 日本久久一级片| 国产成人99久久亚洲综合精品| 国产精品你懂得| 国产91精品看黄网站在线观看| 国一区二区在线观看| 久久久91精品国产一区不卡| 免费看91的网站| 亚洲宅男网av| 日韩久久免费电影| 精品中文字幕在线播放| 国产suv精品一区| 欧美放荡的少妇| 欧美美女性视频| 久久青草视频| 欧美视频一区二区三区在线观看 | 卡通欧美亚洲| 日韩欧美精品网址| 丝袜老师办公室里做好紧好爽| 超碰91在线观看| 精品动漫一区二区| 国产伦精品一区二区三区四区视频_| 精品一性一色一乱农村| 一区二区三区免费看视频| 影音先锋欧美资源| 国产在线激情视频| 亚洲欧美偷拍三级| 国产一区二区三区在线免费| 午夜dj在线观看高清视频完整版| 在线欧美一区| 欧美日韩福利电影| 黄色一级视频在线观看| 国内久久视频| 欧美亚洲在线视频| 黄色av网站免费观看| 日本不卡视频在线观看| 成人网页在线免费观看| 精品久久久无码中文字幕| 国产成人在线免费| 精品欧美一区二区精品久久| 美丽的姑娘在线观看免费动漫| 国产网站一区二区| 伊人久久婷婷色综合98网| 99视频免费在线观看| 亚洲va欧美va人人爽| 精品视频免费在线播放| 精品3atv在线视频| 欧美日韩成人一区| 四虎永久免费观看| 国产欧美日韩影院| 久久这里只有精品视频首页| 国产亚洲精品成人| 美女久久一区| 91精品在线观| 日韩精品123| 国产精品网站在线观看| 日本一级黄视频| 国产不卡网站| 欧美一区二区三区免费大片| 人妻无码中文久久久久专区| 日韩黄色大片网站| 午夜精品蜜臀一区二区三区免费| 天堂av免费在线观看| 国产麻豆欧美日韩一区| 欧美aaaaa喷水| 超碰在线caoporen| 色哟哟精品一区| 男人操女人下面视频| 国产乱码精品一区二区亚洲| 久久91精品国产| jizz国产在线| thepron国产精品| 欧美 另类 交| 中文字幕av一区二区三区佐山爱| 日韩三级在线观看| 99在线视频免费| 极品av少妇一区二区| 国产一区红桃视频| 久久电影中文字幕| 亚洲大片一区二区三区| 日韩在线一区视频| 国产一区二区三区91| 欧美精品久久一区二区| 97超视频在线观看| 国产色产综合色产在线视频| 免费不卡av在线| 国产专区精品| 少妇精69xxtheporn| 亚洲高清毛片一区二区| 高清不卡在线观看av| 中文字幕av日韩精品| 偷拍中文亚洲欧美动漫| 亚洲精品久久7777777| 九九热精品免费视频| 九九视频精品免费| 亚洲a∨一区二区三区| 欧美极品影院| 精品亚洲一区二区三区在线播放| 欧美日韩在线视频免费| 狠狠狠色丁香婷婷综合激情| 欧洲精品国产| 亚洲永久av| 日韩黄色av网站| 国产精品99无码一区二区| 国产精品羞羞答答xxdd| 青青草影院在线观看| 91精品网站在线观看| 色哟哟网站入口亚洲精品| 国产精品无码粉嫩小泬| 久久精品一区二区三区不卡| 97在线免费公开视频| 天天操综合520| 欧美一级大片在线免费观看| 日韩一级免费视频| 偷拍与自拍一区| av黄色一级片| 国产精品普通话对白| 久久99久久99精品蜜柚传媒| 中国字幕a在线看韩国电影| 日韩禁在线播放| 亚洲天堂一区在线观看| 久久美女高清视频| 爱情岛论坛成人| 日韩免费一区| 91在线视频一区| 日韩成人伦理| 日韩精品极品视频免费观看| www成人在线| 国产欧美一区二区三区鸳鸯浴| 免费男同深夜夜行网站| 色婷婷亚洲mv天堂mv在影片| 国产日韩欧美在线看| 9191在线播放| 亚洲国产精品推荐| 国产污视频网站| 国产精品久线观看视频| 精品国产鲁一鲁一区二区三区| 在线国产一区二区| 精品麻豆av| 欧美日韩在线精品一区二区三区激情综合| 在线播放国产一区中文字幕剧情欧美| 在线观看国产精品视频| 一区二区成人在线视频| 精品国产乱码久久久久久蜜柚 | 国产一区二区小视频| 亚洲视频免费观看| 国产清纯白嫩初高中在线观看性色| 亚洲精品一级| 日韩视频精品| 日本免费一区二区视频| 欧美一级大胆视频| av毛片在线免费看| 亚洲男人的天堂网站| 在线播放精品视频| 亚洲亚洲人成综合网络| av网站免费在线看| 国产精品性做久久久久久| 日日摸日日碰夜夜爽av| 91精品国产91久久久久久密臀| 国产欧美日韩一区| 国语自产精品视频在线看抢先版结局| 欧美乱妇40p| 黄色免费在线播放| 欧美不卡视频一区| 探花国产精品一区二区| 亚洲成人免费视频| 无码人妻精品中文字幕 | 91精品黄色片免费大全| 国产成人在线观看网站| 国产精品传媒入口麻豆| 国产精品久久AV无码| 国产一区二区女| 免费在线观看毛片网站| 欧美午夜久久| 亚洲制服欧美久久| 综合国产视频| 国产精品日韩二区| 成人网av.com/| 国产精品扒开腿做爽爽爽视频| 日本高清在线观看视频| 最近免费中文字幕视频2019| 天堂а在线中文在线无限看推荐| 欧美高清dvd| 看黄色一级大片| 黑人巨大精品欧美一区二区三区 | 韩曰欧美视频免费观看| 麻豆疯狂做受xxxx高潮视频| 中文久久乱码一区二区| 日本黄色网址大全| 99久久久精品| 欧美做受高潮中文字幕| 国产乱国产乱300精品| 午夜国产一区二区三区| 久久最新视频| 777久久久精品一区二区三区| 欧美午夜不卡影院在线观看完整版免费| 亚洲人体一区| 成久久久网站| 日韩欧美在线电影| 国内精品久久久久久久影视简单 | 欧美亚洲精品在线| 欧美13一14另类| 亚洲资源网站| 欧美成熟毛茸茸复古| 免费成人三级| 精品网站在线看| 日本成人a网站| 国产在线资源一区| 久久久久97| 国产另类自拍| 一区二区三区亚洲变态调教大结局 | 久久久久久久国产视频| 亚洲精品免费看| 免费人成在线观看| 亚洲国产aⅴ成人精品无吗| 久久久久免费看| 亚洲在线观看免费视频| 青青草原免费观看| 黄色一区二区在线观看| 亚洲第一在线播放| 91国内精品野花午夜精品| 国产一级一级国产| 欧美性做爰猛烈叫床潮| 91久久久久久久久久久久| 欧美精品粉嫩高潮一区二区| 精品女同一区二区三区| 亚洲成人免费在线视频| 五月天婷婷在线播放| 亚洲人免费视频| 91网在线播放| 欧美日韩不卡合集视频| 成av人片在线观看www| 欧美一乱一性一交一视频| 亚洲伦乱视频| 91色在线视频| 欧美人与动xxxxz0oz| 日本精品一区| 亚洲色图网站| 男人的天堂狠狠干| 日韩不卡一区二区三区 | 精品一区二区三区中文字幕| 国产精品一区二区三区免费| 美女精品一区最新中文字幕一区二区三区 | 中文字幕第100页| 国产91丝袜在线播放| 亚洲av无码一区二区三区观看 | 日韩电视剧在线观看免费网站| 免费黄色在线视频网站| 久久精品亚洲热| 激情aⅴ欧美一区二区欲海潮| 国产成人精品视频在线观看| 97色婷婷成人综合在线观看| 精品欧美日韩| 亚洲一本二本| 日韩精品一区二区三区久久| 国产一区二区成人久久免费影院| 在线精品一区二区三区| 中文字幕在线不卡国产视频| 日本三级2019| 在线观看成人免费视频| 蜜桃视频污在线观看| 在线播放日韩精品| 超碰在线99| 91国产在线免费观看| 国产综合久久久| 国产免费黄色小视频| 国产制服丝袜一区| 欧美做受xxxxxⅹ性视频| 一区二区三区在线视频免费观看| 免费一级a毛片| 亚洲国产精品人人爽夜夜爽| а天堂中文在线官网| 国产成人精品午夜| 麻豆成人入口| 青青草综合在线| 久久国产精品99久久久久久老狼| 亚洲av片不卡无码久久| 夜夜爽夜夜爽精品视频| 怡春院在线视频| 亚洲女人天堂网| av在线网页| 99久久99久久精品国产片| 成人vr资源| 少妇高清精品毛片在线视频| 成人网页在线观看| 在线观看成人毛片| 69堂国产成人免费视频| 1769在线观看| 国产成人激情视频| 亚洲品质自拍| aa在线免费观看| 91偷拍与自偷拍精品| 精品无码久久久久| 日韩欧美卡一卡二| 在线电影福利片| 91影视免费在线观看| 天天做天天爱天天综合网| 一区二区三区韩国| 欧美国产精品中文字幕| 波多野结衣一区二区三区在线| 精品无人国产偷自产在线| 高清在线视频不卡| 国产一区精品视频| 亚洲毛片av| 亚洲の无码国产の无码步美| 亚洲成人免费在线| 五月婷婷开心中文字幕| 98精品国产高清在线xxxx天堂| 超碰精品在线观看| 99色这里只有精品| 91在线视频网址| 国产无套丰满白嫩对白| 精品五月天久久| 香蕉视频亚洲一级| 色狠狠久久av五月综合| 日本在线不卡一区| 国产一区在线观看免费| 欧美久久婷婷综合色| 成视频免费观看在线看| 国产精品xxx在线观看www| 日韩午夜av在线| 久久精品国产亚洲av麻豆| 日韩欧美国产高清91| av在线二区| 91久久精品国产91久久| 国产精品jizz在线观看美国| 亚洲熟女一区二区三区| 精品久久在线播放| 成人精品福利| 亚洲free嫩bbb| 亚洲激情精品| 久久久视频6r| 这里只有精品视频在线观看| 三级福利片在线观看| 精品一区二区三区日本| 日韩av不卡在线观看| 成人自拍小视频| 亚洲国产成人精品女人久久久| sese综合| 午夜啪啪福利视频| 26uuu国产日韩综合| 在线视频1卡二卡三卡| 色中色综合影院手机版在线观看| 欧美日韩破处| 色婷婷.com| 午夜精品福利在线| 在线观看a视频| 国产精品视频一区二区三区经| 久久人人精品| 欧美片一区二区| 国产亚洲视频在线观看| 国产在线一区不卡| 91av在线免费播放| 亚洲乱码国产乱码精品精可以看| 四虎影视2018在线播放alocalhost| 国产精品久久久久影院日本| 欧美午夜久久| 男人晚上看的视频| 国产视频精品在线| 欧美a级大片在线| 青青青国产在线视频| 亚洲永久精品大片| av在线免费一区| 久久久久久草| 国产福利电影一区二区三区|