【高频考点精讲】前端国际化(i18n)解决方案,从语言包到日期格式处理

前端国际化(i18n)解决方案:从语言包到日期格式处理

大家好,我是全栈老李。今天咱们聊聊前端国际化(i18n)这个事儿。你可能觉得国际化不就是翻译文字吗?其实远不止如此。从语言包管理到日期、货币、数字的本地化处理,再到RTL(从右到左)语言的支持,这里头的门道可不少。

国际化(i18n)到底是个啥?

国际化(Internationalization,简称i18n,因为首字母i和末字母n之间有18个字母)的核心目标是让产品能轻松适配不同语言和地区的用户。举个例子,你开发了一个电商网站,中国用户看到的是中文和人民币价格,美国用户看到的是英文和美元价格,沙特用户看到的是阿拉伯语(从右到左排版)和沙特里亚尔价格。

国际化不仅仅是翻译,还包括:

语言包管理(多语言文案)
日期、时间格式化(美国用MM/DD/YYYY,中国用YYYY-MM-DD
数字、货币格式化(千分位分隔符、小数点符号不同)
RTL语言支持(阿拉伯语、希伯来语等从右到左排版)

代码实战:从语言包到日期处理

1. 语言包管理(React示例)

假设我们用react-i18next这个库(基于i18next),先安装:

npm install i18next react-i18next

然后配置语言包:

// i18n.js  
import i18n from 'i18next';
import {
             initReactI18next } from 'react-i18next';

// 语言包资源(全栈老李提醒:实际项目建议按需加载)
const resources = {
            
  en: {
            
    translation: {
            
      welcome: 'Welcome, {
            {name}}!',
      price: 'Price: {
            {price, currency}}',
    },
  },
  zh: {
            
    translation: {
            
      welcome: '欢迎, {
            {name}}!',
      price: '价格:{
            {price, currency}}',
    },
  },
};

i18n.use(initReactI18next).init({
            
  resources,
  lng: 'zh', // 默认语言
  interpolation: {
            
    escapeValue: false, // React已经处理XSS
    format: (value, format) => {
            
      if (format === 'currency') {
            
        return new Intl.NumberFormat(i18n.language, {
            
          style: 'currency',
          currency: i18n.language === 'zh' ? 'CNY' : 'USD',
        }).format(value);
      }
      return value;
    },
  },
});

export default i18n;

在组件中使用:

import { useTranslation } from 'react-i18next';

function Greeting() {
  const { t } = useTranslation();
  return (
    <div>
      <h1>{t('welcome', { name: '全栈老李' })}</h1>
      <p>{t('price', { price: 100 })}</p>
    </div>
  );
}

输出结果:

中文:欢迎, 全栈老李!价格:¥100.00
英文:Welcome, 全栈老李!Price: $100.00

2. 日期格式化

不同地区的日期格式差异很大:

中国:2023-10-05
美国:10/05/2023
日本:2023年10月5日

Intl.DateTimeFormat处理:

const date = new Date('2023-10-05');

// 中文格式
console.log(new Intl.DateTimeFormat('zh-CN').format(date)); // 2023/10/5

// 美国格式
console.log(new Intl.DateTimeFormat('en-US').format(date)); // 10/5/2023

// 沙特阿拉伯(RTL语言)
console.log(new Intl.DateTimeFormat('ar-SA').format(date)); // ٥/١٠/٢٠٢٣

3. RTL语言支持

阿拉伯语、希伯来语等是从右到左排版的。CSS可以通过direction属性控制:

.rtl {
            
  direction: rtl;
  text-align: right;
}

或者在HTML中直接设置:

<html dir="rtl" lang="ar">

使用场景

多语言网站:比如企业官网、电商平台(亚马逊、阿里国际站)。
SAAS产品:比如Notion、Figma,用户遍布全球。
开源项目:比如Vue、React的文档支持多语言。

课后作业:手写一个简单的i18n函数

题目:实现一个简单的i18n函数,支持中英文切换和插值变量。

const translations = {
            
  en: {
            
    greeting: 'Hello, {
            {name}}!',
    today: 'Today is {
            {date}}',
  },
  zh: {
            
    greeting: '你好, {
            {name}}!',
    today: '今天是{
            {date}}',
  },
};

function i18n(lang, key, variables) {
            
  // 你的实现
}

// 测试用例
console.log(i18n('zh', 'greeting', {
             name: '全栈老李' })); // 输出:你好, 全栈老李!
console.log(i18n('en', 'today', {
             date: '2023-10-05' })); // 输出:Today is 2023-10-05

要求

支持语言切换和变量插值。
如果语言或key不存在,返回默认值(如[Missing translation])。

把你的答案发在评论区,我会随机抽几位同学的代码进行点评哦!


以上就是今天的内容,我是全栈老李,专注分享前端和全栈干货。如果你觉得有用,别忘了点赞关注,我们下期再见! 🚀

🔥 必看面试题

【初级】前端开发工程师面试100题(一)
【初级】前端开发工程师面试100题(二)
【初级】前端开发工程师的面试100题(速记版)

我是全栈老李,一个资深Coder!

写码不易,如果你觉得本文有收获,点赞 + 收藏走一波!感谢鼓励🌹🌹🌹

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容