i18n.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.resolveI18nLocale = exports.initLocales = exports.getLocaleFiles = exports.isUniAppLocaleFile = exports.initI18nOptionsOnce = exports.initI18nOptions = void 0;
  7. const fs_1 = __importDefault(require("fs"));
  8. const path_1 = __importDefault(require("path"));
  9. const fast_glob_1 = require("fast-glob");
  10. const shared_1 = require("@vue/shared");
  11. const uni_shared_1 = require("@dcloudio/uni-shared");
  12. const json_1 = require("./json");
  13. const messages_1 = require("./messages");
  14. function initI18nOptions(platform, inputDir, warning = false, withMessages = true) {
  15. const locales = initLocales(path_1.default.resolve(inputDir, 'locale'), withMessages);
  16. if (!Object.keys(locales).length) {
  17. return;
  18. }
  19. const manifestJson = (0, json_1.parseManifestJsonOnce)(inputDir);
  20. let fallbackLocale = manifestJson.fallbackLocale || 'en';
  21. const locale = resolveI18nLocale(platform, Object.keys(locales), fallbackLocale);
  22. if (warning) {
  23. if (!fallbackLocale) {
  24. console.warn(messages_1.M['i18n.fallbackLocale.default'].replace('{locale}', locale));
  25. }
  26. else if (locale !== fallbackLocale) {
  27. console.warn(messages_1.M['i18n.fallbackLocale.missing'].replace('{locale}', fallbackLocale));
  28. }
  29. }
  30. return {
  31. locale,
  32. locales,
  33. delimiters: uni_shared_1.I18N_JSON_DELIMITERS,
  34. };
  35. }
  36. exports.initI18nOptions = initI18nOptions;
  37. exports.initI18nOptionsOnce = (0, uni_shared_1.once)(initI18nOptions);
  38. const localeJsonRE = /uni-app.*.json/;
  39. function isUniAppLocaleFile(filepath) {
  40. if (!filepath) {
  41. return false;
  42. }
  43. return localeJsonRE.test(path_1.default.basename(filepath));
  44. }
  45. exports.isUniAppLocaleFile = isUniAppLocaleFile;
  46. function parseLocaleJson(filepath) {
  47. let jsonObj = (0, json_1.parseJson)(fs_1.default.readFileSync(filepath, 'utf8'));
  48. if (isUniAppLocaleFile(filepath)) {
  49. jsonObj = jsonObj.common || {};
  50. }
  51. return jsonObj;
  52. }
  53. function getLocaleFiles(cwd) {
  54. return (0, fast_glob_1.sync)('*.json', { cwd, absolute: true });
  55. }
  56. exports.getLocaleFiles = getLocaleFiles;
  57. function initLocales(dir, withMessages = true) {
  58. if (!fs_1.default.existsSync(dir)) {
  59. return {};
  60. }
  61. return fs_1.default.readdirSync(dir).reduce((res, filename) => {
  62. if (path_1.default.extname(filename) === '.json') {
  63. try {
  64. const locale = path_1.default
  65. .basename(filename)
  66. .replace(/(uni-app.)?(.*).json/, '$2');
  67. if (withMessages) {
  68. (0, shared_1.extend)(res[locale] || (res[locale] = {}), parseLocaleJson(path_1.default.join(dir, filename)));
  69. }
  70. else {
  71. res[locale] = {};
  72. }
  73. }
  74. catch (e) { }
  75. }
  76. return res;
  77. }, {});
  78. }
  79. exports.initLocales = initLocales;
  80. function resolveI18nLocale(platform, locales, locale) {
  81. if (locale && locales.includes(locale)) {
  82. return locale;
  83. }
  84. const defaultLocales = ['zh-Hans', 'zh-Hant'];
  85. if (platform === 'app' || platform === 'h5') {
  86. defaultLocales.unshift('en');
  87. }
  88. else {
  89. // 小程序
  90. defaultLocales.push('en');
  91. }
  92. return defaultLocales.find((locale) => locales.includes(locale)) || locales[0];
  93. }
  94. exports.resolveI18nLocale = resolveI18nLocale;