@ooopenlab/quiz-shared
Version:
Shared utilities and components for SuperQuiz modules
94 lines (85 loc) • 2.76 kB
text/typescript
// Message loader that automatically merges split translation files
import { I18nConfig } from '../i18n';
// Import structured message files directly
import zhFields from '../../messages/zh/fields.json';
import zhValidation from '../../messages/zh/validation.json';
import zhClassic from '../../messages/zh/modules/classic.json';
import zhMeasure from '../../messages/zh/modules/measure.json';
import enFields from '../../messages/en/fields.json';
import enValidation from '../../messages/en/validation.json';
import enClassic from '../../messages/en/modules/classic.json';
import enMeasure from '../../messages/en/modules/measure.json';
import thFields from '../../messages/th/fields.json';
import thValidation from '../../messages/th/validation.json';
import thClassic from '../../messages/th/modules/classic.json';
import thMeasure from '../../messages/th/modules/measure.json';
// Merge messages manually with proper namespace structure
const mergedMessages = {
zh: {
fields: zhFields,
validation: zhValidation,
modules: {
classic: zhClassic,
measure: zhMeasure
}
},
en: {
fields: enFields,
validation: enValidation,
modules: {
classic: enClassic,
measure: enMeasure
}
},
th: {
fields: thFields,
validation: thValidation,
modules: {
classic: thClassic,
measure: thMeasure
}
}
};
/**
* Get merged messages for a specific locale
* @param locale Target locale (zh, en, th)
* @returns Merged messages object
*/
export function getMessages(locale: string): Record<string, any> {
return mergedMessages[locale as keyof typeof mergedMessages] || mergedMessages.zh;
}
/**
* Get all available locales
* @returns Array of supported locale codes
*/
export function getSupportedLocales(): string[] {
return Object.keys(mergedMessages);
}
/**
* Create I18n config for a specific locale
* @param locale Target locale
* @returns I18nConfig object
*/
export function createI18nConfig(locale: string): I18nConfig {
return {
locale,
messages: getMessages(locale)
};
}
/**
* Register new module messages (for future extensibility)
* This allows new modules to register their own translations
* @param moduleName Name of the module
* @param messages Module messages for all locales
*/
export function registerModuleMessages(
moduleName: string,
messages: Record<string, any>
): void {
Object.keys(messages).forEach(locale => {
const localeMessages = mergedMessages[locale as keyof typeof mergedMessages];
if (localeMessages && localeMessages.modules) {
(localeMessages.modules as any)[moduleName] = messages[locale];
}
});
}