feat: add translations for Bases Calendar features in all languages

Add translations for the new Bases Calendar features in all supported languages:
- French (fr): Complete translations for calendar views, timeblocks, and context menus
- Spanish (es): Complete translations for calendar views, timeblocks, and context menus
- German (de): Complete translations for calendar views, timeblocks, and context menus
- Japanese (ja): Complete translations for calendar views, timeblocks, and context menus
- Russian (ru): Complete translations for calendar views, timeblocks, and context menus
- Chinese (zh): Complete translations for calendar views, timeblocks, and context menus

All translations include:
- Bases Calendar view labels and buttons
- Advanced Calendar filters and view options
- Timeblock operations (create, move, resize)
- Time entry management
- Context menu items
- Error messages and notices
- Property event card labels

Updated i18n.state.json to reflect all translations are current.
This commit is contained in:
callumalpass 2025-10-06 17:40:40 +11:00
parent 39d682383c
commit 808e5a31fb
7 changed files with 1662 additions and 306 deletions

File diff suppressed because it is too large Load diff

View file

@ -90,6 +90,76 @@ export const de: TranslationTree = {
},
advancedCalendar: {
title: "Erweiterter Kalender",
filters: {
showFilters: "Filter anzeigen",
hideFilters: "Filter ausblenden",
},
viewOptions: {
calendarSubscriptions: "Kalenderabonnements",
timeEntries: "Zeiteinträge",
timeblocks: "Zeitblöcke",
scheduledDates: "Geplante Termine",
dueDates: "Fälligkeitstermine",
allDaySlot: "Ganztägiger Slot",
scheduledTasks: "Geplante Aufgaben",
recurringTasks: "Wiederkehrende Aufgaben",
},
buttons: {
refresh: "Aktualisieren",
refreshHint: "Kalenderabonnements aktualisieren",
},
notices: {
icsServiceNotAvailable: "ICS-Abonnementdienst nicht verfügbar",
calendarRefreshedAll: "Alle Kalenderabonnements wurden erfolgreich aktualisiert",
refreshFailed: "Einige Kalenderabonnements konnten nicht aktualisiert werden",
timeblockSpecificTime:
"Zeitblöcke müssen spezifische Zeiten haben. Bitte wählen Sie einen Zeitbereich in der Wochen- oder Tagesansicht.",
timeblockMoved: 'Zeitblock "{title}" wurde nach {date} verschoben',
timeblockUpdated: 'Zeit des Zeitblocks "{title}" aktualisiert',
timeblockMoveFailed: "Fehler beim Verschieben des Zeitblocks: {message}",
timeblockResized: 'Dauer des Zeitblocks "{title}" aktualisiert',
timeblockResizeFailed: "Fehler beim Ändern der Zeitblockgröße: {message}",
taskScheduled: 'Aufgabe "{title}" für {date} geplant',
scheduleTaskFailed: "Fehler beim Planen der Aufgabe",
endTimeAfterStart: "Endzeit muss nach der Startzeit liegen",
timeEntryNotFound: "Zeiteintrag nicht gefunden",
timeEntryDeleted: "Zeiteintrag gelöscht",
deleteTimeEntryFailed: "Fehler beim Löschen des Zeiteintrags",
},
timeEntry: {
estimatedSuffix: "geschätzt",
trackedSuffix: "erfasst",
recurringPrefix: "Wiederkehrend: ",
completedPrefix: "Abgeschlossen: ",
createdPrefix: "Erstellt: ",
modifiedPrefix: "Geändert: ",
duePrefix: "Fällig: ",
scheduledPrefix: "Geplant: ",
},
contextMenus: {
openTask: "Aufgabe öffnen",
deleteTimeEntry: "Zeiteintrag löschen",
deleteTimeEntryTitle: "Zeiteintrag löschen",
deleteTimeEntryConfirm:
"Möchten Sie diesen Zeiteintrag{duration} wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
deleteButton: "Löschen",
cancelButton: "Abbrechen",
},
},
basesCalendar: {
title: "Bases-Kalender",
today: "Heute",
buttonText: {
month: "M",
week: "W",
day: "T",
year: "J",
list: "L",
customDays: "{count}T",
},
errors: {
failedToInitialize: "Fehler beim Initialisieren des Kalenders",
},
},
kanban: {
title: "Kanban",
@ -2097,6 +2167,9 @@ export const de: TranslationTree = {
blockingEmpty: "Keine abhängigen Aufgaben",
blockingLoadError: "Abhängigkeiten konnten nicht geladen werden",
},
propertyEventCard: {
unknownFile: "Unbekannte Datei",
},
filterHeading: {
allViewName: "Alle",
},

View file

@ -90,6 +90,76 @@ export const es: TranslationTree = {
},
advancedCalendar: {
title: "Calendario Avanzado",
filters: {
showFilters: "Mostrar filtros",
hideFilters: "Ocultar filtros",
},
viewOptions: {
calendarSubscriptions: "Suscripciones de calendario",
timeEntries: "Entradas de tiempo",
timeblocks: "Bloques de tiempo",
scheduledDates: "Fechas programadas",
dueDates: "Fechas de vencimiento",
allDaySlot: "Espacio de día completo",
scheduledTasks: "Tareas programadas",
recurringTasks: "Tareas recurrentes",
},
buttons: {
refresh: "Actualizar",
refreshHint: "Actualizar suscripciones de calendario",
},
notices: {
icsServiceNotAvailable: "Servicio de suscripción ICS no disponible",
calendarRefreshedAll: "Todas las suscripciones de calendario se actualizaron correctamente",
refreshFailed: "Error al actualizar algunas suscripciones de calendario",
timeblockSpecificTime:
"Los bloques de tiempo deben tener horas específicas. Seleccione un rango de tiempo en la vista de semana o día.",
timeblockMoved: 'Bloque de tiempo "{title}" movido a {date}',
timeblockUpdated: 'Hora del bloque de tiempo "{title}" actualizada',
timeblockMoveFailed: "Error al mover el bloque de tiempo: {message}",
timeblockResized: 'Duración del bloque de tiempo "{title}" actualizada',
timeblockResizeFailed: "Error al redimensionar el bloque de tiempo: {message}",
taskScheduled: 'Tarea "{title}" programada para {date}',
scheduleTaskFailed: "Error al programar la tarea",
endTimeAfterStart: "La hora de fin debe ser posterior a la hora de inicio",
timeEntryNotFound: "Entrada de tiempo no encontrada",
timeEntryDeleted: "Entrada de tiempo eliminada",
deleteTimeEntryFailed: "Error al eliminar la entrada de tiempo",
},
timeEntry: {
estimatedSuffix: "estimado",
trackedSuffix: "registrado",
recurringPrefix: "Recurrente: ",
completedPrefix: "Completado: ",
createdPrefix: "Creado: ",
modifiedPrefix: "Modificado: ",
duePrefix: "Vence: ",
scheduledPrefix: "Programado: ",
},
contextMenus: {
openTask: "Abrir tarea",
deleteTimeEntry: "Eliminar entrada de tiempo",
deleteTimeEntryTitle: "Eliminar Entrada de Tiempo",
deleteTimeEntryConfirm:
"¿Estás seguro de que deseas eliminar esta entrada de tiempo{duration}? Esta acción no se puede deshacer.",
deleteButton: "Eliminar",
cancelButton: "Cancelar",
},
},
basesCalendar: {
title: "Calendario Bases",
today: "Hoy",
buttonText: {
month: "M",
week: "S",
day: "D",
year: "A",
list: "L",
customDays: "{count}D",
},
errors: {
failedToInitialize: "Error al inicializar el calendario",
},
},
kanban: {
title: "Kanban",
@ -2100,6 +2170,9 @@ export const es: TranslationTree = {
blockingEmpty: "Sin tareas dependientes",
blockingLoadError: "No se pudieron cargar las dependencias",
},
propertyEventCard: {
unknownFile: "Archivo desconocido",
},
filterHeading: {
allViewName: "Todos",
},

View file

@ -90,6 +90,76 @@ export const fr: TranslationTree = {
},
advancedCalendar: {
title: "Calendrier avancé",
filters: {
showFilters: "Afficher les filtres",
hideFilters: "Masquer les filtres",
},
viewOptions: {
calendarSubscriptions: "Abonnements aux calendriers",
timeEntries: "Entrées de temps",
timeblocks: "Blocs de temps",
scheduledDates: "Dates planifiées",
dueDates: "Dates d'échéance",
allDaySlot: "Créneau toute la journée",
scheduledTasks: "Tâches planifiées",
recurringTasks: "Tâches récurrentes",
},
buttons: {
refresh: "Actualiser",
refreshHint: "Actualiser les abonnements aux calendriers",
},
notices: {
icsServiceNotAvailable: "Service d'abonnement ICS non disponible",
calendarRefreshedAll: "Tous les abonnements aux calendriers ont été actualisés avec succès",
refreshFailed: "Échec de l'actualisation de certains abonnements aux calendriers",
timeblockSpecificTime:
"Les blocs de temps doivent avoir des heures spécifiques. Veuillez sélectionner une plage horaire dans la vue semaine ou jour.",
timeblockMoved: 'Bloc de temps "{title}" déplacé vers {date}',
timeblockUpdated: 'Horaire du bloc de temps "{title}" mis à jour',
timeblockMoveFailed: "Échec du déplacement du bloc de temps : {message}",
timeblockResized: 'Durée du bloc de temps "{title}" mise à jour',
timeblockResizeFailed: "Échec du redimensionnement du bloc de temps : {message}",
taskScheduled: 'Tâche "{title}" planifiée pour {date}',
scheduleTaskFailed: "Échec de la planification de la tâche",
endTimeAfterStart: "L'heure de fin doit être après l'heure de début",
timeEntryNotFound: "Entrée de temps introuvable",
timeEntryDeleted: "Entrée de temps supprimée",
deleteTimeEntryFailed: "Échec de la suppression de l'entrée de temps",
},
timeEntry: {
estimatedSuffix: "estimé",
trackedSuffix: "suivi",
recurringPrefix: "Récurrent : ",
completedPrefix: "Terminé : ",
createdPrefix: "Créé : ",
modifiedPrefix: "Modifié : ",
duePrefix: "Échéance : ",
scheduledPrefix: "Planifié : ",
},
contextMenus: {
openTask: "Ouvrir la tâche",
deleteTimeEntry: "Supprimer l'entrée de temps",
deleteTimeEntryTitle: "Supprimer l'entrée de temps",
deleteTimeEntryConfirm:
"Êtes-vous sûr de vouloir supprimer cette entrée de temps{duration} ? Cette action ne peut pas être annulée.",
deleteButton: "Supprimer",
cancelButton: "Annuler",
},
},
basesCalendar: {
title: "Calendrier Bases",
today: "Aujourd'hui",
buttonText: {
month: "M",
week: "S",
day: "J",
year: "A",
list: "L",
customDays: "{count}J",
},
errors: {
failedToInitialize: "Échec de l'initialisation du calendrier",
},
},
kanban: {
title: "Tableau Kanban",
@ -2071,6 +2141,9 @@ export const fr: TranslationTree = {
blockingEmpty: "Aucune tâche dépendante",
blockingLoadError: "Échec du chargement des dépendances",
},
propertyEventCard: {
unknownFile: "Fichier inconnu",
},
filterHeading: {
allViewName: "Toutes",
},

View file

@ -90,6 +90,76 @@ export const ja: TranslationTree = {
},
advancedCalendar: {
title: "高度なカレンダー",
filters: {
showFilters: "フィルターを表示",
hideFilters: "フィルターを非表示",
},
viewOptions: {
calendarSubscriptions: "カレンダー購読",
timeEntries: "時間エントリ",
timeblocks: "タイムブロック",
scheduledDates: "予定日",
dueDates: "期限日",
allDaySlot: "終日スロット",
scheduledTasks: "予定タスク",
recurringTasks: "繰り返しタスク",
},
buttons: {
refresh: "更新",
refreshHint: "カレンダー購読を更新",
},
notices: {
icsServiceNotAvailable: "ICS購読サービスが利用できません",
calendarRefreshedAll: "すべてのカレンダー購読が正常に更新されました",
refreshFailed: "一部のカレンダー購読の更新に失敗しました",
timeblockSpecificTime:
"タイムブロックには具体的な時間が必要です。週表示または日表示で時間範囲を選択してください。",
timeblockMoved: 'タイムブロック「{title}」を{date}に移動しました',
timeblockUpdated: 'タイムブロック「{title}」の時間を更新しました',
timeblockMoveFailed: "タイムブロックの移動に失敗しました:{message}",
timeblockResized: 'タイムブロック「{title}」の期間を更新しました',
timeblockResizeFailed: "タイムブロックのサイズ変更に失敗しました:{message}",
taskScheduled: 'タスク「{title}」を{date}に予定しました',
scheduleTaskFailed: "タスクの予定に失敗しました",
endTimeAfterStart: "終了時刻は開始時刻より後である必要があります",
timeEntryNotFound: "時間エントリが見つかりません",
timeEntryDeleted: "時間エントリを削除しました",
deleteTimeEntryFailed: "時間エントリの削除に失敗しました",
},
timeEntry: {
estimatedSuffix: "見積",
trackedSuffix: "記録",
recurringPrefix: "繰り返し:",
completedPrefix: "完了:",
createdPrefix: "作成:",
modifiedPrefix: "変更:",
duePrefix: "期限:",
scheduledPrefix: "予定:",
},
contextMenus: {
openTask: "タスクを開く",
deleteTimeEntry: "時間エントリを削除",
deleteTimeEntryTitle: "時間エントリを削除",
deleteTimeEntryConfirm:
"この時間エントリ{duration}を削除してもよろしいですか?この操作は元に戻せません。",
deleteButton: "削除",
cancelButton: "キャンセル",
},
},
basesCalendar: {
title: "ベースカレンダー",
today: "今日",
buttonText: {
month: "月",
week: "週",
day: "日",
year: "年",
list: "一覧",
customDays: "{count}日",
},
errors: {
failedToInitialize: "カレンダーの初期化に失敗しました",
},
},
kanban: {
title: "かんばん",
@ -1982,6 +2052,9 @@ export const ja: TranslationTree = {
blockingEmpty: "依存タスクはありません",
blockingLoadError: "依存関係の読み込みに失敗しました",
},
propertyEventCard: {
unknownFile: "不明なファイル",
},
filterHeading: {
allViewName: "すべて",
},

View file

@ -90,6 +90,76 @@ export const ru: TranslationTree = {
},
advancedCalendar: {
title: "Расширенный календарь",
filters: {
showFilters: "Показать фильтры",
hideFilters: "Скрыть фильтры",
},
viewOptions: {
calendarSubscriptions: "Подписки на календари",
timeEntries: "Временные записи",
timeblocks: "Временные блоки",
scheduledDates: "Запланированные даты",
dueDates: "Сроки выполнения",
allDaySlot: "Слот на весь день",
scheduledTasks: "Запланированные задачи",
recurringTasks: "Повторяющиеся задачи",
},
buttons: {
refresh: "Обновить",
refreshHint: "Обновить подписки на календари",
},
notices: {
icsServiceNotAvailable: "Сервис подписки ICS недоступен",
calendarRefreshedAll: "Все подписки на календари успешно обновлены",
refreshFailed: "Не удалось обновить некоторые подписки на календари",
timeblockSpecificTime:
"Временные блоки должны иметь конкретное время. Выберите временной диапазон в недельном или дневном виде.",
timeblockMoved: 'Временной блок "{title}" перемещен на {date}',
timeblockUpdated: 'Время временного блока "{title}" обновлено',
timeblockMoveFailed: "Не удалось переместить временной блок: {message}",
timeblockResized: 'Длительность временного блока "{title}" обновлена',
timeblockResizeFailed: "Не удалось изменить размер временного блока: {message}",
taskScheduled: 'Задача "{title}" запланирована на {date}',
scheduleTaskFailed: "Не удалось запланировать задачу",
endTimeAfterStart: "Время окончания должно быть после времени начала",
timeEntryNotFound: "Временная запись не найдена",
timeEntryDeleted: "Временная запись удалена",
deleteTimeEntryFailed: "Не удалось удалить временную запись",
},
timeEntry: {
estimatedSuffix: "оценка",
trackedSuffix: "отслежено",
recurringPrefix: "Повторяющаяся: ",
completedPrefix: "Завершено: ",
createdPrefix: "Создано: ",
modifiedPrefix: "Изменено: ",
duePrefix: "Срок: ",
scheduledPrefix: "Запланировано: ",
},
contextMenus: {
openTask: "Открыть задачу",
deleteTimeEntry: "Удалить временную запись",
deleteTimeEntryTitle: "Удалить временную запись",
deleteTimeEntryConfirm:
"Вы уверены, что хотите удалить эту временную запись{duration}? Это действие нельзя отменить.",
deleteButton: "Удалить",
cancelButton: "Отмена",
},
},
basesCalendar: {
title: "Календарь Bases",
today: "Сегодня",
buttonText: {
month: "М",
week: "Н",
day: "Д",
year: "Г",
list: "С",
customDays: "{count}Д",
},
errors: {
failedToInitialize: "Не удалось инициализировать календарь",
},
},
kanban: {
title: "Канбан",
@ -2036,6 +2106,9 @@ export const ru: TranslationTree = {
blockingEmpty: "Нет зависимых задач",
blockingLoadError: "Не удалось загрузить зависимости",
},
propertyEventCard: {
unknownFile: "Неизвестный файл",
},
filterHeading: {
allViewName: "Все",
},

View file

@ -90,6 +90,76 @@ export const zh: TranslationTree = {
},
advancedCalendar: {
title: "高级日历",
filters: {
showFilters: "显示筛选器",
hideFilters: "隐藏筛选器",
},
viewOptions: {
calendarSubscriptions: "日历订阅",
timeEntries: "时间条目",
timeblocks: "时间块",
scheduledDates: "计划日期",
dueDates: "截止日期",
allDaySlot: "全天时段",
scheduledTasks: "计划任务",
recurringTasks: "重复任务",
},
buttons: {
refresh: "刷新",
refreshHint: "刷新日历订阅",
},
notices: {
icsServiceNotAvailable: "ICS订阅服务不可用",
calendarRefreshedAll: "所有日历订阅已成功刷新",
refreshFailed: "刷新部分日历订阅失败",
timeblockSpecificTime:
"时间块必须有具体时间。请在周视图或日视图中选择时间范围。",
timeblockMoved: '时间块"{title}"已移动到{date}',
timeblockUpdated: '时间块"{title}"的时间已更新',
timeblockMoveFailed: "移动时间块失败:{message}",
timeblockResized: '时间块"{title}"的持续时间已更新',
timeblockResizeFailed: "调整时间块大小失败:{message}",
taskScheduled: '任务"{title}"已安排到{date}',
scheduleTaskFailed: "安排任务失败",
endTimeAfterStart: "结束时间必须晚于开始时间",
timeEntryNotFound: "未找到时间条目",
timeEntryDeleted: "时间条目已删除",
deleteTimeEntryFailed: "删除时间条目失败",
},
timeEntry: {
estimatedSuffix: "预估",
trackedSuffix: "已记录",
recurringPrefix: "重复:",
completedPrefix: "已完成:",
createdPrefix: "创建:",
modifiedPrefix: "修改:",
duePrefix: "截止:",
scheduledPrefix: "计划:",
},
contextMenus: {
openTask: "打开任务",
deleteTimeEntry: "删除时间条目",
deleteTimeEntryTitle: "删除时间条目",
deleteTimeEntryConfirm:
"确定要删除此时间条目{duration}吗?此操作无法撤销。",
deleteButton: "删除",
cancelButton: "取消",
},
},
basesCalendar: {
title: "Bases日历",
today: "今天",
buttonText: {
month: "月",
week: "周",
day: "日",
year: "年",
list: "列表",
customDays: "{count}天",
},
errors: {
failedToInitialize: "初始化日历失败",
},
},
kanban: {
title: "看板",
@ -1919,6 +1989,9 @@ export const zh: TranslationTree = {
blockingEmpty: "没有依赖的任务",
blockingLoadError: "无法加载依赖",
},
propertyEventCard: {
unknownFile: "未知文件",
},
filterHeading: {
allViewName: "全部",
},