index.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import * as en from './en';
  2. type I18nParams = readonly unknown[] | Record<string, unknown>;
  3. /**
  4. * 读取语言文本,并替换位置占位符({0})或命名占位符({name})。
  5. */
  6. export function t(path: string, ...params: unknown[]): string {
  7. const language = en;
  8. const value = path.split('.').reduce<unknown>((current, key) => {
  9. if (!current || typeof current !== 'object') return undefined;
  10. return (current as Record<string, unknown>)[key];
  11. }, language);
  12. if (typeof value !== 'string') return path;
  13. if (params.length === 0) return value;
  14. const replacements = getReplacements(params);
  15. return value.replace(/\{([^{}]+)\}/g, (placeholder, key) => {
  16. const replacement = Array.isArray(replacements)
  17. ? replacements[Number(key)]
  18. : replacements[key];
  19. return replacement === undefined ? placeholder : String(replacement);
  20. });
  21. }
  22. export function has(path: string) {
  23. const language = en;
  24. const value = path.split('.').reduce<unknown>((current, key) => {
  25. if (!current || typeof current !== 'object') return undefined;
  26. return (current as Record<string, unknown>)[key];
  27. }, language);
  28. return !!value;
  29. }
  30. function getReplacements(params: unknown[]): I18nParams {
  31. const [firstParam] = params;
  32. if (params.length === 1 && Array.isArray(firstParam)) return firstParam;
  33. if (params.length === 1 && firstParam && typeof firstParam === 'object') {
  34. return firstParam as Record<string, unknown>;
  35. }
  36. return params;
  37. }