useTranslation.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { useEffect, useState } from 'react';
  2. import { useTranslation as useI18nTranslation } from 'react-i18next';
  3. import { Language, SUPPORTED_LANGUAGES, Locale } from '../../i18n/types';
  4. import { changeLanguage, getCurrentLanguage, getCurrentLocale, onLanguageChanged } from '../../i18n';
  5. export const useTranslation = (ns?: string) => {
  6. const { t, i18n, ready } = useI18nTranslation(ns);
  7. const [currentLanguage, setCurrentLanguage] = useState<Language>(getCurrentLanguage());
  8. const [currentLocale, setCurrentLocale] = useState<Locale>(getCurrentLocale());
  9. // 监听语言变化
  10. useEffect(() => {
  11. const unsubscribe = onLanguageChanged((language: Language) => {
  12. setCurrentLanguage(language);
  13. setCurrentLocale(getCurrentLocale());
  14. });
  15. return unsubscribe;
  16. }, []);
  17. // 切换语言
  18. const switchLanguage = async (language: Language): Promise<boolean> => {
  19. const success = await changeLanguage(language);
  20. if (success) {
  21. setCurrentLanguage(language);
  22. }
  23. return success;
  24. };
  25. // 获取支持的语言列表
  26. const getSupportedLanguages = () => SUPPORTED_LANGUAGES;
  27. // 获取当前语言配置
  28. const getCurrentLanguageConfig = () => {
  29. return SUPPORTED_LANGUAGES.find(lang => lang.code === currentLanguage);
  30. };
  31. // 格式化带参数的文字
  32. const format = (key: string, params?: Record<string, any>) => {
  33. return t(key, params);
  34. };
  35. // 检查是否支持某种语言
  36. const isLanguageSupported = (language: Language) => {
  37. return SUPPORTED_LANGUAGES.some(lang => lang.code === language);
  38. };
  39. // 重置为设备语言
  40. const resetToDeviceLanguage = async (): Promise<boolean> => {
  41. const deviceLocale = getCurrentLocale();
  42. const deviceLanguage = deviceLocale.languageCode as Language;
  43. if (isLanguageSupported(deviceLanguage)) {
  44. return await switchLanguage(deviceLanguage);
  45. }
  46. return await switchLanguage('zh-TW');
  47. };
  48. return {
  49. t,
  50. i18n,
  51. ready,
  52. currentLanguage,
  53. currentLocale,
  54. switchLanguage,
  55. getSupportedLanguages,
  56. getCurrentLanguageConfig,
  57. format,
  58. isLanguageSupported,
  59. resetToDeviceLanguage,
  60. };
  61. };
  62. // 简化的 Hook,用于基本翻译需求
  63. export const useSimpleTranslation = () => {
  64. const { t } = useI18nTranslation();
  65. return { t };
  66. };