Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
Перевожу программу My Notes Keeper китайского творчества. Программа как бы имеет русский перевод, но разработчики с обновлениями умудряются испортить перевод для всех языков. Файл локализации сделан по принципу: Ключ = Значение (например:FmtApplyStyle = Применить стиль). Разработчики частенько изменяют эти ключи, и вследствие чего перевод ломается для всех языков. Большинство ключей я восстановил из английского файла локализации, еще немного ключей я нашел с помощью Radialix через поиск английского текста и просмотр на вкладке ресурсов колонки Компоненты/Свойства. Но этот метод не всегда работает. Бывает, что найденный текст с английским значением присутствует только в жёстко закодированных строках.
Есть ли какие способы узнать ключ для нужной строки перевода?
Языковой файл представлен в формате INI, где - имена секций (первая не в счёт) сопоставлены с названиями ресурсов приложения (строки - Strings и формы - RCData); - имена ключей представляют собой уникальные идентификаторы строк для ресурсов приложения; - значения ключей - это собственно строки для локализации.
Для форм (раздел ресурсов RCData) имена ключей совпадают с именами объектов на этой форме. Например, посмотрим форму TFRMITEMPROP (инструмент MiTeC DFM Editor).
В списке слева показаны имена всех объектов на этой форме. Объект, который имеет свойство "Caption" ("Заголовок", "Надпись" - в общем строка), может быть использован для локализации приложения.
Теперь посмотрим в языковом файле секцию этой формы и сопоставим имена ключей с объектами (инструменты AkelPad и Restorator).
Здесь первый ключ с именем "Caption" (1) относится к самой форме (это тоже объект) и соответствует одноименному свойству, значение которого является значением ключа (строка "Item Propperties") в языковом файле. Второй ключ "lblCaption" (2) является именем объекта TLabel. А значение ключа (2) соответствует значению свойства "Caption" у данного объекта (строка "Caption:"). И так далее (3) для всех объектов, у которых есть строки.
Таким образом, если в языковом файле отсутствует перевод какого-то объекта в какой-то форме, то таким способом можно его дополнить и перевести. По идее программа должна подхватить его автоматически.
Но вот, например, строковый ресурс (секция Strings) в языковом файле представлен собственными именами ключей (в ресурсах программы этих имен нет, только сами строки). Поэтому дополнить перевод не получится. Это также относится и к строкам в коде (жестко кодированные). Если разработчик не предусмотрел перевод какой-то строки (забыл, упустил, пропустил) и не добавил для неё в код программы соответствующий ключ и его инициализацию, то у нас нет никаких возможностей сделать это за него. В этом случае нужно вести активную переписку с автором программы, показывать ему скрины окон приложения, где отсутствует перевод, и просить его дополнить языковой файл. Других вариантов нету.
В ресурсах стоит другой ключ, который нерабочий. А TBXItem31 откуда взялся?
Давай разберемся. Поищем объект TBXItem31 в ресурсах. Он найдется в ресурсах RCData главной формы TFM. Объект является элементом подменю и не содержит свойства с текстом. Но у него есть другое свойство - Action (т.е. действие) со значением actTreeAddAfter.
Поищем в ресурсах объект именем actTreeAddAfter. Есть такой, в той же форме TFM. И у этого объекта есть текстовое свойство "Caption" со значением "Add Item &After".
Как видишь, объект TBXItem31 имеет вложенный подобъект actTreeAddAfter. Таким образом привязка строки выполняется на основной объект, т.е. в языковом файле записывается как TBXItem31 = Add Item &After.
Теперь по аналогии добавляем недостающие строки в языковой файл. Берем, к примеру, строку "Align &Left" и ищем её в ресурсах. Она находится в ресурсах главной формы TFM, в объекте с именем actFormatAlignLeft. Также обрати внимание, что объект еще имеет свойство Hint (Подсказка) со значением "Align Left|Align lines to the left", которое также можно перевести.
Теперь поищем объекты, в которых есть свойство Action со значением actFormatAlignLeft. В той же форме найдется два таких объекта. Первый с именем biAlignLeft, а второй miAlignLeft.
Так как объекта два и различаются они только приставкой "bi" и "mi", а строковое значение они имеют одно и то же, возможно, в языковом файле будет использоваться только один ключ, с основным именем AlignLeft (на самом деле это так есть, как показала практика). Для подсказки (Hint) к имени ключа необходимо добавить суффикс _Hint.
В языковом файле, в секции главной формы [Main], нужно добавить две строки :
AlignLeft = Выровнять по левому краю
AlignLeft_Hint = Выровнять по левому краю|Выравнивание строк по левому краю
Одноименные подменю для вставленного в документ (EditObject = Объект и EditPic = Редактировать изображение) я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...
я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...
Да, в ресурсах есть, но в файле локализации программа их не видит. Похоже автор накосячил (забыл, пропустил, отложил). Возможно в следующей версии исправит, если ему сообщить. Сами мы ничего не сделаем. Разве только переводить в ресурсах, но тогда пропадает смысл языкового файла. В общем, если есть интерес поддерживать локализацию этой программы, свяжись с автором.
Закончил с менюшками и перешёл к локализации диалоговых окон. Но тут оказалось ещё труднее.
1) В файле локализации диалоговые окна разбиты на секции, что в квадратных скобках. Откуда брать название нужных секций если для некоторых окон они вообще отсутствуют? Например к Настройке панели инструментов (Toolbar Customize); Просмотрщика (Viewer) и так далее...
2) Как прописывать ключи и перевод для менюшек из выпадающего списка? Что, например, можно взять из этого блочка:
object cmbTBIconSize:TComboBox
Left = 291
Top = 340
Width = 65
Height = 21
Style = csDropDownList
ItemIndex = 0
TabOrder = 8
Text = 'Small'
Items.Strings = (
'Small'
'Large')
end
3) Как прописать название цвета текста "По умолчанию" в окне Стили:
По логике в языковой файл нужно добавлять имена объектов из ресурсов по следующему принципу: имена форм - имена секций, имена объектов на форме - имена ключей. Как мы уже убедились, такой принцип работает. Но для некоторых диалогов, как показывает практика, нет. Полагаю, что автор не предусмотрел их локализацию и не подключил к ним модуль локализации. Такое бывает, когда программа активно развивается.
Вот берем диалог настройки панели инструментов. Форма называется "frmToolbarCustomize". В языковом файле есть секция с именем "ToolbarEditor" для этой формы, но перевод для неё не работает. Если изменить имя секции на "ToolbarCustomize", приставка "frm" отбрасывается (это видно из моего первого сообщения). Но перевод так и не работает. Или автор обозвал секцию как-то по-другому и привязал это имя к данному диалогу, или забыл для этой формы включить механизм локализации. Выводы делайте сами.
Как можно прописать несколько абзацев переведённого текста в файле локализации одной строкой, но в переводе чтобы выглядело как несколько абзацев? Какой символ нужно поставить между абзацами? Если разбить его абзацем, то в переводе будет отображаться только первый абзац.
Сообщение отредактировал Йота 27 ноября 2019 - 16:08