import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; import { fetchI18nMessages, I18nMessages } from '../API/i18n/i18nActions'; export interface I18nState { messages: I18nMessages; currentLocale: string; supportedLocales: string[]; loading: boolean; error: string | null; } const initialState: I18nState = { messages: {}, currentLocale: 'en', supportedLocales: ['en', 'zh'], loading: false, error: null, }; // 异步thunk:加载多语言资源 export const loadI18nMessages = createAsyncThunk( 'i18n/loadMessages', async (locale: string) => { const messages = await fetchI18nMessages(locale); return { locale, messages }; } ); const i18nSlice = createSlice({ name: 'i18n', initialState, reducers: { setCurrentLocale: (state, action: PayloadAction) => { state.currentLocale = action.payload; }, clearError: (state) => { state.error = null; }, }, extraReducers: (builder) => { builder .addCase(loadI18nMessages.pending, (state) => { state.loading = true; state.error = null; }) .addCase(loadI18nMessages.fulfilled, (state, action) => { state.loading = false; state.messages = action.payload.messages; state.currentLocale = action.payload.locale; }) .addCase(loadI18nMessages.rejected, (state, action) => { state.loading = false; state.error = action.error.message || 'Failed to load i18n messages'; }); }, }); export const { setCurrentLocale, clearError } = i18nSlice.actions; export default i18nSlice.reducer;