diff --git a/src/assets/i18n/en-GB.json b/src/assets/i18n/en-GB.json index 3e57d38..c700a9b 100644 --- a/src/assets/i18n/en-GB.json +++ b/src/assets/i18n/en-GB.json @@ -5,7 +5,18 @@ "future": "Future" }, "time": { - "until": "Until {time}" + "in": "in {time}", + "remaining": "{time} remaining", + "until": "Until {time}", + "left": "{time} left", + "d": "{n}d | {n}d", + "h": "{n}h | {n}h", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} day | {n} days", + "hours": "{n} hour | {n} hours", + "minutes": "{n} minute | {n} minutes", + "seconds": "{n} second | {n} seconds" }, "schedule": { "title": "Schedule", diff --git a/src/assets/i18n/es-ES.json b/src/assets/i18n/es-ES.json index 7fac1d6..c2f41e0 100644 --- a/src/assets/i18n/es-ES.json +++ b/src/assets/i18n/es-ES.json @@ -5,7 +5,18 @@ "future": "Posteriores" }, "time": { - "until": "Hasta {time}" + "in": "en {time}", + "remaining": "{time} restante", + "until": "Hasta {time}", + "left": "{time} restante", + "d": "{n}d | {n}d", + "h": "{n}h | {n}h", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} día | {n} días", + "hours": "{n} hora | {n} horas", + "minutes": "{n} minuto | {n} minutos", + "seconds": "{n} segundo | {n} segundos" }, "schedule": { "title": "Calendarios", diff --git a/src/assets/i18n/es-MX.json b/src/assets/i18n/es-MX.json index d70d3ea..8e8b2cf 100644 --- a/src/assets/i18n/es-MX.json +++ b/src/assets/i18n/es-MX.json @@ -5,7 +5,18 @@ "future": "Posteriores" }, "time": { - "until": "Hasta {time}" + "in": "en {time}", + "remaining": "{time} restante", + "until": "Hasta {time}", + "left": "{time} restante", + "d": "{n}d | {n}d", + "h": "{n}h | {n}h", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} día | {n} días", + "hours": "{n} hora | {n} horas", + "minutes": "{n} minuto | {n} minutos", + "seconds": "{n} segundo | {n} segundos" }, "schedule": { "title": "Calendario", diff --git a/src/assets/i18n/fr-CA.json b/src/assets/i18n/fr-CA.json index 226612e..240a154 100644 --- a/src/assets/i18n/fr-CA.json +++ b/src/assets/i18n/fr-CA.json @@ -5,7 +5,18 @@ "future": "Prochains" }, "time": { - "until": "Jusqu'au {time}" + "in": "dans {time}", + "remaining": "{time} restant", + "until": "Jusqu'au {time}", + "left": "{time} restantes", + "d": "{n}j | {n}j", + "h": "{n}h | {n}h", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} jour | {n} jours", + "hours": "{n} heure | {n} heures", + "minutes": "{n} minute | {n} minutes", + "seconds": "{n} seconde | {n} secondes" }, "schedule": { "title": "Horaire", diff --git a/src/assets/i18n/it-IT.json b/src/assets/i18n/it-IT.json index 368aa37..d8d1a63 100644 --- a/src/assets/i18n/it-IT.json +++ b/src/assets/i18n/it-IT.json @@ -5,7 +5,18 @@ "future": "Successivi" }, "time": { - "until": "Fino a: {time}" + "in": "tra {time}", + "remaining": "{time} rimanenti", + "until": "Fino a: {time}", + "left": "{time} rimanenti", + "d": "{n}g | {n}g", + "h": "{n}o | {n}o", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} giorno | {n} giorni", + "hours": "{n} ora | {n} ore", + "minutes": "{n} minuto | {n} minuti", + "seconds": "{n} secondo | {n} secondi" }, "schedule": { "title": "Calendario", diff --git a/src/assets/i18n/ja-JP.json b/src/assets/i18n/ja-JP.json index 843f547..744148d 100644 --- a/src/assets/i18n/ja-JP.json +++ b/src/assets/i18n/ja-JP.json @@ -5,7 +5,18 @@ "future": "そのつぎ" }, "time": { - "until": "{time} まで" + "in": "{time}後", + "remaining": "残り{time}", + "until": "{time} まで", + "left": "残り{time}", + "d": "{n}日 | {n}日", + "h": "{n}時間 | {n}時間", + "m": "{n}分 | {n}分", + "s": "{n}秒 | {n}秒", + "days": "{n}日 | {n}日", + "hours": "{n}時間 | {n}時間", + "minutes": "{n}分 | {n}分", + "seconds": "{n}秒 | {n}秒" }, "schedule": { "title": "スケジュール", diff --git a/src/assets/i18n/ko-KR.json b/src/assets/i18n/ko-KR.json index f7b82ca..4685a91 100644 --- a/src/assets/i18n/ko-KR.json +++ b/src/assets/i18n/ko-KR.json @@ -5,7 +5,18 @@ "future": "그다음" }, "time": { - "until": "{time}까지" + "in": "{time}안에", + "remaining": "{time}남음", + "until": "{time}까지", + "left": "{time}남았다", + "d": "{n}일 | {n}일", + "h": "{n}시간 | {n}시간", + "m": "{n}분 | {n}분", + "s": "{n}초 | {n}초", + "days": "{n}일 | {n}일", + "hours": "{n}시간 | {n}시간", + "minutes": "{n}분 | {n}분", + "seconds": "{n}초 | {n}초" }, "schedule": { "title": "스케줄", diff --git a/src/assets/i18n/nl-NL.json b/src/assets/i18n/nl-NL.json index b5d53c4..b563475 100644 --- a/src/assets/i18n/nl-NL.json +++ b/src/assets/i18n/nl-NL.json @@ -5,7 +5,18 @@ "future": "Daarna" }, "time": { - "until": "Tot {time}" + "in": "over {time}", + "remaining": "Nog {time}", + "until": "Tot {time}", + "left": "Nog {time}", + "d": "{n}d | {n}d", + "h": "{n}u | {n}u", + "m": "{n}m | {n}m", + "s": "{n}s | {n}s", + "days": "{n} dag | {n} dagen", + "hours": "{n} uur | {n} uur", + "minutes": "{n} minuut | {n} minuten", + "seconds": "{n} seconde | {n} seconden" }, "schedule": { "title": "Levelschema", diff --git a/src/assets/i18n/ru-RU.json b/src/assets/i18n/ru-RU.json index 0d2be34..f377eea 100644 --- a/src/assets/i18n/ru-RU.json +++ b/src/assets/i18n/ru-RU.json @@ -5,7 +5,18 @@ "future": "Скоро" }, "time": { - "until": "До {time}" + "in": "через {time}", + "remaining": "Осталось: {time}", + "until": "До {time}", + "left": "Осталось: {time}", + "d": "{n} день | {n} дня | {n} дней", + "h": "{n} час | {n} часа | {n} часов", + "m": "{n} минута | {n} минуты | {n} минут", + "s": "{n} секунда | {n} секунды | {n} секунд", + "days": "{n} день | {n} дня | {n} дней", + "hours": "{n} час | {n} часа | {n} часов", + "minutes": "{n} минута | {n} минуты | {n} минут", + "seconds": "{n} секунда | {n} секунды | {n} секунд" }, "schedule": { "title": "Расписание", diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json index 4e9da93..59a3d33 100644 --- a/src/assets/i18n/zh-CN.json +++ b/src/assets/i18n/zh-CN.json @@ -5,7 +5,18 @@ "future": "下下次" }, "time": { - "until": "到{time}为止" + "in": "{time}内", + "remaining": "还剩{time}", + "until": "到{time}为止", + "left": "还剩{time}", + "d": "{n}天 | {n}天", + "h": "{n}小时 | {n}小时", + "m": "{n}分钟 | {n}分钟", + "s": "{n}秒 | {n}秒", + "days": "{n}天 | {n}天", + "hours": "{n}小时 | {n}小时", + "minutes": "{n}分钟 | {n}分钟", + "seconds": "{n}秒 | {n}秒" }, "schedule": { "title": "日程", diff --git a/src/assets/i18n/zh-TW.json b/src/assets/i18n/zh-TW.json index 477603b..f7586b6 100644 --- a/src/assets/i18n/zh-TW.json +++ b/src/assets/i18n/zh-TW.json @@ -5,7 +5,18 @@ "future": "下下次" }, "time": { - "until": "到{time}為止" + "in": "{time}內", + "remaining": "還剩{time}", + "until": "到{time}為止", + "left": "還剩{time}", + "d": "{n}天 | {n}天", + "h": "{n}小時 | {n}小時", + "m": "{n}分鐘 | {n}分鐘", + "s": "{n}秒 | {n}秒", + "days": "{n}天 | {n}天", + "hours": "{n}小時 | {n}小時", + "minutes": "{n}分鐘 | {n}分鐘", + "seconds": "{n}秒 | {n}秒" }, "schedule": { "title": "時間表", diff --git a/src/common/i18n.mjs b/src/common/i18n.mjs index 7dab580..c6860f3 100644 --- a/src/common/i18n.mjs +++ b/src/common/i18n.mjs @@ -37,6 +37,9 @@ export function initializeI18n() { fallbackLocale: 'en-US', messages: { ...languages }, datetimeFormats: locales.reduce((result, locale) => ({ ...result, [locale.code]: datetimeFormats }), {}), + pluralRules: { + 'ru-RU': ruPluralization, + }, }); // Listen for local storage changes @@ -47,6 +50,24 @@ export function initializeI18n() { return i18n; } +// Adapted from: https://vue-i18n.intlify.dev/guide/essentials/pluralization.html#custom-pluralization +function ruPluralization(choice, choicesLength, orgRule) { + if (choice === 0) { + return 0 + } + + const teen = choice > 10 && choice < 20 + const endsWithOne = choice % 10 === 1 + if (!teen && endsWithOne) { + return 1 + } + if (!teen && choice % 10 >= 2 && choice % 10 <= 4) { + return 2 + } + + return choicesLength < 4 ? 2 : 3 +} + function reload() { i18n.global.locale.value = currentLocale().code; loadLocale();