diff --git a/.github/workflows/commitl10nchanges.js b/.github/workflows/commitl10nchanges.js index 972bd96..f5243fd 100644 --- a/.github/workflows/commitl10nchanges.js +++ b/.github/workflows/commitl10nchanges.js @@ -9,25 +9,25 @@ async function syncCrowdinTranslations() { }); const [owner, repo] = ["DeadCodeGames", "DeadForge"]; - const mainBranch = '2024/2025'; + const masterBranch = '2025/2026'; const l10nBranch = 'l10n_crowdin_translations'; console.log('Starting Crowdin translations sync...'); try { - // Get main branch reference - console.log('Fetching main branch...'); - const { data: mainRef } = await octokit.git.getRef({ + // Get master branch reference + console.log('Fetching master branch...'); + const { data: masterRef } = await octokit.git.getRef({ owner, repo, - ref: `heads/${mainBranch}` + ref: `heads/${masterBranch}` }); - // Get main commit and tree - const { data: mainCommit } = await octokit.git.getCommit({ + // Get master commit and tree + const { data: masterCommit } = await octokit.git.getCommit({ owner, repo, - commit_sha: mainRef.object.sha + commit_sha: masterRef.object.sha }); // Backup locale files from current working directory @@ -50,7 +50,7 @@ async function syncCrowdinTranslations() { console.log('Branch l10n_crowdin_translations exists, using it...'); } catch (error) { if (error.status === 404) { - console.log('Creating new branch l10n_crowdin_translations from main...'); + console.log('Creating new branch l10n_crowdin_translations from master...'); l10nBranchExists = false; } else { throw error; @@ -68,8 +68,8 @@ async function syncCrowdinTranslations() { }); baseSha = l10nCommit.tree.sha; } else { - // Use main as base - baseSha = mainCommit.tree.sha; + // Use master as base + baseSha = masterCommit.tree.sha; } // Restore locale files from backup @@ -97,7 +97,7 @@ async function syncCrowdinTranslations() { repo, message: 'chore(i18n): sync Crowdin translations', tree: tree.sha, - parents: l10nBranchExists ? [l10nRef.object.sha] : [mainRef.object.sha] + parents: l10nBranchExists ? [l10nRef.object.sha] : [masterRef.object.sha] }); if (l10nBranchExists) { @@ -176,8 +176,21 @@ async function restoreLocaleFilesFromWorkspace( } const changedFiles = []; - - // Create blobs for all backup files + + // Fetch the full base tree (recursive) once so we can compare file SHAs + const { data: baseTree } = await octokit.git.getTree({ + owner, + repo, + tree_sha: baseSha, + recursive: 'true' + }); + const existingBlobs = new Map( + baseTree.tree + .filter(item => item.type === 'blob') + .map(item => [item.path, item.sha]) + ); + + // Only stage files that have actually changed for (const backupFile of localeBackup) { const { data: blob } = await octokit.git.createBlob({ owner, @@ -185,7 +198,13 @@ async function restoreLocaleFilesFromWorkspace( content: backupFile.content, encoding: 'utf-8' }); - + + const existingSha = existingBlobs.get(backupFile.path); + if (existingSha === blob.sha) { + console.log(`Skipping unchanged file: ${backupFile.path}`); + continue; + } + changedFiles.push({ path: backupFile.path, mode: '100644', @@ -193,9 +212,9 @@ async function restoreLocaleFilesFromWorkspace( sha: blob.sha }); } - - console.log(`Restored ${changedFiles.length} locale files`); + + console.log(`${changedFiles.length} locale file(s) changed out of ${localeBackup.length}`); return changedFiles; } -syncCrowdinTranslations(); \ No newline at end of file +syncCrowdinTranslations(); diff --git a/src/locales/cs_CZ.json b/src/locales/cs_CZ.json index 641db1d..1cb007a 100644 --- a/src/locales/cs_CZ.json +++ b/src/locales/cs_CZ.json @@ -78,7 +78,9 @@ "languageComplete": "Úplně Přeloženo", "languageIncomplete": "Nepřeloženo", "languageShowIncomplete": "Zobrazovat neúplné překlady", - "languageShowIncompleteDescription": "Zobrazit překlady, které nejsou kompletné. Můžete nám pomoci s překladem DEADFORGE na našem <0>Crowdinu." + "languageShowIncompleteDescription": "Zobrazit překlady, které nejsou kompletné. Můžete nám pomoci s překladem DEADFORGE na našem <0>Crowdinu.", + "reducedMotion": "Redukce animací", + "reducedMotionDescription": "Vypnout animace a přechody s účelem znížení zatížení systému a zlepšení výkonu" }, "behavior": { "title": "Chování", @@ -90,7 +92,13 @@ "useTrayDescription": "Ponechat aplikaci na pozadí po uzavření okna, skrytou v oblasti oznámení", "autoStart": "Spustit při startu", "autoStartDescription": "Spustit aplikaci automaticky po spustení počítače", - "unavailableOnLinux": "Toto nastavení není dostupné na Linuxových systémech" + "unavailableOnLinux": "Toto nastavení není dostupné na Linuxových systémech", + "discordRPC": "Discord Rich Presence", + "discordRPCDescription": "Spravovat nastavení Discordu RPC", + "manageDiscordRPC": "Spravovat Discord RPC", + "discordRPCEnabled": "Povolit Discord RPC", + "discordRPCShowVersion": "Zobrazovat verzi DEADFORGE", + "discordRPCShowTime": "Zobrazovat, jak dlouho DEADFORGE běží" }, "appData": { "title": "Data a aktualizace aplikace", diff --git a/src/locales/de_DE.json b/src/locales/de_DE.json index 7d7bdcf..3b339d2 100644 --- a/src/locales/de_DE.json +++ b/src/locales/de_DE.json @@ -76,7 +76,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -88,7 +90,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/en_PT.json b/src/locales/en_PT.json index 7cebbd6..7c61f3f 100644 --- a/src/locales/en_PT.json +++ b/src/locales/en_PT.json @@ -76,7 +76,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -88,7 +90,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/fr_FR.json b/src/locales/fr_FR.json index 564b59c..8d007f1 100644 --- a/src/locales/fr_FR.json +++ b/src/locales/fr_FR.json @@ -76,7 +76,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -88,7 +90,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/i18n.ts b/src/locales/i18n.ts index d8bd14b..8393883 100644 --- a/src/locales/i18n.ts +++ b/src/locales/i18n.ts @@ -1,6 +1,6 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; -import { enUS, cs, sk, ja, fr, it, zhCN, zhTW, de, ko, Locale } from 'date-fns/locale'; +import { enUS, cs, sk, ja, fr, it, zhCN, zhTW, de, ko, uk, Locale } from 'date-fns/locale'; import {unflatten, flatten} from 'flat'; import en_001 from './en_001.json'; @@ -10,12 +10,12 @@ import en_PT from './en_PT.json'; import fr_FR from './fr_FR.json'; import it_IT from './it_IT.json'; import ja_JP from './ja_JP.json'; -import zh_CN from './zh_CN.json'; import ko_KR from './ko_KR.json'; import lol_US from './lol_US.json'; import sk_SK from './sk_SK.json'; -import zh_TW from './zh_TW.json'; import uk_UA from './uk_UA.json'; +import zh_CN from './zh_CN.json'; +import zh_TW from './zh_TW.json'; const resources: Record = { cs_CZ: { translation: cs_CZ }, de_DE: { translation: de_DE }, @@ -42,6 +42,7 @@ const dateFNSResources: Record = { ko_KR: ko, lol_US: enUS, sk_SK: sk, + uk_UA: uk, zh_CN: zhCN, zh_TW: zhTW, }; diff --git a/src/locales/it_IT.json b/src/locales/it_IT.json index 515da1a..836a306 100644 --- a/src/locales/it_IT.json +++ b/src/locales/it_IT.json @@ -76,7 +76,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -88,7 +90,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/ja_JP.json b/src/locales/ja_JP.json index de20a41..c8dd3ad 100644 --- a/src/locales/ja_JP.json +++ b/src/locales/ja_JP.json @@ -75,7 +75,9 @@ "languageComplete": "完全翻訳済み", "languageIncomplete": "不完全翻訳済み", "languageShowIncomplete": "未完了の翻訳を表示", - "languageShowIncompleteDescription": "まだ完全に翻訳されていない翻訳を表示します。<0>Crowdinで翻訳を協力いただけます。" + "languageShowIncompleteDescription": "まだ完全に翻訳されていない翻訳を表示します。<0>Crowdinで翻訳を協力いただけます。", + "reducedMotion": "モーションを減らす", + "reducedMotionDescription": "パフォーマンスを向上させるため、アニメーションとトランジションを無効にしてシステムの負荷を軽減します" }, "behavior": { "title": "行動", @@ -87,7 +89,13 @@ "useTrayDescription": "ウィンドウが閉じているときは、アプリをシステムトレイに保持します", "autoStart": "システム起動時に実行", "autoStartDescription": "コンピューターの起動時にアプリを自動的に起動します", - "unavailableOnLinux": "この設定はLinuxシステムでは利用できません" + "unavailableOnLinux": "この設定はLinuxシステムでは利用できません", + "discordRPC": "Discord Rich Presence(リッチプレゼンス)", + "discordRPCDescription": "Discord RPCの設定を管理", + "manageDiscordRPC": "Discord RPCを管理", + "discordRPCEnabled": "Discord RPCを有効化", + "discordRPCShowVersion": "実行中のDEADFORGEバージョンを表示", + "discordRPCShowTime": "DEADFORGEの起動のタイムスタンプを表示" }, "appData": { "title": "アプリデータとアップデート", diff --git a/src/locales/ko_KR.json b/src/locales/ko_KR.json index a317560..065c00f 100644 --- a/src/locales/ko_KR.json +++ b/src/locales/ko_KR.json @@ -75,7 +75,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -87,7 +89,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/lol_US.json b/src/locales/lol_US.json index 9fef75d..d92c74c 100644 --- a/src/locales/lol_US.json +++ b/src/locales/lol_US.json @@ -76,7 +76,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -88,7 +90,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/sk_SK.json b/src/locales/sk_SK.json index 54802a7..fcc142b 100644 --- a/src/locales/sk_SK.json +++ b/src/locales/sk_SK.json @@ -78,7 +78,9 @@ "languageComplete": "Úplne Preložené", "languageIncomplete": "Nepreložené", "languageShowIncomplete": "Zobrazovať nekompletné preklady", - "languageShowIncompleteDescription": "Zobraziť preklady, ktoré nie sú kompletné. Môžete nám pomôcť DEADFORGE preložiť na našom <0>Crowdine." + "languageShowIncompleteDescription": "Zobraziť preklady, ktoré nie sú kompletné. Môžete nám pomôcť DEADFORGE preložiť na našom <0>Crowdine.", + "reducedMotion": "Redukcia animácií", + "reducedMotionDescription": "Vypnúť animácie a prechody s účelom zníženia zaťaženia systému a zlepšenia výkonu" }, "behavior": { "title": "Správanie", @@ -90,7 +92,13 @@ "useTrayDescription": "Ponechať aplikáciu na pozadí po uzatvorení okna, skrytú v oblasti oznámení", "autoStart": "Spustiť pri štarte", "autoStartDescription": "Spustiť aplikáciu automaticky po spustení počítača", - "unavailableOnLinux": "Toto nastavenie nie je dostupné na Linuxových systémoch" + "unavailableOnLinux": "Toto nastavenie nie je dostupné na Linuxových systémoch", + "discordRPC": "Discord Rich Presence", + "discordRPCDescription": "Spravovať nastavenia Discord RPC", + "manageDiscordRPC": "Spravovať Discord RPC", + "discordRPCEnabled": "Povoliť Discord RPC", + "discordRPCShowVersion": "Zobrazovať verziu DEADFORGE", + "discordRPCShowTime": "Zobrazovať, ako dlho DEADFORGE beží" }, "appData": { "title": "Dáta a aktualizácie aplikácie", diff --git a/src/locales/uk_UA.json b/src/locales/uk_UA.json index 750df12..db3e90b 100644 --- a/src/locales/uk_UA.json +++ b/src/locales/uk_UA.json @@ -6,15 +6,15 @@ "commaSeparator": ", ", "ampersandSeparator": " & ", "showLess": "У розробці", - "showMore": "", - "viewAll": "", - "loading": "", - "browse": "", - "cancel": "", - "back": "", - "skip": "", - "next": "", - "finish": "", + "showMore": "Показати більше", + "viewAll": "Переглянути все", + "loading": "Завантаження", + "browse": "Огляд", + "cancel": "Скасувати", + "back": "Назад", + "skip": "Пропустити", + "next": "Далі", + "finish": "Завершити", "sidebar": { "home": "Головна", "library": "Медіатека", @@ -27,8 +27,8 @@ "newsAndUpdatesHeader": "", "jumpBackIn": "", "articles": { - "publishedOn": "", - "lastEditedOn": "", + "publishedOn": "Опубліковано {{date}}", + "lastEditedOn": "Востаннє змінено {{date}}", "tags": { "deadforgeUpdate": "Оновлення DEADFORGE", "beta": "Бета", @@ -37,67 +37,75 @@ "metaUpdate": "новини з-за лаштунків", "workInProgress": "У розробці" }, - "writtenBy_one": "", - "writtenBy_few": "", - "writtenBy_many": "", - "writtenBy_other": "" + "writtenBy_one": "Автор <0>", + "writtenBy_few": "Автори <0>", + "writtenBy_many": "Автори <0>", + "writtenBy_other": "Автори <0>" }, - "errorWithLoadingArticles": "", - "errorWithUpdatingArticles": "", - "errorWithUpdatingArticles-NetworkError": "", - "noArticlesTitle": "", - "noArticlesDescription": "" + "errorWithLoadingArticles": "Помилка при завантаженні контенту:", + "errorWithUpdatingArticles": "Помилка при оновленні контенту:", + "errorWithUpdatingArticles-NetworkError": "Здається, сталася мережева помилка. Перевірте підключення до інтернету, або спробуйте перезавантажити сторінку", + "noArticlesTitle": "Контент відсутній", + "noArticlesDescription": "На цей момент новий контент відсутній. Будь ласка, перевірте підключення до інтернету." }, "store": { "urlCopied": "URL успішно скопійовано" }, "tray": { "exit": "Вийти з <0>DEADFORGE", - "arcade": "" + "arcade": "<0>DEADFORGE <1>Аркади" }, "settings": { "theming": { - "title": "", - "theme": "", - "themeDescription": "", - "systemTheme": "", - "darkTheme": "", - "lightTheme": "", - "windowFrame": "", - "windowFrameDescription": "", - "windowFrameAuto": "", - "windowFrameWindows": "", - "windowFrameMac": "", - "windowFrameLinux": "", - "currentPageTitleInFrame": "", - "currentPageTitleInFrameDescription": "", - "themeButtonInFrame": "", + "title": "Зовнішній вигляд", + "theme": "Тема", + "themeDescription": "Оберіть між світлою, темною або системною темами", + "systemTheme": "Система", + "darkTheme": "Темна", + "lightTheme": "Світла", + "windowFrame": "Стиль рамки для вікна", + "windowFrameDescription": "Виберіть стиль рамки вікна, що відповідає вашій системі операційних або особистих вподобань", + "windowFrameAuto": "Авто (на основі OS)", + "windowFrameWindows": "Windows", + "windowFrameMac": "macOS", + "windowFrameLinux": "Linux", + "currentPageTitleInFrame": "Показувати поточний заголовок сторінки у віконному вікні", + "currentPageTitleInFrameDescription": "Включити заголовок сторінки у заголовок вікна", + "themeButtonInFrame": "Показувати перемикач тем у фреймі вікна", "themeButtonInFrameDescription": "", - "language": "", - "languageDescription": "", - "languageComplete": "", - "languageIncomplete": "", - "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "language": "Мова", + "languageDescription": "Виберіть бажану мову програми", + "languageComplete": "Повністю перекладено ", + "languageIncomplete": "Не закінчено ", + "languageShowIncomplete": "Показувати незакінчені переклади", + "languageShowIncompleteDescription": "Показувати переклади які ще не повністю закінчені. Ви можете зробити внесок у переклади на <0>Crowdin.", + "reducedMotion": "Зменшити кількість анімацій", + "reducedMotionDescription": "Вимкнути анімації та переходи, задля зниження системного навантаження та збільшити можливу продуктивність " }, "behavior": { - "title": "", - "defaultPage": "", - "defaultPageDescription": "", - "settingsWindow": "", - "settingsWindowDescription": "", - "useTray": "", + "title": "Поведінка", + "defaultPage": "Початкова сторінка", + "defaultPageDescription": "Виберіть яку сторінку показувати при старті програми ", + "settingsWindow": "Відкривати сторінку налаштувань в окремому вікні ", + "settingsWindowDescription": "Відображувати налаштування в відкритому вікні замість основної програми", + "useTray": "Показати в системному треї", "useTrayDescription": "", "autoStart": "", - "autoStartDescription": "", - "unavailableOnLinux": "" + "autoStartDescription": "Автоматично запускати програму при запуску комп'ютера", + "unavailableOnLinux": "Цей параметр недоступний для систем Linux", + "discordRPC": "Детальна активність у Discord (Rich Presence)", + "discordRPCDescription": "Керування налаштуваннями Discord RPC", + "manageDiscordRPC": "Керування Discord RPC", + "discordRPCEnabled": "Увімкнути Discord RPC", + "discordRPCShowVersion": "Показати запущену версію DEADFORGE", + "discordRPCShowTime": "Показувати час запуску DEADFORGE" }, "appData": { - "title": "", - "initialSetup": "", + "title": "Дані програми та оновлень", + "initialSetup": "Початкове налаштування", "initialSetupDescription": "", "initialSetupModal": { - "welcome": "", + "welcome": "Ласкаво просимо до DEADFORGE", "welcomeSubheading": "", "deadforgeDataImport": "", "importV1Preferences": "", diff --git a/src/locales/zh_CN.json b/src/locales/zh_CN.json index 85924ce..305cd6b 100644 --- a/src/locales/zh_CN.json +++ b/src/locales/zh_CN.json @@ -75,7 +75,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -87,7 +89,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "", diff --git a/src/locales/zh_TW.json b/src/locales/zh_TW.json index 64abe69..5f961f8 100644 --- a/src/locales/zh_TW.json +++ b/src/locales/zh_TW.json @@ -75,7 +75,9 @@ "languageComplete": "", "languageIncomplete": "", "languageShowIncomplete": "", - "languageShowIncompleteDescription": "" + "languageShowIncompleteDescription": "", + "reducedMotion": "", + "reducedMotionDescription": "" }, "behavior": { "title": "", @@ -87,7 +89,13 @@ "useTrayDescription": "", "autoStart": "", "autoStartDescription": "", - "unavailableOnLinux": "" + "unavailableOnLinux": "", + "discordRPC": "", + "discordRPCDescription": "", + "manageDiscordRPC": "", + "discordRPCEnabled": "", + "discordRPCShowVersion": "", + "discordRPCShowTime": "" }, "appData": { "title": "",