0.5.0 • Published 4 months ago
mobx-i18n v0.5.0
MobX i18n
Responsive Translation utility based on TypeScript & MobX
Features
- Type hinting of Text keys
- Lambda Expression values
- Space utility for CJK & other characters
- Responsive re-rendering
- Async loading of Language packages
- support HTTP protocol for Server-side rendering
- support BOM/DOM language API for Client-side rendering
Versions
SemVer | branch | status | ES decorator | MobX |
---|---|---|---|---|
>=0.5.0 | main | ✅developing | stage-3 | >=6.11 |
<0.5.0 | master | ❌deprecated | stage-2 | >=4 <6.11 |
React/Next.js example
Original from https://github.com/kaiyuanshe/kaiyuanshe.github.io
Installation
npm i mobx mobx-react mobx-i18n
Configuration
tsconfig.json
{
"compilerOptions": {
"target": "ES6",
"useDefineForClassFields": true,
"experimentalDecorators": false
}
}
Translation
translation/zh-CN.ts
import { textJoin } from 'mobx-i18n';
export default {
open_source: '开源',
project: '项目',
love: ({ a, b }: Record<'a' | 'b', string>) => textJoin(a, '爱', b)
} as const;
translation/en-US.ts
import { textJoin } from 'mobx-i18n';
export default {
open_source: 'Open Source',
project: 'project',
love: ({ a, b }: Record<'a' | 'b', string>) => textJoin(a, 'love', b)
} as const;
Initialization
model/Translation.ts
export const i18n = new TranslationModel({
'zh-CN': zhCN,
'en-US': () => import('../translation/en-US')
});
export const LanguageName: Record<(typeof i18n)['currentLanguage'], string> = {
'zh-CN': '简体中文',
'en-US': 'English'
};
pages/index.ts
import { GetServerSideProps } from 'next';
import { textJoin, parseLanguageHeader } from 'mobx-i18n';
import { i18n, LanguageName } from 'model/Translation';
export const getServerSideProps: GetServerSideProps = ({ req }) => {
const languages = parseLanguageHeader(req.headers['accept-language'] || '');
await i18n.loadLanguages(languages);
return { props: {} };
};
@observer
export default class HomePage extends PureComponent {
render() {
const { currentLanguage, t } = i18n;
return (
<>
<select
value={currentLanguage}
onChange={({ currentTarget: { value } }) =>
i18n.changeLanguage(value as typeof currentLanguage)
}
>
{Object.entries(LanguageName).map(([code, name]) => (
<option key={code} value={code}>
{name}
</option>
))}
</select>
<p>
{t('love', {
a: '我',
b: textJoin(t('open_source'), t('project'))
})}
</p>
</>
);
}
}
Inspired by
0.5.0
4 months ago
0.4.2
6 months ago
0.4.1
9 months ago
0.3.15
11 months ago
0.4.0-rc.1
9 months ago
0.4.0-rc.0
9 months ago
0.4.0
9 months ago
0.3.14
1 year ago
0.3.13
1 year ago
0.3.12
1 year ago
0.3.11
1 year ago
0.3.10
1 year ago
0.3.9
1 year ago
0.3.8
1 year ago
0.3.7
1 year ago
0.3.6
1 year ago
0.3.5
1 year ago
0.3.4
1 year ago
0.3.3
1 year ago
0.3.2
1 year ago
0.3.1
1 year ago
0.3.0
1 year ago