关系经济人类预测化学自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

前端i18n最佳实践在React中使用i18next

1月9日 心碎巷投稿
  本合集文章,授权转载,侵权必究。
  来源:代码与野兽
  本文将会介绍i18n的业界最佳实践。
  聊聊什么是i18n?JavaScript中的i18n基本概念
  目前业界最流行的i18n方案都需要处理两个东西:资源文件路由资源文件
  i18n这个问题在前后端未分离的时代就一直存在。
  实现i18n,可以分为后端runtime的策略和前端runtime的策略。
  先讲一下后端runtime的策略。
  比如在JSP和PHP模板引擎中就有大量基于这种策略实现的i18n。
  它会把网页中要显示的内容提前翻译成多种语言。
  当用户请求网页时,由用户自己选择语言,或者在第一次用户没选择语言时使用服务端接收到的acceptlanguage请求头字段来确定用户的语言。
  之后去加载写死的模板字符串资源文件,去替换文本内容。
  拿代码举个大概的例子。
  这是原来没有做国际化的代码。这是一段简单的文本
  做完国际化后。{t(simpleContent)}
  其实就是提供了一个t函数(就是translation的缩写),它可以翻译文本。
  资源文件可以是JSON,或者是其他格式的文件,内容大概如下:{en:{simpleContent:Justsimplecontent},zh:{simpleContent:这是一段简单的文本}}
  前端runtime的策略原理和上面的类似,就是提前定义一堆JavaScript对象,然后去动态获取它的值而已。
  这么看来似乎前端runtime策略似乎更加简单,但在实际上几乎没有什么人会用这种方案,因为它有一个致命缺点,就是不支持SEO。
  国际化的目的本来就是服务更多的用户群体,考虑做国际化的站点,基本上也会考虑做SEO。路由
  早期的网站很多都没有考虑路由的问题,所有国家的用户都访问同一个网站。但是当中国的用户分享了他老婆网址,他老婆精通中英双语,但是她老婆的浏览器默认是英语,对方想直接看到中文的内容,还需要手动切换语言,很麻烦。而且有些语言的书写和排列都和英语、汉语这类语言不一样,需要单独调整样式。
  基于这些需求,现代的网站在做国际化时都喜欢区分路由,比如web。dev的网址,中文访问是这个地址:web。devi18nzhweb,英文访问是这个地址:web。devi18nenweb。
  甚至还可以转发网址,比如中国用户访问xxx。cn,美国用户访问xxx。com。最流行的i18n库
  从npm周下载量上看,i18next无疑是最流行的i18n库。
  i18next之所以如此受欢迎,是因为i18next不仅仅是针对React或者某个框架而设计的,甚至都不是针对Web这个平台而设计的。它可以用在Node。js、Deno、。NET、php、ruby、IOS、Android等一系列平台上。
  而且i18next也足够老,从2011年末就开源了,比React、Vue这些前端框架都要老,经过了很长时间的考验,基本上没有什么i18n领域的问题是它解决不了的。在React中使用i18next
  为了更好的适配React这个框架,社区又基于i18n开发了reacti18next这个库。
  接下来我会完成一个简单的案例,带大家快速学习reacti18next。基本用法
  首先创建项目。npxcreatereactappreacti18n
  然后安装i18next的依赖项。npmii18nextreacti18nexti18nextbrowserlanguagedetector复制代码i18next提供了翻译的基本能力。reacti18next是i18next的一个插件,用来降低react的使用成本。i18nextbrowserlanguagedetector是用来检测浏览器语言的插件。
  创建i18n。js,具体的注释都在代码中。importi18nfromi18import{initReactI18next}fromreacti18importLanguageDetectorfromi18i18n检测用户当前使用的语言文档:https:github。comi18nexti18nextbrowserlanguageDetector。use(LanguageDetector)注入reacti18next实例。use(initReactI18next)初始化i18next配置参数的文档:https:www。i18next。comoverviewconfigurationoptions。init({debug:true,fallbackLng:en,interpolation:{escapeValue:false,},resources:{en:{translation:{这里是我们的翻译文本}}}});exportdefaulti18n;
  在index。js中导入i18n。js。import。i18n。js
  重新编写App。js中的内容。import{useTranslation,Trans}fromreacti18functionApp(){const{t}useTranslation();return(mainp{t(welcome)}Transi18nKeyauthor作者是:code{Date。now()}Transmain);}exportdefaultAcode
  其中使用到了useTranslation这个Hooks,以及Trans这个组件。
  useTranslation返回的对象包含一个t方法,这个方法可以翻译文本。
  Trans可以翻译一个组件树。
  打开浏览器,这时显示下面的内容:
  我们去i18n。js中添加翻译。importi18nfromi18import{initReactI18next}fromreacti18importLanguageDetectorfromi18i18n检测用户当前使用的语言文档:https:github。comi18nexti18nextbrowserlanguageDetector。use(LanguageDetector)注入reacti18next实例。use(initReactI18next)初始化i18next配置参数的文档:https:www。i18next。comoverviewconfigurationoptions。init({debug:true,fallbackLng:en,interpolation:{escapeValue:false,},resources:{en:{translation:{这里是我们的翻译文本welcome:Welcometomywebsite,author:Authoris:1codeandbeast1,}},zh:{translation:{welcome:欢迎来到我的网站,author:作者是:1代码与野兽1,}}}});exportdefaulti18n;
  现在显示正常了。
  接下来我们再来测试浏览器是英文的情况。
  我用的是Chrome浏览器,其他浏览器操作步骤类似。
  在浏览器设置中搜索languages。
  点击addlanguages,选择English。
  然后需要Movetothetop,把English设置为首选语言。
  重启浏览器。
  这时就被翻译成英语了。
  语言翻译器
  接下来我们实现一个语言切换的功能。import{useTranslation,Trans}fromreacti18constlngs{en:{nativeName:English},zh:{nativeName:中文}};functionApp(){const{t,i18n}useTranslation();return(headerselectonChange{(evt){i18n。changeLanguage(evt。target。value)}}{Object。keys(lngs)。map((lng)(optionkey{lng}value{lng}label{lngs〔lng〕。nativeName}style{{fontWeight:i18n。resolvedLanguagelng?bold:normal}}))}selectheadermainp{t(welcome)}Transi18nKeyauthor作者是:code{Date。now()}Transmain);}exportdefaultAcode
  核心代码是useTranslation返回的i18n。changeLanguage方法,这个方法可以修改用户的当前语言。
  不过i18nextbrowserlanguagedetector会自动尝试检测浏览器的默认语言,我们可以把用户上次手动选择的语言存储到localStorage中,下次访问页面时使用上次存储的语言作为首选语言。插值表达式
  这时你可能会问了,当我们碰到要翻译的内容中存在变量时该怎么办?
  i18next提供了插值的用法。
  我们在t函数中传递第二个参数,它是一个对象。
  比如我们要显示当前时间。
  首先安装dayjs。npmiday。js
  添加一个元素。p{t(currentTime,{time:dayjs()。format(MMDDYYYY)})}
  然后在i18n。js中添加翻译的文本。{resources:{en:{translation:{这里是我们的翻译文本welcome:Welcometomywebsite,author:Authoris:1codeandbeast1,currentTime:Currenttimeis{{time}},}},zh:{translation:{welcome:欢迎来到我的网站,author:作者是:1代码与野兽1,currentTime:当前时间是{{time}},}}}}
  插值表达式的语法是使用两个大花括号包裹属性名。格式化
  如果你想对插值进行格式化,比如中文的日期显示20220905,英文日期显示050922。该怎么做呢?
  i18next提供了格式化的能力。
  首先差值表达式支持第二个值,它是格式化器的名字。{resources:{en:{translation:{这里是我们的翻译文本welcome:Welcometomywebsite,author:Authoris:1codeandbeast1,currentTime:Currenttimeis{{time,DDMMYY}},}},zh:{translation:{welcome:欢迎来到我的网站,author:作者是:1代码与野兽1,currentTime:当前时间是{{time,YYYYMMDD}},}}}}
  然后添加两个格式化器。i18n。services。formatter。add(DDMMYY,(value,lng,options){returndayjs(value)。format(DDMMYY)});i18n。services。formatter。add(YYYYMMDD,(value,lng,options){returndayjs(value)。format(YYYYMMDD)});
  这样就实现了插值文本的格式化。
  除了上面介绍的用法外,i18next还有更多的功能,比如语境、复数、命名空间等。这里就不多做介绍了,详细的内容可以参考i18next的文档。将翻译文件与代码进行拆分
  通常来说,翻译的工作不是程序员干的,而是有专业的业务团队去负责翻译,因为他们对业务术语等更加了解。
  为了方便维护,我们可以选择使用json文件来作为保存翻译文本的资源文件。
  首先需要安装一个库:i18nexthttpbackend。npminstalli18nexthttpbackend复制代码
  然后修改i18n。js的内容,将这个插件用上,并且删除掉原来的resources字段。importi18nfromi18import{initReactI18next}fromreacti18importLanguageDetectorfromi18importdayjsfromdayjsimportBackendfromi18i18n。use(Backend)检测用户当前使用的语言文档:https:github。comi18nexti18nextbrowserlanguageDetector。use(LanguageDetector)注入reacti18next实例。use(initReactI18next)初始化i18next配置参数的文档:https:www。i18next。comoverviewconfigurationoptions。init({debug:true,fallbackLng:en,interpolation:{escapeValue:false,},});newusagei18n。services。formatter。add(DDMMYY,(value,lng,options){returndayjs(value)。format(DDMMYY)});i18n。services。formatter。add(YYYYMMDD,(value,lng,options){returndayjs(value)。format(YYYYMMDD)});exportdefaulti18n;复制代码
  然后在public下面创建locales目录,在这个目录下创建和语言缩写对应的文件夹,其中放置translation。json文件。这个命名是约定好的,backend插件会去按照这个路径请求资源文件。
  翻译的内容和resources的内容一模一样。
  比如zhtranslation。json的内容如下:{welcome:欢迎来到我的网站,author:作者是:1代码与野兽1,currentTime:当前时间是{{time,YYYYMMDD}}}复制代码
  但是这样会让资源文件以异步的方式进行请求,如果网络存在波动,那么有可能请求资源文件失败。
  所以我们还要使用Suspense组件处理加载出错。import{Suspense}functionApp(){。。。}exportdefaultfunctionWrappedApp(){return(SuspensefallbackloadingSuspense);}复制代码locize平台
  i18next有自己的翻译平台locize。app。
  这个平台可以帮助我们整合翻译服务、追踪翻译的更改、版本、机器翻译等一系列功能,它会让我们管理翻译资源文件就像管理代码一样。
  当我们的全球化业务非常庞大时,采用这个平台来处理i18n问题会更加轻松。
  文中介绍的代码部分均为客户端runtime翻译,在更多的实际情况下我们会选择服务端runtime翻译,这时可能会使用nextjs这种SSR框架来处理i18n。
  头条创作挑战赛
投诉 评论 转载

手机用得久,荣耀和vivo谁可以?这4款品控强如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。今天分享,手机用得久,荣耀和vivo谁可以?这4款品控强。第一款:荣耀80GT参考价格:3099……春天吃3鲜,一年病不沾,3鲜指啥?怎么吃?我也才知道!头条创作挑战赛春回大地,万物复苏,到处充满了绿色,一切都是生机勃勃的景色,让人看着就心情愉悦。开春后,大家就不要总躲在家里不出门了,可以多出去踏青,野营,放松一下。……天玑8000迭代款曝光台积电4nm工艺,明年中端价位对位骁龙今年联发科在中端市场可以说站起来了,在安兔兔6月安卓次旗舰手机性能排行榜中,基本全是天玑80008100的机型,搭载骁龙870的vivoS15排到了最后,这波天玑赢麻了。然而今……足球重建法治为先(上)中国球员投告无门现象已有所改善记者贾岩峰报道去年有荣昊、尹鸿博在微博上公开讨薪,今又有蒿俊闵无论是老国脚,还是现役国脚,竟然也都走上了在网络上公开讨薪的道路。就如何解决欠薪以及降薪的法律问题,本报咨询了熟悉……被严重低估的3个千年古城,物美价廉美食多,你去过吗?有一种旅行,叫到古镇里走一走,那些沉淀了千年的古镇,藏了不少旧时的故事,时间越久,魅力也越大。今天我们就看看这被低估的3个千年古城,一起云游吧!福建长汀福建长……不要在垃圾桶里找男人,一个男人不爱你的表现记住,在感情这件事情上,永远不要委屈自己和看轻自己,不要在垃圾桶里找男人,这世间的人这么多,何苦委屈自己只选他一个。快来看看你的他中了几条:他的家人很重要,朋友很重要,同……S13季前赛设计师在努力,英雄联盟将对新老玩家更友好时间过得很快,不知不觉,发现我们平时经常说的神话版本从S11推出到现在,竟然已经过了快两年了。在过去两年中,拳头对英雄联盟进行了许多大刀阔斧的改动调整。其中神话装备系统的……人工智能行业行业格局市场前景产业链及相关企业深度梳理人工智能正成为新一轮科技革命和产业变革的重要驱动力量,正与千行百业深度融合,成为经济结构转型升级的新支点。根据全球人工智能市场研究报告,2021年全球人工智能软件市场规模达到3……前端i18n最佳实践在React中使用i18next本合集文章,授权转载,侵权必究。来源:代码与野兽本文将会介绍i18n的业界最佳实践。聊聊什么是i18n?JavaScript中的i18n基本概念目前业界……阳转阴之后咳嗽不停?这三个中成药是咳嗽克星,止咳化痰清肺通窍通宣理肺丸:可以解表散寒,温肺止嗽,常见感冒咳嗽,白痰、稀痰,恶寒发热,头痛没汗,以及肢体酸痛等情况,舌苔整体为白组成:麻黄,前胡,桔梗,苦杏仁,紫苏叶,甘草,陈皮,制半……中国联通2021年净利达144亿元,同比涨15,移动出账用户3月11日消息,中国联通(00762。HK)发布2021年财报。数据显示,2021年中国联通营业收入达到3279亿元,同比增长7。9;服务收入达到2962亿元,同比增长7……终场结束,9打9!法甲红牌满天飞,单场4红,3场7红,梅西不北京时间8月21日晚9点,法甲第3轮4场比赛同时开球,结果,除了图卢兹和洛里昂之间的比赛之外,其余3场比赛红牌满天飞,昂热对布雷斯特、克莱蒙对尼斯、蒙彼利埃对欧塞尔,3场踢下来……
婴儿呕吐有哪些针灸疗法小蓝罐怎么用润唇膏你用对了吗SpringBoot过滤器拦截器监听器对比及使用场景都市奇门医圣第章实习生如果你愿意我娶你带着心理问题积极生活超越苹果,荣耀真的做到了我的校园全红婵家庭近况爸爸做果园生意,妈妈帮忙,哥哥已开餐厅当老板掏鸟窝被李铁案吓怕了?谈执教国足范志毅改口说自己不够格,足协也不去问界M5和M7的警用车项目造型太帅了
走进枫叶之都蒙特利尔淘宝内容营销之微淘怎么做执着的追踪主题曲唱作才女周渔倾情献唱毕业生求职“精彩”语录托福培训要多久(雅思托福一般要学多久)二十年后回故乡只有理科生能懂的段子VS只有文科生能懂的段子在公交车上掉牙一年级作文2023五一购机建议若预算充足,建议一次到位选这5部中高端手首都圈启用地震预警系统越来越佩服表哥了买沙发买什么材质的好买沙发选择方法

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州