Jump to content

[mod] CK3 Mod Translator


Recommended Posts

Posted

CK3 Mod Translator

View File
# CK3 Mod Translator
 
Универсальный переводчик локализации модов для Crusader Kings III.
 
CK3 Mod Translator — бесплатная настольная программа для Windows, которая в один клик переводит файлы локализации (`l_english.yml`, `l_russian.yml` и др.) модов для **Crusader Kings III** на нужный язык. Результат — готовый файл, который игра корректно читает: правильные заголовки языков, версии ключей и экранирование.
 
Портативная версия — не требует установки. Просто скачайте `.exe`, запустите и переводите. Данные (кэш, словари, история) сохраняются на вашем компьютере.
 
---
 
## Возможности
 
### 🚀 Быстрый массовый перевод
- Перевод целой папки мода или одного файла в несколько кликов.
- Пакетная обработка с прогресс-баром по ходу работы.
- Автоматическое распознавание структуры `.yml` файлов локализации CK3.
 
### 🌍 29 игровых языков
Поддержка всех языков, которые играет CK3: русский, английский, немецкий, французский, испанский, польский, украинский, китайский (упрощённый и традиционный), японский, корейский, португальский/бразильский, итальянский, турецкий, чешский, венгерский, нидерландский, скандинавские, финский, румынский, арабский, персидский, вьетнамский, тайский, латинский и другие.
 
### 🔌 Несколько провайдеров перевода
- XCL — встроенный локальный сервер перевода, стартует вместе с программой (без внешних ключей).
- Google Translate — через локальный прокси.
- DeepL — высокое качество (требуется API-ключ).
- MyMemory — бесплатный сервис без ключа.
 
### 🧠 Умный перевод
- Кэш переводов — повторные переводы мгновенные, без лишних запросов.
- Защита кода игры — метки, шаблоны и escape-последовательности (`\n`, `\t`) сохраняются нетронутыми.
- Словари и терминология— задайте свои термины и глоссарий; программа закрепит их по всему переводу.
- Умная обработка частичных переводов — переведённые строки не переводит повторно.
 
### 📚 Встроенные инструменты
- Редактор файлов — посмотреть и поправить любой `.yml` до/после перевода.
- История переводов — журнал всех выполненных операций.
- Управление кэшем — экспорт/импорт, просмотр статистики, очистка.
 
### 🧩 Плагины
Программу можно **расширять своими плагинами**. Напишите простой `.js`-файл — и добавьте свою логику перевода, постоянный глоссарий, своего переводчика или автоматические правки. Плагины включаются/выключаются в один клик.
 
---
 
## Быстрый старт
 
1. Скачайте и запустите `CK3 Mod Translator.rar`.
2. Нажмите «Выбрать папку» и укажите папку мода (там, где `localisation` / `localization`).
3. Выберите исходный и целевой язык.
4. Нажмите «Перевести» — готовые файлы появятся в папке целевого языка.
 
---
 
## Системные требования
 
- Windows 10 / 11 (x64)
- около **150 МБ** свободного места
- Интернет (для облачных провайдеров перевода)
 
---
 
## Важно
 
- Плагины — это исполняемый код. Устанавливайте только те плагины, которым доверяете.
- Для использования DeepL требуется API-ключ.

CK3tran.jpg


 

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Я

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

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
×
×
  • Create New...