美文网首页
i18n 的实现

i18n 的实现

作者: 最尾一名 | 来源:发表于2018-08-30 16:34 被阅读0次

i18n 是指软件等的国际化与本地化,这个看似复杂的功能实现起来其实比较简单

这篇文章主要介绍如何在前端的项目中实现 i18n

首先,将语言包弄成 Json 格式的文件,比如:

zh.json:

{
    "home": "主页",
    "confirm": "确认",
    "cancel": "取消",
    "page1": {
        "title": "标题1",
        "header": "头部1",
        "body": "身体1",
        "footer": "尾部1"
    },
    "page2": {
        "title": "标题2",
        "header": "头部2",
        "body": "身体2",
        "footer": "尾部2"
    },
    "map": {
        statusMap: {
            "success": "成功",
            "fail": "失败"
        }
    }
}

en.json:

{
    "home": "Home",
    "confirm": "Confirm",
    "cancel": "Cancel",
    "page1": {
        "title": "title1",
        "header": "header1",
        "body": "body1",
        "footer": "footer1"
    },
    "page2": {
        "title": "title2",
        "header": "header2",
        "body": "body2",
        "footer": "footer2"
    },
    "map": {
        "statusMap": {
            "success": "Success",
            "fail": "Fail"
        }
    }
}

接下来是最重要的 i18n.js:

import DeviceInfo from 'react-native-device-info';

import ZH from './language/zh.json';
import EN from './language/en.json';

const LanguageMap = {
    'en': EN,
    'zh': ZH
};

/**
 * 解析层级对象
 * @param value {*} {innerObj: {a: 'xxx', b: 'yyy'}} {{a: 'xxx', b: 'yyy'}}
 * @param field innerObj.a a
 */
export const getValue = (value = {}, field = '') => {
    if (typeof value !== 'object') {
        return value;
    }

    const fields = field.split('.');
    return fields.reduce((preVal, currVal) => {
        if (!preVal) return null;
        return preVal[currVal];
    }, value);
};

const getSystemLanguage = () => DeviceInfo.getDeviceLocale().toLowerCase();
const SystemLanguage = getSystemLanguage();

// 定义你的语言设定
export const CurrentLanguage = EnLanguages.includes(SystemLanguage) ? 'en' : 'id';
export const CurrentTranslationConf = LanguageMap[CurrentLanguage];

export const translate = (path) => {
    return getValue(CurrentTranslationConf, path) || path;
};

export const translateMap = (path) => {
    const map = getValue(CurrentTranslationConf, path);

    if (!map) {
        const zhMap = getValue(TranslateMap.zh, path) || {};
        return Object.keys(zhMap).reduce((acc, cur) => ({...acc, [cur]: cur}), {});
    }

    return map;
};

在项目中使用:

import {translate as t, translateMap as tMap} from '../i18n.js';

const statusMap = tMap('map.statusMap');

const title = t('page1.title');

// ...

相关文章

  • python i18n实现

    本文简单介绍python实现i18n的方法。i18n来源于英文单词internationalization的首末字...

  • vue 消除i18n翻译错误警告和router重复警告

    vue i18n消除翻译错误警告 实现: router重复警告 实现:

  • jquery 使用i8n 的坑点

    最近公司的官网需要做国际化,提出的需求是要实现中英文切换,所以我选择i18n 这个插件 1、先下载i18n 插件 ...

  • i18n 的实现

    i18n 是指软件等的国际化与本地化,这个看似复杂的功能实现起来其实比较简单 这篇文章主要介绍如何在前端的项目中实...

  • angular8+ng-zorro支持i18n

    angular8+ng-zorro i18n方案 1.采用的技术方案 2.实现的具体方案

  • i18n实现前端国际化(实例)

    在今日的需求中需要利用 i18n 这个框架来实现前端的国家化操作,下图是实现效果: 点击选择框实现网页上语言的切换...

  • angular 国际化 (i18n)

    Internationalization (i18n) 国际化 (i18n) If you are working...

  • Grails国际化实例

    Grails实现国际化(中英文切换) 在grails-app/i18n分别配置英文(messages.proper...

  • Django 基于 gettext 的国际化

    Django 框架具有很好的 I18N 和 L10N 的支持,其实现是基于 GNU 的 gettext。 设置 在...

  • i18n国际化配置

    最近做了一个i18n国际化配置下面是详细过程: 下载i18n 创建i18n文件夹image.png 创建翻译的文本...

网友评论

      本文标题:i18n 的实现

      本文链接:https://www.haomeiwen.com/subject/ziqdwftx.html