Add polish pluralization rule
This commit is contained in:
parent
df77d2b153
commit
05bef9f133
|
@ -1,10 +1,11 @@
|
||||||
import type { InitModule } from '~/types'
|
import type { InitModule } from '~/types'
|
||||||
|
import type { SupportedLanguages } from '~/locales'
|
||||||
|
|
||||||
import { usePreferredLanguages } from '@vueuse/core'
|
import { usePreferredLanguages } from '@vueuse/core'
|
||||||
import { createI18n } from 'vue-i18n'
|
import { createI18n } from 'vue-i18n'
|
||||||
import { nextTick } from 'vue'
|
import { nextTick } from 'vue'
|
||||||
|
|
||||||
import locales from '~/locales.json'
|
import { locales } from '~/locales'
|
||||||
import store from '~/store'
|
import store from '~/store'
|
||||||
|
|
||||||
import useLogger from '~/composables/useLogger'
|
import useLogger from '~/composables/useLogger'
|
||||||
|
@ -16,10 +17,11 @@ const localeFactory = import.meta.glob('../locales/*.json') as Record<string, ()
|
||||||
const logger = useLogger()
|
const logger = useLogger()
|
||||||
|
|
||||||
const defaultLanguage = store.state.ui.currentLanguage ?? 'en'
|
const defaultLanguage = store.state.ui.currentLanguage ?? 'en'
|
||||||
export const SUPPORTED_LOCALES = locales.reduce((map: Record<string, string>, locale) => {
|
|
||||||
map[locale.code] = locale.label
|
export const SUPPORTED_LOCALES = Object.fromEntries(
|
||||||
return map
|
Object.entries(locales)
|
||||||
}, {})
|
.map(([key, value]) => [key, value.label])
|
||||||
|
) as Record<SupportedLanguages, string>
|
||||||
|
|
||||||
export const i18n = createI18n<false>({
|
export const i18n = createI18n<false>({
|
||||||
formatFallbackMessages: true,
|
formatFallbackMessages: true,
|
||||||
|
@ -27,11 +29,16 @@ export const i18n = createI18n<false>({
|
||||||
fallbackLocale: 'en_US',
|
fallbackLocale: 'en_US',
|
||||||
legacy: false,
|
legacy: false,
|
||||||
locale: 'en_US',
|
locale: 'en_US',
|
||||||
messages: { en_US: en }
|
messages: { en_US: en },
|
||||||
|
pluralizationRules: Object.fromEntries(
|
||||||
|
Object.entries(locales)
|
||||||
|
.map(([key, value]) => [key, value.pluralizationRule])
|
||||||
|
.filter(i => i[1])
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
export const setI18nLanguage = async (locale: string) => {
|
export const setI18nLanguage = async (locale: string) => {
|
||||||
if (!Object.keys(SUPPORTED_LOCALES).includes(locale)) {
|
if (!(locale in locales)) {
|
||||||
throw new Error(`Unsupported locale: ${locale}`)
|
throw new Error(`Unsupported locale: ${locale}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
[
|
|
||||||
{
|
|
||||||
"code": "ar",
|
|
||||||
"label": "العربية"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "ca",
|
|
||||||
"label": "Català"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "cs",
|
|
||||||
"label": "Čeština"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "de",
|
|
||||||
"label": "Deutsch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "en_GB",
|
|
||||||
"label": "English (UK)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "en_US",
|
|
||||||
"label": "English (United-States)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "eo",
|
|
||||||
"label": "Esperanto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "es",
|
|
||||||
"label": "Español"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "eu",
|
|
||||||
"label": "Euskara"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "fr_FR",
|
|
||||||
"label": "Français"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "gl",
|
|
||||||
"label": "Galego"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "hu",
|
|
||||||
"label": "Magyar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "it",
|
|
||||||
"label": "Italiano"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "ja_JP",
|
|
||||||
"label": "日本語"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "kab_DZ",
|
|
||||||
"label": "Taqbaylit"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "ko_KR",
|
|
||||||
"label": "한국어"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "nb_NO",
|
|
||||||
"label": "Bokmål"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "nn_NO",
|
|
||||||
"label": "Nynorsk"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "nl",
|
|
||||||
"label": "Nederlands"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "oc",
|
|
||||||
"label": "Occitan"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "pl",
|
|
||||||
"label": "Polski"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "pt_BR",
|
|
||||||
"label": "Português (Brasil)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "pt_PT",
|
|
||||||
"label": "Português (Portugal)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "ru",
|
|
||||||
"label": "Русский"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "sq",
|
|
||||||
"label": "Shqip"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "zh_Hans",
|
|
||||||
"label": "中文(简体)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "zh_Hant",
|
|
||||||
"label": "中文(繁體)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "fa_IR",
|
|
||||||
"label": "فارسی"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "ml",
|
|
||||||
"label": "മലയാളം"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "sv",
|
|
||||||
"label": "Svenska"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"code": "el",
|
|
||||||
"label": "Ελληνικά"
|
|
||||||
}
|
|
||||||
]
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
import type { VueI18nOptions } from 'vue-i18n'
|
||||||
|
|
||||||
|
export type SupportedLanguages = 'ar' | 'ca' | 'cs' | 'de' | 'en_GB' | 'en_US' | 'eo' | 'es' | 'eu' | 'fr_FR'
|
||||||
|
| 'gl' | 'hu' | 'it' | 'ja_JP' | 'kab_DZ' | 'ko_KR' | 'nb_NO' | 'nl' | 'oc' | 'pl' | 'pt_BR' | 'pt_PT'
|
||||||
|
| 'ru' | 'sq' | 'zh_Hans' | 'zh_Hant' | 'fa_IR' | 'ml' | 'sv' | 'el' | 'nn_NO'
|
||||||
|
|
||||||
|
export interface Locale {
|
||||||
|
label: string
|
||||||
|
pluralizationRule?: Exclude<VueI18nOptions['pluralizationRules'], undefined>[string]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const locales: Record<SupportedLanguages, Locale> = {
|
||||||
|
ar: {
|
||||||
|
label: 'العربية'
|
||||||
|
},
|
||||||
|
ca: {
|
||||||
|
label: 'Català'
|
||||||
|
},
|
||||||
|
cs: {
|
||||||
|
label: 'Čeština'
|
||||||
|
},
|
||||||
|
de: {
|
||||||
|
label: 'Deutsch'
|
||||||
|
},
|
||||||
|
en_GB: {
|
||||||
|
label: 'English (UK)'
|
||||||
|
},
|
||||||
|
en_US: {
|
||||||
|
label: 'English (United-States)'
|
||||||
|
},
|
||||||
|
eo: {
|
||||||
|
label: 'Esperanto'
|
||||||
|
},
|
||||||
|
es: {
|
||||||
|
label: 'Español'
|
||||||
|
},
|
||||||
|
eu: {
|
||||||
|
label: 'Euskara'
|
||||||
|
},
|
||||||
|
fr_FR: {
|
||||||
|
label: 'Français'
|
||||||
|
},
|
||||||
|
gl: {
|
||||||
|
label: 'Galego'
|
||||||
|
},
|
||||||
|
hu: {
|
||||||
|
label: 'Magyar'
|
||||||
|
},
|
||||||
|
it: {
|
||||||
|
label: 'Italiano'
|
||||||
|
},
|
||||||
|
ja_JP: {
|
||||||
|
label: '日本語'
|
||||||
|
},
|
||||||
|
kab_DZ: {
|
||||||
|
label: 'Taqbaylit'
|
||||||
|
},
|
||||||
|
ko_KR: {
|
||||||
|
label: '한국어'
|
||||||
|
},
|
||||||
|
nb_NO: {
|
||||||
|
label: 'Bokmål'
|
||||||
|
},
|
||||||
|
nn_NO: {
|
||||||
|
label: 'Nynorsk'
|
||||||
|
},
|
||||||
|
nl: {
|
||||||
|
label: 'Nederlands'
|
||||||
|
},
|
||||||
|
oc: {
|
||||||
|
label: 'Occitan'
|
||||||
|
},
|
||||||
|
pl: {
|
||||||
|
label: 'Polski',
|
||||||
|
pluralizationRule: (n, choices) => {
|
||||||
|
// 0 rowerow | 1 rower | 2-4 rowery | 5-21 rowerow
|
||||||
|
// 1 rower | 2-4 rowery | 5-21 rowerow
|
||||||
|
|
||||||
|
const isFew = (n % 10 >= 2 && n % 10 <= 4) && (n % 100 < 10 || n % 100 >= 20)
|
||||||
|
|
||||||
|
if (choices === 3) {
|
||||||
|
if (n === 0) return 2
|
||||||
|
if (n === 1) return 0
|
||||||
|
return isFew ? 1 : 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === 0 || n === 1) return n
|
||||||
|
return isFew ? 2 : 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
pt_BR: {
|
||||||
|
label: 'Português (Brasil)'
|
||||||
|
},
|
||||||
|
pt_PT: {
|
||||||
|
label: 'Português (Portugal)'
|
||||||
|
},
|
||||||
|
ru: {
|
||||||
|
label: 'Русский'
|
||||||
|
},
|
||||||
|
sq: {
|
||||||
|
label: 'Shqip'
|
||||||
|
},
|
||||||
|
zh_Hans: {
|
||||||
|
label: '中文(简体)'
|
||||||
|
},
|
||||||
|
zh_Hant: {
|
||||||
|
label: '中文(繁體)'
|
||||||
|
},
|
||||||
|
fa_IR: {
|
||||||
|
label: 'فارسی'
|
||||||
|
},
|
||||||
|
ml: {
|
||||||
|
label: 'മലയാളം'
|
||||||
|
},
|
||||||
|
sv: {
|
||||||
|
label: 'Svenska'
|
||||||
|
},
|
||||||
|
el: {
|
||||||
|
label: 'Ελληνικά'
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue