Add polish pluralization rule

1930-first-upload-in-a-batch-always-fails
wvffle 2022-11-27 23:43:54 +00:00 zatwierdzone przez Kasper Seweryn
rodzic df77d2b153
commit 05bef9f133
3 zmienionych plików z 135 dodań i 133 usunięć

Wyświetl plik

@ -1,10 +1,11 @@
import type { InitModule } from '~/types'
import type { SupportedLanguages } from '~/locales'
import { usePreferredLanguages } from '@vueuse/core'
import { createI18n } from 'vue-i18n'
import { nextTick } from 'vue'
import locales from '~/locales.json'
import { locales } from '~/locales'
import store from '~/store'
import useLogger from '~/composables/useLogger'
@ -16,10 +17,11 @@ const localeFactory = import.meta.glob('../locales/*.json') as Record<string, ()
const logger = useLogger()
const defaultLanguage = store.state.ui.currentLanguage ?? 'en'
export const SUPPORTED_LOCALES = locales.reduce((map: Record<string, string>, locale) => {
map[locale.code] = locale.label
return map
}, {})
export const SUPPORTED_LOCALES = Object.fromEntries(
Object.entries(locales)
.map(([key, value]) => [key, value.label])
) as Record<SupportedLanguages, string>
export const i18n = createI18n<false>({
formatFallbackMessages: true,
@ -27,11 +29,16 @@ export const i18n = createI18n<false>({
fallbackLocale: 'en_US',
legacy: false,
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) => {
if (!Object.keys(SUPPORTED_LOCALES).includes(locale)) {
if (!(locale in locales)) {
throw new Error(`Unsupported locale: ${locale}`)
}

Wyświetl plik

@ -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": "Ελληνικά"
}
]

Wyświetl plik

@ -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: 'Ελληνικά'
}
}