Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ This project uses **next-intl** for internationalization. Please follow these gu
2. **Translation file locations**:
- English: `/locales/en/common.json`
- French: `/locales/fr/common.json`
- Other languages follow the same scheme

3. **Namespace organization**:
- `login.*` - Login page strings
Expand Down
4 changes: 2 additions & 2 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import "./globals.css";

const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
subsets: ["latin", "cyrillic"],
});

const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
subsets: ["latin", "cyrillic"],
});

export const metadata: Metadata = {
Expand Down
24 changes: 16 additions & 8 deletions components/providers/intl-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,30 @@
import { useEffect, useState } from 'react';
import { NextIntlClientProvider } from 'next-intl';
import { useLocaleStore } from '@/stores/locale-store';
import type { Locale } from '@/i18n/routing';
import enMessages from '@/locales/en/common.json';
import frMessages from '@/locales/fr/common.json';
import jaMessages from '@/locales/ja/common.json';
import deMessages from '@/locales/de/common.json';
import esMessages from '@/locales/es/common.json';
import frMessages from '@/locales/fr/common.json';
import itMessages from '@/locales/it/common.json';
import deMessages from '@/locales/de/common.json';
import jaMessages from '@/locales/ja/common.json';
import nlMessages from '@/locales/nl/common.json';
import ptMessages from '@/locales/pt/common.json';
import ruMessages from '@/locales/ru/common.json';
import ukMessages from '@/locales/uk/common.json';

// Pre-loaded translations (loaded at build time, not runtime)
const ALL_MESSAGES = {
const ALL_MESSAGES: Record<Locale, typeof enMessages> = {
en: enMessages,
fr: frMessages,
ja: jaMessages,
de: deMessages,
es: esMessages,
fr: frMessages,
it: itMessages,
de: deMessages,
ja: jaMessages,
nl: nlMessages,
pt: ptMessages,
ru: ruMessages,
uk: ukMessages,
};

interface IntlProviderProps {
Expand Down Expand Up @@ -62,10 +67,13 @@ export function IntlProvider({ locale: initialLocale, children }: IntlProviderPr
}
}, [currentLocale]);

const messages =
ALL_MESSAGES[activeLocale as Locale] ?? ALL_MESSAGES.en;

return (
<NextIntlClientProvider
locale={activeLocale}
messages={ALL_MESSAGES[activeLocale as keyof typeof ALL_MESSAGES]}
messages={messages}
timeZone={timeZone}
>
{children}
Expand Down
28 changes: 18 additions & 10 deletions components/ui/language-switcher.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,31 @@
"use client";

import { useLocale } from 'next-intl';
import { locales, type Locale } from '@/i18n/routing';
import { useLocaleStore } from '@/stores/locale-store';
import { Select } from '@/components/settings/settings-section';

const NATIVE_LANGUAGE_LABELS: Record<Locale, string> = {
en: 'English',
de: 'Deutsch',
es: 'Español',
fr: 'Français',
it: 'Italiano',
ja: '日本語',
nl: 'Nederlands',
pt: 'Português',
ru: 'Русский',
uk: 'Українська',
};

export function LanguageSwitcher({ className }: { className?: string }) {
const currentLocale = useLocale();
const setLocale = useLocaleStore((state) => state.setLocale);

const languages = [
{ value: 'en', label: 'English' },
{ value: 'fr', label: 'Français' },
{ value: 'ja', label: '日本語' },
{ value: 'es', label: 'Español' },
{ value: 'it', label: 'Italiano' },
{ value: 'de', label: 'Deutsch' },
{ value: 'nl', label: 'Nederlands' },
{ value: 'pt', label: 'Português' }
];
const languages = locales.map((code) => ({
value: code,
label: NATIVE_LANGUAGE_LABELS[code],
}));

return (
<div className={className}>
Expand Down
5 changes: 1 addition & 4 deletions i18n/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ export default getRequestConfig(async ({ requestLocale }) => {
locale = routing.defaultLocale;
}

// Use static imports for better compatibility
const messages = locale === 'fr'
? (await import('../locales/fr/common.json')).default
: (await import('../locales/en/common.json')).default;
const messages = (await import(`../locales/${locale}/common.json`)).default;

return {
locale,
Expand Down
2 changes: 1 addition & 1 deletion i18n/routing.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defineRouting } from 'next-intl/routing';

export const routing = defineRouting({
locales: ['en', 'fr'],
locales: ['en', 'de', 'es', 'fr', 'it', 'ja', 'nl', 'pt', 'ru', 'uk'],
defaultLocale: 'en',
localePrefix: 'never'
});
Expand Down
4 changes: 4 additions & 0 deletions locales/de/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Sprache auswählen",
"switch_to_english": "Zu Englisch wechseln",
"switch_to_french": "Zu Französisch wechseln",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Zu Deutsch wechseln",
"switch_to_dutch": "Zu Niederländisch wechseln",
"switch_to_portuguese": "Zu Portugiesisch wechseln",
"switch_to_russian": "Zu Russisch wechseln",
"switch_to_ukrainian": "Zu Ukrainisch wechseln",
"switching": "Sprache wird gewechselt..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Select language",
"switch_to_english": "Switch to English",
"switch_to_french": "Switch to French",
Expand All @@ -528,6 +530,8 @@
"switch_to_german": "Switch to German",
"switch_to_dutch": "Switch to Dutch",
"switch_to_portuguese": "Switch to Portuguese",
"switch_to_russian": "Switch to Russian",
"switch_to_ukrainian": "Switch to Ukrainian",
"switching": "Changing language..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/es/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Seleccionar idioma",
"switch_to_english": "Cambiar a inglés",
"switch_to_french": "Cambiar a francés",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Cambiar a alemán",
"switch_to_dutch": "Cambiar a neerlandés",
"switch_to_portuguese": "Cambiar a portugués",
"switch_to_russian": "Cambiar a ruso",
"switch_to_ukrainian": "Cambiar a ucraniano",
"switching": "Cambiando idioma..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/fr/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Sélectionner la langue",
"switch_to_english": "Passer à l'anglais",
"switch_to_french": "Passer au français",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Passer à l'allemand",
"switch_to_dutch": "Passer au néerlandais",
"switch_to_portuguese": "Passer au portugais",
"switch_to_russian": "Passer au russe",
"switch_to_ukrainian": "Passer à l'ukrainien",
"switching": "Changement de langue..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/it/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Seleziona lingua",
"switch_to_english": "Passa all'inglese",
"switch_to_french": "Passa al francese",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Passa al tedesco",
"switch_to_dutch": "Passa all'olandese",
"switch_to_portuguese": "Passa al portoghese",
"switch_to_russian": "Passa al russo",
"switch_to_ukrainian": "Passa all'ucraino",
"switching": "Cambio lingua in corso..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/ja/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "言語を選択",
"switch_to_english": "英語に切り替え",
"switch_to_french": "フランス語に切り替え",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "ドイツ語に切り替え",
"switch_to_dutch": "オランダ語に切り替え",
"switch_to_portuguese": "ポルトガル語に切り替え",
"switch_to_russian": "ロシア語に切り替え",
"switch_to_ukrainian": "ウクライナ語に切り替え",
"switching": "言語を変更中..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/nl/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Selecteer taal",
"switch_to_english": "Overschakelen naar Engels",
"switch_to_french": "Overschakelen naar Frans",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Overschakelen naar Duits",
"switch_to_dutch": "Overschakelen naar Nederlands",
"switch_to_portuguese": "Overschakelen naar Portugees",
"switch_to_russian": "Overschakelen naar Russisch",
"switch_to_ukrainian": "Overschakelen naar Oekraïens",
"switching": "Taal wijzigen..."
},
"settings": {
Expand Down
4 changes: 4 additions & 0 deletions locales/pt/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,8 @@
"german": "Deutsch",
"dutch": "Nederlands",
"portuguese": "Português",
"russian": "Русский",
"ukrainian": "Українська",
"select_language": "Selecionar idioma",
"switch_to_english": "Mudar para Inglês",
"switch_to_french": "Mudar para Francês",
Expand All @@ -524,6 +526,8 @@
"switch_to_german": "Mudar para Alemão",
"switch_to_dutch": "Mudar para Holandês",
"switch_to_portuguese": "Mudar para Português",
"switch_to_russian": "Mudar para Russo",
"switch_to_ukrainian": "Mudar para Ucraniano",
"switching": "Alterando idioma..."
},
"settings": {
Expand Down
Loading