125 lines
5.3 KiB
TypeScript
125 lines
5.3 KiB
TypeScript
export const translations = {
|
|
en: {
|
|
title: 'AI Stack Deployer',
|
|
subtitle: 'Deploy your personal AI assistant in seconds',
|
|
chooseStackName: 'Choose Your Stack Name',
|
|
availableAt: 'Your AI assistant will be available at',
|
|
stackName: 'Stack Name',
|
|
placeholder: 'e.g., john-dev',
|
|
inputHint: '3-20 characters, lowercase letters, numbers, and hyphens only',
|
|
deployBtn: 'Deploy My AI Stack',
|
|
deploying: 'Deploying Your Stack',
|
|
stack: 'Stack',
|
|
initializing: 'Initializing deployment...',
|
|
successMessage: 'Your AI coding assistant is ready to use',
|
|
stackNameLabel: 'Stack Name:',
|
|
openStack: 'Open My AI Stack',
|
|
deployAnother: 'Deploy Another Stack',
|
|
tryAgain: 'Try Again',
|
|
poweredBy: 'Powered by',
|
|
deploymentComplete: 'Deployment Complete',
|
|
deploymentFailed: 'Deployment Failed',
|
|
nameRequired: 'Name is required',
|
|
nameLengthError: 'Name must be between 3 and 20 characters',
|
|
nameCharsError: 'Only lowercase letters, numbers, and hyphens allowed',
|
|
nameHyphenError: 'Cannot start or end with a hyphen',
|
|
nameReserved: 'This name is reserved',
|
|
checkingAvailability: 'Checking availability...',
|
|
nameAvailable: '✓ Name is available!',
|
|
nameNotAvailable: 'Name is not available',
|
|
checkFailed: 'Failed to check availability',
|
|
connectionLost: 'Connection lost. Please refresh and try again.',
|
|
deployingText: 'Deploying...',
|
|
yournamePlaceholder: 'yourname'
|
|
},
|
|
nl: {
|
|
title: 'AI Stack Deployer',
|
|
subtitle: 'Implementeer je persoonlijke AI in seconden',
|
|
chooseStackName: 'Kies Je Stack Naam',
|
|
availableAt: 'Je AI-assistenten zal beschikbaar zijn op',
|
|
stackName: 'Stack Naam',
|
|
placeholder: 'bijv., Oussama',
|
|
inputHint: '3-20 tekens, kleine letters, cijfers en koppeltekens',
|
|
deployBtn: 'Implementeer Mijn AI Stack',
|
|
deploying: 'Stack Wordt Geïmplementeerd',
|
|
stack: 'Stack',
|
|
initializing: 'Implementatie initialiseren...',
|
|
successMessage: 'Je AI programmeerassistent is klaar voor gebruik',
|
|
stackNameLabel: 'Stack Naam:',
|
|
openStack: 'Open Mijn AI Stack',
|
|
deployAnother: 'Implementeer Nog Een Stack',
|
|
tryAgain: 'Probeer Opnieuw',
|
|
poweredBy: 'Mogelijk gemaakt door',
|
|
deploymentComplete: 'Implementatie Voltooid',
|
|
deploymentFailed: 'Implementatie Mislukt',
|
|
nameRequired: 'Naam is verplicht',
|
|
nameLengthError: 'Naam moet tussen 3 en 20 tekens zijn',
|
|
nameCharsError: 'Alleen kleine letters, cijfers en koppeltekens toegestaan',
|
|
nameHyphenError: 'Kan niet beginnen of eindigen met een koppelteken',
|
|
nameReserved: 'Deze naam is gereserveerd',
|
|
checkingAvailability: 'Beschikbaarheid controleren...',
|
|
nameAvailable: '✓ Naam is beschikbaar!',
|
|
nameNotAvailable: 'Naam is niet beschikbaar',
|
|
checkFailed: 'Controle mislukt',
|
|
connectionLost: 'Verbinding verbroken. Ververs de pagina en probeer opnieuw.',
|
|
deployingText: 'Implementeren...',
|
|
yournamePlaceholder: 'jouwnaam'
|
|
},
|
|
ar: {
|
|
title: 'AI Stack Deployer',
|
|
subtitle: 'انشر مساعد البرمجة الذكي الخاص بك في ثوانٍ',
|
|
chooseStackName: 'اختر اسم المشروع',
|
|
availableAt: 'سيكون مساعدك الذكي متاحًا على',
|
|
stackName: 'اسم المشروع',
|
|
placeholder: 'مثال: أحمد-dev',
|
|
inputHint: '3-20 حرف، أحرف صغيرة وأرقام وشرطات فقط',
|
|
deployBtn: 'انشر مشروعي',
|
|
deploying: 'جاري النشر',
|
|
stack: 'المشروع',
|
|
initializing: 'جاري التهيئة...',
|
|
successMessage: 'مساعد البرمجة الذكي جاهز للاستخدام',
|
|
stackNameLabel: 'اسم المشروع:',
|
|
openStack: 'افتح مشروعي',
|
|
deployAnother: 'انشر مشروع آخر',
|
|
tryAgain: 'حاول مرة أخرى',
|
|
poweredBy: 'مدعوم من',
|
|
deploymentComplete: 'تم النشر بنجاح',
|
|
deploymentFailed: 'فشل النشر',
|
|
nameRequired: 'الاسم مطلوب',
|
|
nameLengthError: 'يجب أن يكون الاسم بين 3 و 20 حرفًا',
|
|
nameCharsError: 'يُسمح فقط بالأحرف الصغيرة والأرقام والشرطات',
|
|
nameHyphenError: 'لا يمكن أن يبدأ أو ينتهي بشرطة',
|
|
nameReserved: 'هذا الاسم محجوز',
|
|
checkingAvailability: 'جاري التحقق...',
|
|
nameAvailable: '✓ الاسم متاح!',
|
|
nameNotAvailable: 'الاسم غير متاح',
|
|
checkFailed: 'فشل التحقق',
|
|
connectionLost: 'انقطع الاتصال. يرجى تحديث الصفحة والمحاولة مرة أخرى.',
|
|
deployingText: 'جاري النشر...',
|
|
yournamePlaceholder: 'اسمك'
|
|
}
|
|
} as const;
|
|
|
|
export type Language = keyof typeof translations;
|
|
export type TranslationKey = keyof typeof translations.en;
|
|
|
|
export function detectLanguage(): Language {
|
|
const browserLang = navigator.language?.split('-')[0].toLowerCase();
|
|
if (browserLang && browserLang in translations) {
|
|
return browserLang as Language;
|
|
}
|
|
return 'en';
|
|
}
|
|
|
|
export function getStoredLanguage(): Language {
|
|
const stored = localStorage.getItem('preferredLanguage');
|
|
if (stored && stored in translations) {
|
|
return stored as Language;
|
|
}
|
|
return detectLanguage();
|
|
}
|
|
|
|
export function storeLanguage(lang: Language): void {
|
|
localStorage.setItem('preferredLanguage', lang);
|
|
}
|