1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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<string>) => {
- 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;
|