index.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  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 value = path.split('.').reduce<unknown>((current, key) => {
  8. if (!current || typeof current !== 'object') return undefined;
  9. return (current as Record<string, unknown>)[key];
  10. }, en);
  11. if (typeof value !== 'string') return path;
  12. if (params.length === 0) return value;
  13. const replacements = getReplacements(params);
  14. return value.replace(/\{([^{}]+)\}/g, (placeholder, key) => {
  15. const replacement = Array.isArray(replacements)
  16. ? replacements[Number(key)]
  17. : replacements[key];
  18. return replacement === undefined ? placeholder : String(replacement);
  19. });
  20. }
  21. function getReplacements(params: unknown[]): I18nParams {
  22. const [firstParam] = params;
  23. if (params.length === 1 && Array.isArray(firstParam)) return firstParam;
  24. if (params.length === 1 && firstParam && typeof firstParam === 'object') {
  25. return firstParam as Record<string, unknown>;
  26. }
  27. return params;
  28. }