Jump to content

Recommended Posts

Posted

CK3 Mod Translator


CK3 Mod Translator


by Heyvanushi


EN

CK3 Mod Translator is a tool for localizing mods for Paradox Interactive games, built to make translating faster and easier. It automatically finds localization files, replaces strings with ready-made translations from the vanilla game and your previous mod version, and machine-translates everything else.

It also handles any data stored in key "value" format inside .yml and .csv files.

9 supported languages. Officially supports all nine CK3 languages: English, French, German, Spanish, Russian, Korean, Simplified Chinese, Japanese and Polish. Because the program processes universal key "value" files and the language codes are fully configurable, it works just as well for Stellaris and other Paradox Interactive titles, not only for Crusader Kings III.

Features:

  • Target-language localization folder in one click. The l_english header automatically becomes l_russian (and so on for every language CK3 supports), files are renamed from _l_english.yml to _l_russian.yml and placed into the target-language subfolder. No more manual header edits or file renaming.
  • Vanilla localization scan. Program scans the CK3 vanilla localization folder. If a key with the same value is found, the mod string is replaced with the official in-game translation. Perfect when a modder copied a whole vanilla file, changed a few lines, and shipped the mod — no need to figure out which lines were modified.
  • Machine translation for everything else. All strings not found in vanilla or the previous version are translated online (MyMemory, Google, DeepL, XCL). Machine translation still needs a human pass, but a built-in editor with the original text shown above each field makes proofreading easy.
  • Escaping of game variables and parameters.[Concept(...)] calls, [second.GetTitledFirstName] commands, £icon£ icon references, #P/#N/#color_yellow color tags, and \n escapes are wrapped in markers and never damaged by the online translator. Game code is never rewritten or quoted.
  • Previous version localization. Point the program at the folder with your mod's previous translation. On mod updates it compares strings: already translated lines are reused, nothing is translated twice, and you never search manually for "what strings were added".
  • Safe reuse. Translations from cache, dictionary and previous version are validated: broken fragments, corrupted markers, or results that literally repeat the source are rejected and re-translated.
  • Smart text filtering. Strings with no real text (pure code, icons, references) are left untouched; long texts are pre-processed so that only meaningful words reach the translator. Results are checked against the source: damaged fragments, quoted game code and other artifacts are filtered out and sent for re-translation — this keeps the output clean and noticeably improves quality.


RU

CK3 Mod Translator — программа для помощи в локализации модов для игр от студии Paradox Interactive. Она упрощает перевод модов и делает его быстрым: автоматически находит файлы локализации, подставляет готовые переводы из ванильной версии игры и прошлой версии мода, а всё остальное переводит онлайн.

Также обрабатывает любые данные в формате ключ "значение" в файлах .yml и .csv.

Поддержка 9 языков. Официально поддерживаются все девять языков CK3: английский, французский, немецкий, испанский, русский, корейский, упрощённый китайский, японский и польский. Так как программа обрабатывает универсальные файлы ключ "значение", а коды языков настраиваются, она работает не только с Crusader Kings III, но и с Stellaris и другими играми Paradox Interactive.

Возможности:

  • Каталог локализации на выбранный язык в один клик. Заголовок l_english автоматически превращается в l_russian (и так для любого языка, поддерживаемого CK3), файлы _l_english.yml переименовываются в _l_russian.yml и раскладываются в подпапку целевого языка. Никаких ручных правок первой строки и переименований.
  • Скан ванильной локализации. Программа сканирует папку локализации ванильной CK3. Если ключ с таким же значением найден — строка мода заменяется на официальный перевод игры. Очень помогает, когда автор скопировал целый файл локализации, поменял пару строк и выложил модификацию: искать «что именно изменилось» не нужно.
  • Машинный перевод остального. Строки, не найденные в ванили и прошлой версии, переводятся онлайн-переводчиками (MyMemory, Google, DeepL, XCL). Машинный перевод всё же требует ручной вычитки, но встроенный редактор с оригиналом над каждым полем делает это просто.
  • Экранирование переменных и параметров игры. Концепты [Concept(...)], команды [second.GetTitledFirstName], ссылки на иконки £icon£, цветовые теги #P/#N/#color_yellow и переносы \n защищаются маркерами и не искажаются онлайн-переводчиком. Код игры никогда не переписывается и не берётся в кавычки.
  • Локализация прошлой версии. Укажите папку с переводом предыдущей версии мода. При обновлении программа сверяет строки: уже переведённые переиспользуются, второй раз ничего не переводится, а «что добавилось» искать вручную не нужно.
  • Безопасное переиспользование. Переводы из кэша, словаря и прошлой версии проверяются: повреждённые фрагменты, испорченные маркеры и «переводы», дословно повторяющие исходник, отбрасываются и переводятся заново.
  • Умная фильтрация текста. Строки без настоящего текста (только код, иконки, ссылки) не трогаются; текст предварительно обрабатывается так, что переводчику уходят только значимые слова. Результат сверяется с исходником: повреждённые фрагменты, кавычки вокруг игрового кода и прочие артефакты отфильтровываются и отправляются на повторный перевод — это заметно повышает качество результата.


Автор: Heyvanushi


 

Posted
# Плагины CK3 Mod Translator
 
Плагины позволяют **расширять функциональность переводчика** и **упрощать работу** без изменения кода самого приложения. Это обычные `.js` файлы (CommonJS), которые загружаются из специальной папки при старте.
 
## Где находятся плагины
 
Папка плагинов создаётся автоматически в директории данных приложения:
 
```
<userData>/plugins
```
 
На Windows обычно:
 
```
C:\Users\<Имя>\AppData\Roaming\ck3-mod-translator\plugins
```
 
Открыть папку можно из панели **Плагины** → кнопка **«Открыть папку»**.
 
## Как начать
 
1. Откройте панель **Плагины**.
2. Нажмите **«Создать шаблон»** — в папке плагинов появится готовый файл-заготовка.
3. Отредактируйте файл и нажмите **«Перезагрузить»** (или перезапустите приложение).
4. Включите/выключите плагин тумблером.
 
Любой плагин можно включить/выключить, не удаляя файл.
 
## Структура плагина
 
```js
module.exports = {
  id: 'my-plugin',          // уникальный идентификатор
  name: 'My Plugin',        // отображаемое имя
  version: '1.0.0',         // версия
  description: '...',       // описание
  author: 'You',            // автор
  hooks: ['preTranslate', 'postTranslate', ...], // какие хуки использует
 
  // Вызывается один раз при загрузке плагина.
  init(manager) {
    manager.registerHook('preTranslate', (mgr, ctx, text) => {
      return text;
    }, this.id);
  }
};
```
 
`manager` — это объект PluginManager. В `init(manager)` регистрируются хуки через `manager.registerHook(name, callback, pluginId)`.
 
## API менеджера
 
Внутри хука первым аргументом приходит `manager`. Доступные методы:
 
| Метод | Описание |
|---|---|
| `manager.registerHook(name, cb, pluginId)` | Зарегистрировать хук |
| `manager.getSettings()` | Доступ к настройкам приложения (чтение/запись) |
| `manager.getContext()` | Доступ к сервисам: `translator`, `cache`, `dictionaryManager` |
| `manager.notify(event, payload)` | Отправить событие в UI |
| `manager.getPlugins()`, `getPlugin(id)` | Список плагинов |
 
Пример доступа к переводчику напрямую:
 
```js
init(manager) {
  manager.registerHook('postTranslate', async (mgr, ctx, text) => {
    // mgr.getContext().translator ... но postTranslate синхронный.
    return text;
  }, this.id);
}
```
 
## Список хуков
 
Хуки вызываются в таком порядке во время перевода файла:
 
### `onAppReady(manager, ctx, data)`
Приложение готово. `ctx = { appPath, pluginsDir }`.
 
### `onFileParsed(manager, ctx, data)`
Файл разобран парсером, **до** перевода. `ctx = { filePath, sourceLang, targetLang, parsed }`.
Здесь можно модифицировать `ctx.parsed.data` — добавить/удалить/изменить ключи перед переводом.
 
```js
manager.registerHook('onFileParsed', (mgr, ctx) => {
  // Добавить ключ ко всем файлам
  ctx.parsed.data['my_custom_key'] = { text: 'My custom line', rawValue: 'My custom line', isBare: false };
}, this.id);
```
 
### `preTranslate(manager, ctx, text)`
Перед переводом **одной строки**. `ctx = { sourceLang, targetLang }`.
Верните строку, чтобы **перехватить перевод** (вернуть своё значение). Верните `undefined`/`null`, чтобы перевести обычным образом.
 
```js
manager.registerHook('preTranslate', (mgr, ctx, text) => {
  if (text === 'Bathhouse') return 'Баня'; // фиксированный перевод
  // иначе — обычный перевод
}, this.id);
```
 
### `beforeTranslateBatch(manager, ctx, texts)`
Перед **пакетом** строк. `ctx = { sourceLang, targetLang }`.
Верните **массив переводов** той же длины, чтобы **полностью заменить** вызов переводчика.
 
```js
manager.registerHook('beforeTranslateBatch', (mgr, ctx, texts) => {
  return texts.map(t => 'translated: ' + t);
}, this.id);
```
 
### `postTranslate(manager, ctx, translated)`
После перевода **одной строки**. `ctx = { sourceLang, targetLang }`.
Верните итоговую строку.
 
```js
manager.registerHook('postTranslate', (mgr, ctx, translated) => {
  return translated + ' (auto)'; // например, добавить суффикс
}, this.id);
```
 
### `postTranslateBatch(manager, ctx, translations)`
После **пакета** переводов. `ctx = { sourceLang, targetLang }`.
Верните массив итоговых переводов.
 
### `onBeforeGenerate(manager, ctx, data)`
Перед сборкой выходного `.yml` файла.
`ctx = { parsed, results, outputData, sourceLang, targetLang }`.
Можно править `ctx.outputData` (объект ключ → запись с `text`).
 
### `onFileSaved(manager, ctx, info)`
Файл сохранён. `ctx = { inputPath, outputPath, translatedCount, totalCount }`.
 
### `onError(manager, ctx, data)`
Ошибка перевода. `ctx = { batch, error }`.
 
### `onSettingsChange(manager, ctx, data)` *(зарезервировано)*
Изменение настроек приложения.
 
## Практические примеры
 
### 1. Постоянный глоссарий (простой фиксированный перевод)
 
```js
module.exports = {
  id: 'glossary',
  name: 'Game Glossary',
  version: '1.0.0',
  description: 'Fixed translations for common CK3 terms',
  author: 'You',
  hooks: ['preTranslate'],
  init(manager) {
    const dict = {
      'Kingdom': 'Королевство',
      'Duchy': 'Герцогство',
      'Count': 'Граф'
    };
    manager.registerHook('preTranslate', (mgr, ctx, text) => {
      if (Object.prototype.hasOwnProperty.call(dict, text.trim())) {
        return dict[text.trim()];
      }
    }, this.id);
  }
};
```
 
### 2. Логирование всех переводов
 
```js
module.exports = {
  id: 'logger',
  name: 'Translation Logger',
  version: '1.0.0',
  description: 'Saves every translation to a file',
  author: 'You',
  hooks: ['onFileParsed', 'onFileSaved'],
  init(manager) {
    const fs = require('fs');
    const path = require('path');
    const logFile = path.join(manager.ensurePluginsDir(), 'log.txt');
    manager.registerHook('onFileSaved', (mgr, ctx) => {
      fs.appendFileSync(logFile,
        `[${new Date().toISOString()}] ${ctx.outputPath} | ${ctx.translatedCount}/${ctx.totalCount}\n`);
    }, this.id);
  }
};
```
 
> Примечание: в `init` доступен `require` для Node-модулей, поэтому плагины могут использовать любые встроенные модули Node (`fs`, `path`, `http`, ...).
 
### 3. Плагин-«провайдер» для своего переводчика
 
```js
module.exports = {
  id: 'custom-provider',
  name: 'My Translator',
  version: '1.0.0',
  description: 'Use my own translation backend',
  author: 'You',
  hooks: ['beforeTranslateBatch'],
  init(manager) {
    const http = require('http');
    manager.registerHook('beforeTranslateBatch', async (mgr, ctx, texts) => {
      // Здесь можно вызвать любой API и вернуть массив переводов.
      const translations = texts.map(t => `via-my-api: ${t}`);
      return translations;
    }, this.id);
  }
};
```
 
## Безопасность
 
Плагины — это код на JavaScript, который выполняется в основном процессе приложения с полным доступом к системе (`fs`, сети и т.д.). **Устанавливайте только те плагины, которым доверяете.**
 
## ЧаВО
 
**Почему плагин не подхватился после правки файла?**
Нажмите «Перезагрузить» в панели Плагины или перезапустите приложение. Если файл содержит синтаксическую ошибку, он будет пропущен (ошибка в консоли).
 
**Можно ли менять настройки приложения из плагина?**
Да, через `manager.getSettings().set('key', value)`.
 
**Как узнать папку плагинов?**
Панель Плагины → «Открыть папку».
Posted (edited)
1 hour ago, Dark Totenkopf said:

Забавное совпадение, только позавчера узнал о ModTranslationHelper и ту на тебе, где ж ты был всё это время.

Делал переводчик на другую игру тут вернулся в CK3 и вспомнил что тут с переводами беда , взял код своей другой программы и переписал под ск 
в любом случае я бы сейчас переделал интерфейс , под новый и доделал функционал , ибо за основу была взята старая версия , и делал на скорую руку скажем так , доделать плагины и хуки и редактор готового перевода , но думаю это можно сделать через словари 

 

Edited by Heyvanushi
Posted
36 minutes ago, Heyvanushi said:

Делал переводчик на другую игру тут вернулся в CK3 и вспомнил что тут с переводами беда , взял код своей другой программы и переписал под ск 
в любом случае я бы сейчас переделал интерфейс , под новый и доделал функционал , ибо за основу была взята старая версия , и делал на скорую руку скажем так , доделать плагины и хуки и редактор готового перевода , но думаю это можно сделать через словари 

 

Единственное чего мне прям не хватает это пометок, что бы файлы по порядку перевести на не кликать на каждый. А то решил попробовать через него прогнать через него один массивный мод и уже пожалел. А так спасибо большое

Posted (edited)
3 minutes ago, Dark Totenkopf said:

Единственное чего мне прям не хватает это пометок, что бы файлы по порядку перевести на не кликать на каждый. А то решил попробовать через него прогнать через него один массивный мод и уже пожалел. А так спасибо большое

Распиши , подробней может добавлю 1 фиг буду перерабатывать дизайн image.png.16027a1fde7eab156745f7a7e7fac363.png

Edited by Heyvanushi
Posted (edited)
14 minutes ago, Heyvanushi said:

Распиши , подробней может добавлю 1 фиг буду перерабатывать дизайн 

А у меня не так как на картинку кста. Я про отметки напротив файлов говорил

Edited by Dark Totenkopf
Posted
6 minutes ago, Dark Totenkopf said:

Просто напротив файла который нужно перевести возможность поставить галочку и программа все отмеченные так файлы перевела, а не кликать на каждый

Дай минут 30 попробую сделать 

Posted

по идеи как то так 

23 minutes ago, Dark Totenkopf said:

А у меня не так как на картинку кста. Я про отметки напротив файлов говорил


image.png.c895c6c4c44b04a5011c84432fb2a2cc.png
 

image.png.82108722f7ac664c2e01e08b8d7df93c.png
файлы которые переведены отмечаются перфиксом 

Posted
17 minutes ago, Heyvanushi said:

по идеи как то так 


image.png.c895c6c4c44b04a5011c84432fb2a2cc.png
 

image.png.82108722f7ac664c2e01e08b8d7df93c.png
файлы которые переведены отмечаются перфиксом 

Тоже полезно но я про то что у меня оно выглядит так и не возможности отмечать файлы для перевода. Это какой то плагин?

2026-09-05_22-55-42.png

Posted
42 minutes ago, Dark Totenkopf said:

Тоже полезно но я про то что у меня оно выглядит так и не возможности отмечать файлы для перевода. Это какой то плагин?

2026-09-05_22-55-42.png

у меня более новая версия которую я выложу чуть пойже я еще не все дописал 

Posted
18 minutes ago, Heyvanushi said:

у меня более новая версия которую я выложу чуть пойже я еще не все дописал 

А, ясно, буду ждать

Posted

Если эффект будет действительно хорошим, я считаю, что этот мод станет событием эпохального масштаба.

Posted
3 hours ago, youngrun said:

Если эффект будет действительно хорошим, я считаю, что этот мод станет событием эпохального масштаба.

всеравно приходится что то править например иногда после переноса строк 
/n/nI можно увидеть вместо 
/n/nЯ

хотя я думаю это можно исправить и настроить ситаксис через плагины и словари для улучшение перевода 

Posted
4 hours ago, Heyvanushi said:

всеравно приходится что то править например иногда после переноса строк 
/n/nI можно увидеть вместо 
/n/nЯ

хотя я думаю это можно исправить и настроить ситаксис через плагины и словари для улучшение перевода 

Я модов пять перевёл и проблем не заметил

Posted
1 hour ago, Dark Totenkopf said:

Я модов пять перевёл и проблем не заметил

я постарался исправить в последней версии но не отрицаю что могут проскакивать 

Posted
2 hours ago, Dark Totenkopf said:

Я модов пять перевёл и проблем не заметил

Глянул я переводчик который ты писал выше решил спиреть пару функций из него 

Posted (edited)
48 minutes ago, Heyvanushi said:

Глянул я переводчик который ты писал выше решил спиреть пару функций из него 

ModTranslationHelper? Глючный он конечно, жесть, единственный плюс я им перевёл несколько модов для стелариса, но в больших файлах он половину не переводит, почему то, а в файле Lustful Void, traits сам код исказил, да так что мне пришлось с вилкой вычищать ту грязь что он натворил  

Edited by Dark Totenkopf
Posted
16 minutes ago, Dark Totenkopf said:

ModTranslationHelper? Глючный он конечно, жесть, единственный плюс я им перевёл несколько модов для стелариса, но в больших файлах он половину не приводит почему то, а в файле Lustful Void, traits сама код исказил, да так что мне пришлось с вилкой вычищать ту грязь что он натворил  

он написан на пайтоне и работает через их скрипты но почитав функционал я решил что пару функций будут полезными 

 

Quote
## 1.0.2
 
### Новое
- Ванильный перевод. Программа умеет сканировать папку локализации ванильной игры CK3 (`localisation/english`, `localisation/russian` и т.п.). Если значение строки мода совпадает со строкой ванилы, берётся готовый официальный перевод — онлайн-переводчик не вызывается. Приоритет источников: терминология → словарь пользователя → ванильная локализация → онлайн-переводчик.
- Настройка «Ванильная локализация»: выбор папки ванили, очистка, индикатор просканированных ключей по языкам. Принимает и папку конкретного языка (`...\localization\russian`), и корень локализации — индексы строятся по всем языкам.
- Автоопределение папки ванильной локализации. Кнопка «Найти автоматически» ищет Crusader Kings III: реестр Steam (`SteamPath`), `libraryfolders.vdf`, а также распространённые папки-библиотеки (`steamapps`, `Steam`, `SteamLibrary`, `Games`, ...) на всех дисках; подходит и лицензионный `SteamLibrary\steamapps\common\Crusader Kings III\game\localization\{russian}`, и `\game\localisation`. В настройках показан стандартный путь.
- Локализация прошлой версии мода. Пользователь указывает папку, где лежит перевод прошлой версии (например, резервная копия мода до апдейта). Если строка уже переведена — перевод берётся из прошлой версии, строка не переводится повторно. Помогает после обновления мода: не нужно вручную искать, какие строки добавились, а какие уже переведены. Функцию можно отключить в настройках. Приоритет: терминология → словарь → прошлая версия → ванила → онлайн.
- Безопасность переиспользования: если под тем же ключом в прошлой версии лежит английский текст и он изменился в новой версии — старый перевод не берётся.

 

Posted

Я не понял, а что такое тут XChangeTranslationServer? Я было подумал, что можно через локальную нейронку в LM Studio подрубить - оказалось нет... 

Posted

 

59 minutes ago, MaceWindow said:

Я не понял, а что такое тут XChangeTranslationServer? Я было подумал, что можно через локальную нейронку в LM Studio подрубить - оказалось нет... 

Означает то что и написано , позволяет через локальный сервер запускать переводчики без API ключей и подобных заморочек с переводом , в программу встроен редактор и проверка перевода да лучшей достоверности , но ты можешь отредактировать написав JS файл и запустить его как плагин и фильтрация будет уже по нему 
сервер работает по принципу https://github.com/RedSGued/XCL-Translator/tree/main/server взятому от сюда т.е от другой моей программы , если что то не понятно смогу добавить шаблон как он сделан с локализацией , только будет для какой то конкретной цели , в других случаях привлекать нейронку я сюда не вижу смысла по причине того что результат переводов меня более чем устраивает и нет того что бы я исправлял это после фильтрации 

Posted

As of now, it seems to have no effect on simplified Chinese. The file has been translated, but it didn't take effect. I think it might be a problem with the encoding or something like that.

Posted
1 hour ago, Elizabethville said:

As of now, it seems to have no effect on simplified Chinese. The file has been translated, but it didn't take effect. I think it might be a problem with the encoding or something like that.

Okay, I’ll take a look now—what do you call the localization to simplified Chinese?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...