@xiping/react-i18n 1.0.7 → 1.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -128,7 +128,10 @@ var createI18nStore = (options) => {
128
128
 
129
129
  // src/context.tsx
130
130
  var I18nContext = (0, import_react.createContext)(null);
131
- var I18nProvider = ({ options, children }) => {
131
+ var I18nProvider = ({
132
+ options,
133
+ children
134
+ }) => {
132
135
  const store = (0, import_react.useState)(() => createI18nStore(options))[0];
133
136
  const locale = store((state) => state.locale);
134
137
  const setLocale = store((state) => state.setLocale);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context.tsx","../src/store.ts","../src/utils.ts"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './utils';\nexport { createI18nStore } from './store'; ","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { I18nProviderProps, UseI18nResult } from './types';\nimport { createI18nStore } from './store';\n\n// 创建上下文\nconst I18nContext = createContext<UseI18nResult | null>(null);\n\n/**\n * i18n提供者组件\n */\nexport const I18nProvider: React.FC<I18nProviderProps> = ({ options, children }) => {\n const store = useState(() => createI18nStore(options))[0];\n \n // 使用 store 函数获取状态\n const locale = store((state) => state.locale);\n const setLocale = store((state) => state.setLocale);\n const t = store((state) => state.t);\n const loading = store((state) => state.loading);\n const error = store((state) => state.error);\n \n // 初始化时加载默认语言资源\n useEffect(() => {\n setLocale(locale);\n }, []);\n \n const value: UseI18nResult = {\n locale,\n locales: options.locales,\n setLocale,\n t,\n loading,\n error,\n };\n \n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n};\n\n/**\n * 使用i18n的钩子\n */\nexport const useI18n = (): UseI18nResult => {\n const context = useContext(I18nContext);\n \n if (!context) {\n throw new Error('useI18n must be used within an I18nProvider');\n }\n \n return context;\n}; ","import { create } from 'zustand';\nimport { I18nOptions, I18nState, ResourceLoader, TranslateFunction } from './types';\n\n/**\n * 默认资源加载器\n */\nconst defaultResourceLoader: ResourceLoader = () => ({});\n\n/**\n * 创建i18n存储\n */\nexport const createI18nStore = (options: I18nOptions) => {\n const {\n defaultLocale,\n locales,\n resourceLoader = defaultResourceLoader,\n storageKey = 'i18n_locale',\n loadFromStorage = true,\n } = options;\n\n // 从本地存储获取初始语言\n const getInitialLocale = (): string => {\n if (loadFromStorage && typeof window !== 'undefined') {\n const storedLocale = localStorage.getItem(storageKey);\n if (storedLocale && locales.includes(storedLocale)) {\n return storedLocale;\n }\n }\n return defaultLocale;\n };\n\n // 创建翻译函数\n const createTranslateFunction = (resources: Record<string, Record<string, any>>): TranslateFunction => {\n return (key: string, params?: Record<string, any>) => {\n const keys = key.split('.');\n let value: any = resources[getInitialLocale()];\n \n // 遍历键路径获取翻译值\n for (const k of keys) {\n if (value === undefined || value === null) {\n return key;\n }\n value = value[k];\n }\n \n // 如果找不到翻译,返回键名\n if (value === undefined || value === null) {\n return key;\n }\n \n // 替换参数\n if (params && typeof value === 'string') {\n return value.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n }\n \n return String(value);\n };\n };\n\n return create<I18nState>((set, get) => ({\n locale: getInitialLocale(),\n resources: {},\n loading: false,\n error: null,\n \n setLocale: async (locale: string) => {\n // 检查语言是否支持\n if (!locales.includes(locale)) {\n set({ error: new Error(`Locale ${locale} is not supported`) });\n return;\n }\n \n // 如果语言已经加载,直接切换\n if (get().resources[locale]) {\n set({ locale });\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n return;\n }\n \n // 加载语言资源\n set({ loading: true, error: null });\n try {\n const resources = await resourceLoader(locale);\n set((state) => ({\n locale,\n resources: { ...state.resources, [locale]: resources },\n loading: false,\n }));\n \n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n } catch (error) {\n set({ \n error: error instanceof Error ? error : new Error('Failed to load resources'),\n loading: false \n });\n }\n },\n \n t: (key: string, params?: Record<string, any>) => {\n const { resources } = get();\n const translate = createTranslateFunction(resources);\n return translate(key, params);\n },\n }));\n}; ","import { ResourceLoader } from './types';\n\n/**\n * 创建本地资源加载器\n * @param resources 本地资源对象\n */\nexport const createLocalResourceLoader = (resources: Record<string, Record<string, any>>): ResourceLoader => {\n return (locale: string) => {\n if (!resources[locale]) {\n throw new Error(`Locale ${locale} not found in local resources`);\n }\n return resources[locale];\n };\n};\n\n/**\n * 创建远程资源加载器\n * @param baseUrl 资源基础URL\n * @param format 资源文件格式,默认为json\n */\nexport const createRemoteResourceLoader = (\n baseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n return async (locale: string) => {\n try {\n const response = await fetch(`${baseUrl}/${locale}.${format}`);\n \n if (!response.ok) {\n throw new Error(`Failed to load resources for locale ${locale}`);\n }\n \n return await response.json();\n } catch (error) {\n throw new Error(`Failed to load resources for locale ${locale}: ${error}`);\n }\n };\n};\n\n/**\n * 创建混合资源加载器(先尝试本地,再尝试远程)\n * @param localResources 本地资源对象\n * @param remoteBaseUrl 远程资源基础URL\n * @param format 远程资源文件格式,默认为json\n */\nexport const createHybridResourceLoader = (\n localResources: Record<string, Record<string, any>>,\n remoteBaseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n const localLoader = createLocalResourceLoader(localResources);\n const remoteLoader = createRemoteResourceLoader(remoteBaseUrl, format);\n \n return async (locale: string) => {\n try {\n // 先尝试本地资源\n return localLoader(locale);\n } catch (error) {\n // 本地资源不存在,尝试远程加载\n return remoteLoader(locale);\n }\n };\n}; "],"mappings":"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","names":["key","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context.tsx","../src/store.ts","../src/utils.ts"],"sourcesContent":["export * from './types';\nexport * from './context';\nexport * from './utils';\nexport { createI18nStore } from './store'; ","import React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { I18nProviderProps, UseI18nResult } from \"./types\";\nimport { createI18nStore } from \"./store\";\n\n// 创建上下文\nconst I18nContext = createContext<UseI18nResult | null>(null);\n\n/**\n * i18n提供者组件\n */\nexport const I18nProvider: React.FC<I18nProviderProps> = ({\n options,\n children,\n}) => {\n const store = useState(() => createI18nStore(options))[0];\n\n // 使用 store 函数获取状态\n const locale = store((state) => state.locale);\n const setLocale = store((state) => state.setLocale);\n const t = store((state) => state.t);\n const loading = store((state) => state.loading);\n const error = store((state) => state.error);\n\n // 初始化时加载默认语言资源\n useEffect(() => {\n setLocale(locale);\n }, []);\n\n const value: UseI18nResult = {\n locale,\n locales: options.locales,\n setLocale,\n t,\n loading,\n error,\n };\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n};\n\n/**\n * 使用i18n的钩子\n */\nexport const useI18n = (): UseI18nResult => {\n const context = useContext(I18nContext);\n\n if (!context) {\n throw new Error(\"useI18n must be used within an I18nProvider\");\n }\n\n return context;\n};\n","import { create } from 'zustand';\nimport { I18nOptions, I18nState, ResourceLoader, TranslateFunction } from './types';\n\n/**\n * 默认资源加载器\n */\nconst defaultResourceLoader: ResourceLoader = () => ({});\n\n/**\n * 创建i18n存储\n */\nexport const createI18nStore = (options: I18nOptions) => {\n const {\n defaultLocale,\n locales,\n resourceLoader = defaultResourceLoader,\n storageKey = 'i18n_locale',\n loadFromStorage = true,\n } = options;\n\n // 从本地存储获取初始语言\n const getInitialLocale = (): string => {\n if (loadFromStorage && typeof window !== 'undefined') {\n const storedLocale = localStorage.getItem(storageKey);\n if (storedLocale && locales.includes(storedLocale)) {\n return storedLocale;\n }\n }\n return defaultLocale;\n };\n\n // 创建翻译函数\n const createTranslateFunction = (resources: Record<string, Record<string, any>>): TranslateFunction => {\n return (key: string, params?: Record<string, any>) => {\n const keys = key.split('.');\n let value: any = resources[getInitialLocale()];\n \n // 遍历键路径获取翻译值\n for (const k of keys) {\n if (value === undefined || value === null) {\n return key;\n }\n value = value[k];\n }\n \n // 如果找不到翻译,返回键名\n if (value === undefined || value === null) {\n return key;\n }\n \n // 替换参数\n if (params && typeof value === 'string') {\n return value.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n }\n \n return String(value);\n };\n };\n\n return create<I18nState>((set, get) => ({\n locale: getInitialLocale(),\n resources: {},\n loading: false,\n error: null,\n \n setLocale: async (locale: string) => {\n // 检查语言是否支持\n if (!locales.includes(locale)) {\n set({ error: new Error(`Locale ${locale} is not supported`) });\n return;\n }\n \n // 如果语言已经加载,直接切换\n if (get().resources[locale]) {\n set({ locale });\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n return;\n }\n \n // 加载语言资源\n set({ loading: true, error: null });\n try {\n const resources = await resourceLoader(locale);\n set((state) => ({\n locale,\n resources: { ...state.resources, [locale]: resources },\n loading: false,\n }));\n \n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n } catch (error) {\n set({ \n error: error instanceof Error ? error : new Error('Failed to load resources'),\n loading: false \n });\n }\n },\n \n t: (key: string, params?: Record<string, any>) => {\n const { resources } = get();\n const translate = createTranslateFunction(resources);\n return translate(key, params);\n },\n }));\n}; ","import { ResourceLoader } from './types';\n\n/**\n * 创建本地资源加载器\n * @param resources 本地资源对象\n */\nexport const createLocalResourceLoader = (resources: Record<string, Record<string, any>>): ResourceLoader => {\n return (locale: string) => {\n if (!resources[locale]) {\n throw new Error(`Locale ${locale} not found in local resources`);\n }\n return resources[locale];\n };\n};\n\n/**\n * 创建远程资源加载器\n * @param baseUrl 资源基础URL\n * @param format 资源文件格式,默认为json\n */\nexport const createRemoteResourceLoader = (\n baseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n return async (locale: string) => {\n try {\n const response = await fetch(`${baseUrl}/${locale}.${format}`);\n \n if (!response.ok) {\n throw new Error(`Failed to load resources for locale ${locale}`);\n }\n \n return await response.json();\n } catch (error) {\n throw new Error(`Failed to load resources for locale ${locale}: ${error}`);\n }\n };\n};\n\n/**\n * 创建混合资源加载器(先尝试本地,再尝试远程)\n * @param localResources 本地资源对象\n * @param remoteBaseUrl 远程资源基础URL\n * @param format 远程资源文件格式,默认为json\n */\nexport const createHybridResourceLoader = (\n localResources: Record<string, Record<string, any>>,\n remoteBaseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n const localLoader = createLocalResourceLoader(localResources);\n const remoteLoader = createRemoteResourceLoader(remoteBaseUrl, format);\n \n return async (locale: string) => {\n try {\n // 先尝试本地资源\n return localLoader(locale);\n } catch (error) {\n // 本地资源不存在,尝试远程加载\n return remoteLoader(locale);\n }\n };\n}; "],"mappings":"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","names":["key","React"]}
package/dist/index.mjs CHANGED
@@ -87,7 +87,10 @@ var createI18nStore = (options) => {
87
87
 
88
88
  // src/context.tsx
89
89
  var I18nContext = createContext(null);
90
- var I18nProvider = ({ options, children }) => {
90
+ var I18nProvider = ({
91
+ options,
92
+ children
93
+ }) => {
91
94
  const store = useState(() => createI18nStore(options))[0];
92
95
  const locale = store((state) => state.locale);
93
96
  const setLocale = store((state) => state.setLocale);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.tsx","../src/store.ts","../src/utils.ts"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { I18nProviderProps, UseI18nResult } from './types';\nimport { createI18nStore } from './store';\n\n// 创建上下文\nconst I18nContext = createContext<UseI18nResult | null>(null);\n\n/**\n * i18n提供者组件\n */\nexport const I18nProvider: React.FC<I18nProviderProps> = ({ options, children }) => {\n const store = useState(() => createI18nStore(options))[0];\n \n // 使用 store 函数获取状态\n const locale = store((state) => state.locale);\n const setLocale = store((state) => state.setLocale);\n const t = store((state) => state.t);\n const loading = store((state) => state.loading);\n const error = store((state) => state.error);\n \n // 初始化时加载默认语言资源\n useEffect(() => {\n setLocale(locale);\n }, []);\n \n const value: UseI18nResult = {\n locale,\n locales: options.locales,\n setLocale,\n t,\n loading,\n error,\n };\n \n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n};\n\n/**\n * 使用i18n的钩子\n */\nexport const useI18n = (): UseI18nResult => {\n const context = useContext(I18nContext);\n \n if (!context) {\n throw new Error('useI18n must be used within an I18nProvider');\n }\n \n return context;\n}; ","import { create } from 'zustand';\nimport { I18nOptions, I18nState, ResourceLoader, TranslateFunction } from './types';\n\n/**\n * 默认资源加载器\n */\nconst defaultResourceLoader: ResourceLoader = () => ({});\n\n/**\n * 创建i18n存储\n */\nexport const createI18nStore = (options: I18nOptions) => {\n const {\n defaultLocale,\n locales,\n resourceLoader = defaultResourceLoader,\n storageKey = 'i18n_locale',\n loadFromStorage = true,\n } = options;\n\n // 从本地存储获取初始语言\n const getInitialLocale = (): string => {\n if (loadFromStorage && typeof window !== 'undefined') {\n const storedLocale = localStorage.getItem(storageKey);\n if (storedLocale && locales.includes(storedLocale)) {\n return storedLocale;\n }\n }\n return defaultLocale;\n };\n\n // 创建翻译函数\n const createTranslateFunction = (resources: Record<string, Record<string, any>>): TranslateFunction => {\n return (key: string, params?: Record<string, any>) => {\n const keys = key.split('.');\n let value: any = resources[getInitialLocale()];\n \n // 遍历键路径获取翻译值\n for (const k of keys) {\n if (value === undefined || value === null) {\n return key;\n }\n value = value[k];\n }\n \n // 如果找不到翻译,返回键名\n if (value === undefined || value === null) {\n return key;\n }\n \n // 替换参数\n if (params && typeof value === 'string') {\n return value.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n }\n \n return String(value);\n };\n };\n\n return create<I18nState>((set, get) => ({\n locale: getInitialLocale(),\n resources: {},\n loading: false,\n error: null,\n \n setLocale: async (locale: string) => {\n // 检查语言是否支持\n if (!locales.includes(locale)) {\n set({ error: new Error(`Locale ${locale} is not supported`) });\n return;\n }\n \n // 如果语言已经加载,直接切换\n if (get().resources[locale]) {\n set({ locale });\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n return;\n }\n \n // 加载语言资源\n set({ loading: true, error: null });\n try {\n const resources = await resourceLoader(locale);\n set((state) => ({\n locale,\n resources: { ...state.resources, [locale]: resources },\n loading: false,\n }));\n \n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n } catch (error) {\n set({ \n error: error instanceof Error ? error : new Error('Failed to load resources'),\n loading: false \n });\n }\n },\n \n t: (key: string, params?: Record<string, any>) => {\n const { resources } = get();\n const translate = createTranslateFunction(resources);\n return translate(key, params);\n },\n }));\n}; ","import { ResourceLoader } from './types';\n\n/**\n * 创建本地资源加载器\n * @param resources 本地资源对象\n */\nexport const createLocalResourceLoader = (resources: Record<string, Record<string, any>>): ResourceLoader => {\n return (locale: string) => {\n if (!resources[locale]) {\n throw new Error(`Locale ${locale} not found in local resources`);\n }\n return resources[locale];\n };\n};\n\n/**\n * 创建远程资源加载器\n * @param baseUrl 资源基础URL\n * @param format 资源文件格式,默认为json\n */\nexport const createRemoteResourceLoader = (\n baseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n return async (locale: string) => {\n try {\n const response = await fetch(`${baseUrl}/${locale}.${format}`);\n \n if (!response.ok) {\n throw new Error(`Failed to load resources for locale ${locale}`);\n }\n \n return await response.json();\n } catch (error) {\n throw new Error(`Failed to load resources for locale ${locale}: ${error}`);\n }\n };\n};\n\n/**\n * 创建混合资源加载器(先尝试本地,再尝试远程)\n * @param localResources 本地资源对象\n * @param remoteBaseUrl 远程资源基础URL\n * @param format 远程资源文件格式,默认为json\n */\nexport const createHybridResourceLoader = (\n localResources: Record<string, Record<string, any>>,\n remoteBaseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n const localLoader = createLocalResourceLoader(localResources);\n const remoteLoader = createRemoteResourceLoader(remoteBaseUrl, format);\n \n return async (locale: string) => {\n try {\n // 先尝试本地资源\n return localLoader(locale);\n } catch (error) {\n // 本地资源不存在,尝试远程加载\n return remoteLoader(locale);\n }\n };\n}; "],"mappings":"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","names":["key"]}
1
+ {"version":3,"sources":["../src/context.tsx","../src/store.ts","../src/utils.ts"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { I18nProviderProps, UseI18nResult } from \"./types\";\nimport { createI18nStore } from \"./store\";\n\n// 创建上下文\nconst I18nContext = createContext<UseI18nResult | null>(null);\n\n/**\n * i18n提供者组件\n */\nexport const I18nProvider: React.FC<I18nProviderProps> = ({\n options,\n children,\n}) => {\n const store = useState(() => createI18nStore(options))[0];\n\n // 使用 store 函数获取状态\n const locale = store((state) => state.locale);\n const setLocale = store((state) => state.setLocale);\n const t = store((state) => state.t);\n const loading = store((state) => state.loading);\n const error = store((state) => state.error);\n\n // 初始化时加载默认语言资源\n useEffect(() => {\n setLocale(locale);\n }, []);\n\n const value: UseI18nResult = {\n locale,\n locales: options.locales,\n setLocale,\n t,\n loading,\n error,\n };\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n};\n\n/**\n * 使用i18n的钩子\n */\nexport const useI18n = (): UseI18nResult => {\n const context = useContext(I18nContext);\n\n if (!context) {\n throw new Error(\"useI18n must be used within an I18nProvider\");\n }\n\n return context;\n};\n","import { create } from 'zustand';\nimport { I18nOptions, I18nState, ResourceLoader, TranslateFunction } from './types';\n\n/**\n * 默认资源加载器\n */\nconst defaultResourceLoader: ResourceLoader = () => ({});\n\n/**\n * 创建i18n存储\n */\nexport const createI18nStore = (options: I18nOptions) => {\n const {\n defaultLocale,\n locales,\n resourceLoader = defaultResourceLoader,\n storageKey = 'i18n_locale',\n loadFromStorage = true,\n } = options;\n\n // 从本地存储获取初始语言\n const getInitialLocale = (): string => {\n if (loadFromStorage && typeof window !== 'undefined') {\n const storedLocale = localStorage.getItem(storageKey);\n if (storedLocale && locales.includes(storedLocale)) {\n return storedLocale;\n }\n }\n return defaultLocale;\n };\n\n // 创建翻译函数\n const createTranslateFunction = (resources: Record<string, Record<string, any>>): TranslateFunction => {\n return (key: string, params?: Record<string, any>) => {\n const keys = key.split('.');\n let value: any = resources[getInitialLocale()];\n \n // 遍历键路径获取翻译值\n for (const k of keys) {\n if (value === undefined || value === null) {\n return key;\n }\n value = value[k];\n }\n \n // 如果找不到翻译,返回键名\n if (value === undefined || value === null) {\n return key;\n }\n \n // 替换参数\n if (params && typeof value === 'string') {\n return value.replace(/\\{(\\w+)\\}/g, (_, key) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n }\n \n return String(value);\n };\n };\n\n return create<I18nState>((set, get) => ({\n locale: getInitialLocale(),\n resources: {},\n loading: false,\n error: null,\n \n setLocale: async (locale: string) => {\n // 检查语言是否支持\n if (!locales.includes(locale)) {\n set({ error: new Error(`Locale ${locale} is not supported`) });\n return;\n }\n \n // 如果语言已经加载,直接切换\n if (get().resources[locale]) {\n set({ locale });\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n return;\n }\n \n // 加载语言资源\n set({ loading: true, error: null });\n try {\n const resources = await resourceLoader(locale);\n set((state) => ({\n locale,\n resources: { ...state.resources, [locale]: resources },\n loading: false,\n }));\n \n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, locale);\n }\n } catch (error) {\n set({ \n error: error instanceof Error ? error : new Error('Failed to load resources'),\n loading: false \n });\n }\n },\n \n t: (key: string, params?: Record<string, any>) => {\n const { resources } = get();\n const translate = createTranslateFunction(resources);\n return translate(key, params);\n },\n }));\n}; ","import { ResourceLoader } from './types';\n\n/**\n * 创建本地资源加载器\n * @param resources 本地资源对象\n */\nexport const createLocalResourceLoader = (resources: Record<string, Record<string, any>>): ResourceLoader => {\n return (locale: string) => {\n if (!resources[locale]) {\n throw new Error(`Locale ${locale} not found in local resources`);\n }\n return resources[locale];\n };\n};\n\n/**\n * 创建远程资源加载器\n * @param baseUrl 资源基础URL\n * @param format 资源文件格式,默认为json\n */\nexport const createRemoteResourceLoader = (\n baseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n return async (locale: string) => {\n try {\n const response = await fetch(`${baseUrl}/${locale}.${format}`);\n \n if (!response.ok) {\n throw new Error(`Failed to load resources for locale ${locale}`);\n }\n \n return await response.json();\n } catch (error) {\n throw new Error(`Failed to load resources for locale ${locale}: ${error}`);\n }\n };\n};\n\n/**\n * 创建混合资源加载器(先尝试本地,再尝试远程)\n * @param localResources 本地资源对象\n * @param remoteBaseUrl 远程资源基础URL\n * @param format 远程资源文件格式,默认为json\n */\nexport const createHybridResourceLoader = (\n localResources: Record<string, Record<string, any>>,\n remoteBaseUrl: string,\n format: string = 'json'\n): ResourceLoader => {\n const localLoader = createLocalResourceLoader(localResources);\n const remoteLoader = createRemoteResourceLoader(remoteBaseUrl, format);\n \n return async (locale: string) => {\n try {\n // 先尝试本地资源\n return localLoader(locale);\n } catch (error) {\n // 本地资源不存在,尝试远程加载\n return remoteLoader(locale);\n }\n };\n}; "],"mappings":"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","names":["key"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xiping/react-i18n",
3
- "version": "1.0.7",
3
+ "version": "1.0.52",
4
4
  "private": false,
5
5
  "description": "A React i18n library with Zustand integration",
6
6
  "author": "The-End-Hero <527409987@qq.com>",
@@ -30,7 +30,7 @@
30
30
  "bugs": {
31
31
  "url": "https://github.com/The-End-Hero/wang-ping/issues"
32
32
  },
33
- "gitHead": "a48894117df00b61c933f72e6e352928e67b7578",
33
+ "gitHead": "84ec5ebe26287725469ccb9becba29954b6c07e1",
34
34
  "publishConfig": {
35
35
  "access": "public",
36
36
  "registry": "https://registry.npmjs.org/"