国际化
目前的 smallfish 对国际化的支持只有多语言,但是在后续我们会逐步增加更多国际化的支持。
使用多语言
开启 smallfish i18n
// config/config.js
{
"i18n": true
}
设定语言包
smallfish 规定在 src/i18n
下存放你的语言包,像这样:
── src
├── ...
├── i18n // * 国际化相关数据
| ├── zh-CN.json // * 中文语言包
| ├── en-US.json // * 英文语言包
| ├── *.js // * 单个语言的国际化数据
| └── index.js // * 国际化语言数据入口文件
└── ...
可以看到,i18n
目录下有一个入口文件和语言包,入口文件很简单,就是引入各个语言包:
module.exports = {
'en-US': require('./en-US.json'),
'zh-CN': require('./zh-CN.json'),
};
语言包的 json 就更简单了,都是键值对,如下:
// src/i18n/en-US.json
{
"sf_page_SubPage_ChineseTest": "Chinese test",
"sf_page_SubPage_LaLa": "La, la",
"sf_page_SubPage_HaHaHa": "Ha ha ha",
"sf_page_SubPage_IAmContinueToThe": "I am continue to the test",
"sf_page_SubPage_IThink": "I think",
"sf_page_SubPage_Is": "Is",
"sf_page_SubPage_Big": "Big",
"sf_page_SubPage_DDaysHHours": "{{d}} days {{h}} hours",
"sf_page_SubPage_IAmTestHaHa": "I am test ha ha ha",
"sf_page_SubPage_INowWithTheLanguage": "I now with the language a is {{inlanguage}}"
}
在代码里面使用
import i18n from 'smallfish/i18n';
import { Alert } from 'smallfish/antd';
export default () => (
<div>
<Alert message={i18n.t('sf_page_SubPage_LaLa')} />
<span>
{i18n.t('sf_page_SubPage_INowWithTheLanguage', {
inlanguage: i18n.language,
})}
</span>
</div>
);
smallfish/i18n
的底层是 i18next,smallfish 已经帮你配置好了常用的方案,如果有更多需要可以参看对应的文档。
设置默认语言
通常 smallfish/i18n
会检测用户的系统信息自动设置对应的语言,但是如果你想手动设置默认语言可以通过如下方式:
调用 changeLanguage
方法
import i18n from 'smallfish/i18n';
i18n.changeLanguage('zh-CN');
日期多语言
在 smallfish 中我们用 moment 套件做时间日期管理,moment 本身提供了多语言的设置,所以使用也很方便。
// 引入对应的语言包
import 'smallfish/util/moment/locale/zh-cn';
import moment from 'smallfish/util/moment';
moment.fromNow(); // output: 几秒前
更多语言样例参看:moment i18n
自动提取项目文案
目前暂未支持,敬请期待
smallfish 底层依赖了强大的 parrot-tool-must
工具,能够提取项目的文案,这样即使老旧的项目也可以一键替换为支持多语言的项目。
快速上手
修改你的 package.json
,增加 i18n 命令:
{
script: {
...
i18n: 'smallfish i18n',
...
}
}
根目录下运行命令:
# [path] 为指定需要提取的路径,默认是根目录
$ npm run i18n [path] // or yarn i18n [path]
在运行这个命令会做如下几件事:
- smallfish i18n 会扫描对应目录下的所有文件,提取出中文/英文,然后替换这些文案为
i18n
方法:
+ import i18n from 'smallfish/i18n';
import { Alert } from 'smallfish/antd';
export default () => (
<div>
- <Alert message="我本来是个中文" />
+ <Alert message={i18n.t('sf_page_SubPage_LaLa')} />
- <span>当前语言是{inlanguage}</span>
+ <span>
+ {i18n.t('sf_page_SubPage_INowWithTheLanguage', {
+ inlanguage: i18n.language,
+ })}
</span>
</div>
);
- 自动把提取出来的文案增量添加到语言包中,目前支持中文到英文的自动转换,后续还会支持更多语言:
// src/i18n/zh-CN.json
{
...
"sf_page_SubPage_LaLa": "我本来是个中文",
"sf_page_SubPage_INowWithTheLanguage": "当前语言是{{inlanguage}}",
...
}
// src/i18n/zh-CN.json
{
...
"sf_page_SubPage_LaLa": "i am chinese",
"sf_page_SubPage_INowWithTheLanguage": "current language is {{inlanguage}}",
...
}
大功告成,这个操作是增量的,所以在日常开发中你完全可以无需关心多语言替换问题,开发完毕一键替换即可。
← 命令行工具