import type { NuxtI18nOptions } from '@nuxtjs/i18n' import type { DateTimeFormats, NumberFormats, PluralizationRule, PluralizationRules } from '@intlify/core-base' import type { LocaleObject } from '#i18n' interface LocaleObjectData extends LocaleObject { numberFormats?: NumberFormats dateTimeFormats?: DateTimeFormats pluralRule?: PluralizationRule } const locales: LocaleObjectData[] = [ { code: 'en-US', file: 'en-US.json', name: 'English (US)', }, { code: 'en-GB', file: 'en-GB.json', name: 'English (UK)', }, ({ code: 'ar-EG', file: 'ar-EG.json', name: 'العربية', dir: 'rtl', pluralRule: (choice: number) => { const name = new Intl.PluralRules('ar-EG').select(choice) return { zero: 0, one: 1, two: 2, few: 3, many: 4, other: 5 }[name] }, } satisfies LocaleObjectData), { code: 'de-DE', file: 'de-DE.json', name: 'Deutsch', }, { code: 'zh-CN', file: 'zh-CN.json', name: '简体中文', }, { code: 'zh-TW', file: 'zh-TW.json', name: '繁體中文', }, { code: 'ja-JP', file: 'ja-JP.json', name: '日本語', }, { code: 'nl-NL', file: 'nl-NL.json', name: 'Nederlands', }, { code: 'es-ES', file: 'es-ES.json', name: 'Español', }, { code: 'fr-FR', file: 'fr-FR.json', name: 'Français', }, { code: 'uk-UA', file: 'uk-UA.json', name: 'Українська', pluralRule: (choice: number) => { if (choice === 0) return 0 const name = new Intl.PluralRules('uk-UA').select(choice) return { zero: 0, one: 1, two: 0 /* not used */, few: 2, many: 3, other: 4 }[name] }, }, { code: 'cs-CZ', file: 'cs-CZ.json', name: 'Česky', }, { code: 'pt-PT', file: 'pt-PT.json', name: 'Português', }, { code: 'tr-TR', file: 'tr-TR.json', name: 'Türkçe', }, { code: 'id-ID', file: 'id-ID.json', name: 'Indonesia', }, { code: 'fi-FI', file: 'fi-FI.json', name: 'Suomea', }, ].sort((a, b) => a.code.localeCompare(b.code)) const datetimeFormats = Object.values(locales).reduce((acc, data) => { const dateTimeFormats = data.dateTimeFormats if (dateTimeFormats) { acc[data.code] = { ...dateTimeFormats } delete data.dateTimeFormats } else { acc[data.code] = { shortDate: { dateStyle: 'short', }, short: { dateStyle: 'short', timeStyle: 'short', }, long: { dateStyle: 'long', timeStyle: 'medium', }, } } return acc }, {}) const numberFormats = Object.values(locales).reduce((acc, data) => { const numberFormats = data.numberFormats if (numberFormats) { acc[data.code] = { ...numberFormats } delete data.numberFormats } else { acc[data.code] = { percentage: { style: 'percent', maximumFractionDigits: 1, }, smallCounting: { style: 'decimal', maximumFractionDigits: 0, }, kiloCounting: { notation: 'compact', compactDisplay: 'short', maximumFractionDigits: 1, }, millionCounting: { notation: 'compact', compactDisplay: 'short', maximumFractionDigits: 2, }, } } return acc }, {}) const pluralRules = Object.values(locales).reduce((acc, data) => { const pluralRule = data.pluralRule if (pluralRule) { acc[data.code] = pluralRule delete data.pluralRule } return acc }, {}) export const i18n: NuxtI18nOptions = { locales, strategy: 'no_prefix', detectBrowserLanguage: false, langDir: 'locales', defaultLocale: 'en-US', vueI18n: { fallbackLocale: 'en-US', fallbackWarn: false, missingWarn: false, datetimeFormats, numberFormats, pluralRules, }, lazy: true, }