多語言i18n
往常的做法是一個語言一個配置檔案, 但是這樣需要新增一個新的字串時, 需要逐個開啟許多個語言檔案, 常常會漏, 並且每次修改一個字元都要編輯好幾個檔案.
我們換一種思路, 把 i18n
的多語言直接寫在當前程式碼中,而不是寫在配置檔案中.
思路
用一個方法,根據開發環境當前瀏覽器語言去處理應該使用哪個字串, 並且暴露設定當前語言的函式,以相容 nodejs 端或者開發人員擴充套件其他語言. 該庫僅僅不到 70 行程式碼, 實現一個精巧的i18fn
.
使用
安裝 i18fn
庫:
$ npm i --save i18fn
複製程式碼
const i18fn = require(`i18fn`);
const hello = i18fn.lang({ english: `hello`, chinese: `你好` });
console.log(hello);
複製程式碼
使用引數
const i18fn = require(`i18fn`);
const personHello = i18fn.lang(
{ English: `__person__, hello`, Chinese: `__person__, 你好` },
{
person: { English: `Mr.Ming`, Chinese: `小明` },
},
);
console.log(personHello);
});
複製程式碼
自動語言缺失排查
如果瀏覽器語言是中文, 而你忘記新增中文的語言內容, 在開發模式中會做錯誤提示, 如下面這行程式碼:
const say = i18fn.lang({ English: `hello` });
// 在生產環境, i18fn 使用英文作為代替
// 在開發環境, i18fn 會新增 - [Miss i18fn: languageType] 在英文後頭
if (process.env.NODE_ENV === `production`) {
console.log(say); // hello
} else {
console.log(say); // hello - [Miss i18fn: english]
}
複製程式碼
設定當前語言
如果我們要使用設定修改當前語言,可以手動修改當前語言以覆蓋瀏覽器的語言識別:
const i18fn = require(`i18fn`);
i18fn.setNowLanguage(`Chinese`);
複製程式碼
如果你還是喜歡把 i18n 寫在配置檔案裡
如果我們希望文案可以更好的複用, 我們也可以這樣把多個語言寫在一個檔案中:
const { lang } = require(`i18fn`);
const languages = {
done: lang({ English: `done!`, Chinese: `完成!` }),
hello: lang({ English: `hello`, Chinese: `你好` }),
};
// use
console.log(languages.done);
console.log(languages.hello);
複製程式碼
當前支援自動識別的語言
- English
- Chinese
- ChineseTraditional
- Dutch
- Korea
- French
- German
- Japanese
- Italian
- Portuguese
- Spanish
- Swedish
- Russian
- Arabic
- Vietnamese
- Polish
- Finnish
- Afrikaans
- Khmer
- Thai
- Turkish
- Ukrainian
- Zulu
增加其他語言判斷
如果你的應用需要新增匈牙利, 你可以這樣:
const i18fn = require(`i18fn`);
i18fn.addLanguage(`hu-HU`, `Magyar`);
// ok like default use:
const hello = i18fn.lang({ English: `hello`, Magyar: `helló` });
console.log(hello);
複製程式碼
測試可靠性
安裝測試包:
$ yarn install && yarn test
複製程式碼
你可以嘗試測試, 測試內容編寫在 src/index.test.js, 以下是通過的測試:
$ jest
PASS src/index.test.js
✓ test chinese (4ms)
✓ test english
✓ test english params (1ms)
✓ test english params, use object
✓ test config
✓ test config function (1ms)
✓ test error chinese
✓ test error english
✓ test error chinese prod
✓ test error english prod (1ms)
✓ test add other language
Test Suites: 1 passed, 1 total
Tests: 10 passed, 10 total
Snapshots: 0 total
Time: 1.257s
Ran all test suites.
✨ Done in 1.80s.
複製程式碼
這就是全部, 謝謝!
i18fn is MIT licensed.