• Добро пожаловать на WYLEK.ru. Пожалуйста, войдите или зарегистрируйтесь.
 
134 гостей, 2 пользователей

Поиск ключей для текстовых файлов перевода

Автор Йота, 25 ноября 2019, 19:23:02

« предыдущая - следующая »

ЙотаАвтор темы

Перевожу программу My Notes Keeper китайского творчества. Программа как бы имеет русский перевод, но разработчики с обновлениями умудряются испортить перевод для всех языков. Файл локализации сделан по принципу: Ключ = Значение (например: FmtApplyStyle = Применить стиль). Разработчики частенько изменяют эти ключи, и вследствие чего перевод ломается для всех языков.
Большинство ключей я восстановил из английского файла локализации, еще немного ключей я нашел с помощью Radialix через поиск английского текста и просмотр на вкладке ресурсов колонки Компоненты/Свойства. Но этот метод не всегда работает. Бывает, что найденный текст с английским значением присутствует только в жёстко закодированных строках.

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

Krig

Приветствую!

Языковой файл представлен в формате INI, где
- имена секций (первая не в счёт) сопоставлены с названиями ресурсов приложения (строки - Strings и формы - RCData);
- имена ключей представляют собой уникальные идентификаторы строк для ресурсов приложения;
- значения ключей - это собственно строки для локализации.

Для форм (раздел ресурсов RCData) имена ключей совпадают с именами объектов на этой форме. Например, посмотрим форму TFRMITEMPROP (инструмент MiTeC DFM Editor).

Извините, вам запрещён просмотр содержимого спойлеров.


В списке слева показаны имена всех объектов на этой форме. Объект, который имеет свойство "Caption" ("Заголовок", "Надпись" - в общем строка), может быть использован для локализации приложения.

Теперь посмотрим в языковом файле секцию этой формы и сопоставим имена ключей с объектами (инструменты AkelPad и Restorator).

Извините, вам запрещён просмотр содержимого спойлеров.


Здесь первый ключ с именем "Caption" (1) относится к самой форме (это тоже объект) и соответствует одноименному свойству, значение которого является значением ключа (строка "Item Propperties") в языковом файле. Второй ключ "lblCaption" (2) является именем объекта TLabel. А значение ключа (2) соответствует значению свойства "Caption" у данного объекта (строка "Caption:"). И так далее (3) для всех объектов, у которых есть строки.

Таким образом, если в языковом файле отсутствует перевод какого-то объекта в какой-то форме, то таким способом можно его дополнить и перевести. По идее программа должна подхватить его автоматически.

Но вот, например, строковый ресурс (секция Strings) в языковом файле представлен собственными именами ключей (в ресурсах программы этих имен нет, только сами строки). Поэтому дополнить перевод не получится. Это также относится и к строкам в коде (жестко кодированные). Если разработчик не предусмотрел перевод какой-то строки (забыл, упустил, пропустил) и не добавил для неё в код программы соответствующий ключ и его инициализацию, то у нас нет никаких возможностей сделать это за него. В этом случае нужно вести активную переписку с автором программы, показывать ему скрины окон приложения, где отсутствует перевод, и просить его дополнить языковой файл. Других вариантов нету.

ЙотаАвтор темы

Ответ #2 : 26 ноября 2019, 02:27:34 #2 Последнее редактирование: 26 ноября 2019, 02:53:30 от Йота
Krig

Спасибо, что откликнулись.
У меня не получается найти ключи к некоторым пунктам меню. Например:
Manage Templates...
Paragraph &Borders and Background...
Manage Styles...
&Increase Indent
&Decrease Indent
Text &Color
Text Bac&kground Color
Align &Left
Align &Right
Align &Center
Align &Center

И вот еще интересный пример работающей строки:
TBXItem31 = Add Item &After
В ресурсах стоит другой ключ, который нерабочий. А TBXItem31 откуда взялся?
 

Krig

Приветствую!

Цитата: Йота от 26 ноября 2019, 02:27:34В ресурсах стоит другой ключ, который нерабочий. А 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 = Выровнять по левому краю|Выравнивание строк по левому краю

Сохраняем изменения и проверяем в программе.

Пункт меню
Извините, вам запрещён просмотр содержимого спойлеров.


Подсказка
Извините, вам запрещён просмотр содержимого спойлеров.


:ura:

По остальным строкам действуй по аналогии.  :yes:

Строк "Manage Templates..." и "Manage Styles..." в ресурсах нет. Это строки в коде и сделать для них перевод в языковом файле нет никакой возможности.  :dontknow:

ЙотаАвтор темы

Ответ #4 : 26 ноября 2019, 15:37:27 #4 Последнее редактирование: 26 ноября 2019, 15:46:36 от Йота
Цитата: Krig от 26 ноября 2019, 14:30:46По остальным строкам действуй по аналогии.  :yes:
Спасибо большое за подсказки.

А что можете сказать за такие вот пункты меню: Apply Style, и подменю на изображении: Object и Edit Picture...

pmiEditObject = Object
TBXItem1 = Edit Picture...
TBXSubmenuItem2 = &Apply Style

Одноименные подменю для вставленного в документ (EditObject = Объект и EditPic = Редактировать изображение) я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...

Krig

Цитата: Йота от 26 ноября 2019, 15:37:27я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...
Да, в ресурсах есть, но в файле локализации программа их не видит. Похоже автор накосячил (забыл, пропустил, отложил). Возможно в следующей версии исправит, если ему сообщить. Сами мы ничего не сделаем. Разве только переводить в ресурсах, но тогда пропадает смысл языкового файла. В общем, если есть интерес поддерживать локализацию этой программы, свяжись с автором.  :yes:

ЙотаАвтор темы

Ответ #6 : 26 ноября 2019, 23:07:32 #6 Последнее редактирование: 26 ноября 2019, 23:12:45 от Йота
Закончил с менюшками и перешёл к локализации диалоговых окон.  :poll: Но тут оказалось ещё труднее. :wacko_mini2:

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) Как прописать название цвета текста "По умолчанию" в окне Стили:

 
object cmbTextColor: TRVColorCombo
      Left = 112
      Top = 17
      Width = 105
      Height = 26
      Indeterminate = False
      OnColorChange = cmbTextColorColorChange
      DefaultCaption = 'Default'
      TabOrder = 1
      Caption = 'cmbTextColor'
    end

Krig

По логике в языковой файл нужно добавлять имена объектов из ресурсов по следующему принципу: имена форм - имена секций, имена объектов на форме - имена ключей. Как мы уже убедились, такой принцип работает. Но для некоторых диалогов, как показывает практика, нет. Полагаю, что автор не предусмотрел их локализацию и не подключил к ним модуль локализации. Такое бывает, когда программа активно развивается.

Вот берем диалог настройки панели инструментов. Форма называется "frmToolbarCustomize". В языковом файле есть секция с именем "ToolbarEditor" для этой формы, но перевод для неё не работает. Если изменить имя секции на "ToolbarCustomize", приставка "frm" отбрасывается (это видно из моего первого сообщения). Но перевод так и не работает. Или автор обозвал секцию как-то по-другому и привязал это имя к данному диалогу, или забыл для этой формы включить механизм локализации. Выводы делайте сами.

ЙотаАвтор темы

Ответ #8 : 27 ноября 2019, 02:45:34 #8 Последнее редактирование: 27 ноября 2019, 16:08:11 от Йота
Как можно прописать несколько абзацев переведённого текста в файле локализации одной строкой, но в переводе чтобы выглядело как несколько абзацев? Какой символ нужно поставить между абзацами?
Если разбить его абзацем, то в переводе будет отображаться только первый абзац.

mishem

Попробуй использовать символы \r\n или \r\r или \r или \n
Короче пробуй разные варианты. Может быть \r\n\r\n.