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

Перевожу программу My Notes Keeper китайского творчества. Программа как бы имеет русский перевод, но разработчики
  1. Оффлайн

    Автор темы

    Йота

    Звание: Прибывший

    Проверенные

    Сообщений: 11

    Создано тем: 2

    Рейтинг: 1

    Репа: (6|6|0)

    Баллы: 51

    Был: 2020-03-18 13:10

    Лайков: 6

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

    Есть ли какие способы узнать ключ для нужной строки перевода?
    25 ноября 2019 - 19:23 / #1
  2. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

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

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

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



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

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



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

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

    Но вот, например, строковый ресурс (секция Strings) в языковом файле представлен собственными именами ключей (в ресурсах программы этих имен нет, только сами строки). Поэтому дополнить перевод не получится. Это также относится и к строкам в коде (жестко кодированные). Если разработчик не предусмотрел перевод какой-то строки (забыл, упустил, пропустил) и не добавил для неё в код программы соответствующий ключ и его инициализацию, то у нас нет никаких возможностей сделать это за него. В этом случае нужно вести активную переписку с автором программы, показывать ему скрины окон приложения, где отсутствует перевод, и просить его дополнить языковой файл. Других вариантов нету.
    Йота, NNK_RTR нравится это сообщение.
    Сообщение отредактировал 23 января 2023 - 18:39
    26 ноября 2019 - 01:56 / #2
  3. Оффлайн

    Автор темы

    Йота

    Звание: Прибывший

    Проверенные

    Сообщений: 11

    Создано тем: 2

    Рейтинг: 1

    Репа: (6|6|0)

    Баллы: 51

    Был: 2020-03-18 13:10

    Лайков: 6

    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 откуда взялся?
    Сообщение отредактировал 23 января 2023 - 18:39
    26 ноября 2019 - 02:27 / #3
  4. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

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

    Цитата: Йота
    В ресурсах стоит другой ключ, который нерабочий. А 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
    Йота нравится это сообщение.
    Сообщение отредактировал 23 января 2023 - 18:40
    26 ноября 2019 - 14:30 / #4
  5. Оффлайн

    Автор темы

    Йота

    Звание: Прибывший

    Проверенные

    Сообщений: 11

    Создано тем: 2

    Рейтинг: 1

    Репа: (6|6|0)

    Баллы: 51

    Был: 2020-03-18 13:10

    Лайков: 6

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


    Спасибо большое за подсказки.

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

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


    Одноименные подменю для вставленного в документ (EditObject = Объект и EditPic = Редактировать изображение) я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...
    Сообщение отредактировал 23 января 2023 - 18:40
    26 ноября 2019 - 15:37 / #5
  6. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

    Цитата: Йота
    я перевёл и они работают, но с дублями в подменю не получается. Вроде в ресурсах есть...


    Да, в ресурсах есть, но в файле локализации программа их не видит. Похоже автор накосячил (забыл, пропустил, отложил). Возможно в следующей версии исправит, если ему сообщить. Сами мы ничего не сделаем. Разве только переводить в ресурсах, но тогда пропадает смысл языкового файла. В общем, если есть интерес поддерживать локализацию этой программы, свяжись с автором. yes
    26 ноября 2019 - 22:07 / #6
  7. Оффлайн

    Автор темы

    Йота

    Звание: Прибывший

    Проверенные

    Сообщений: 11

    Создано тем: 2

    Рейтинг: 1

    Репа: (6|6|0)

    Баллы: 51

    Был: 2020-03-18 13:10

    Лайков: 6

    Закончил с менюшками и перешёл к локализации диалоговых окон. 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
    Сообщение отредактировал 23 января 2023 - 18:40
    26 ноября 2019 - 23:07 / #7
  8. Оффлайн

    Krig

    Звание: Бывалый

    Знаток

    Сообщений: 188

    Создано тем: 7

    Рейтинг: 4

    Репа: (86|86|0)

    Баллы: 56

    Был: 2023-03-14 15:26

    Лайков: 82

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

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

    Автор темы

    Йота

    Звание: Прибывший

    Проверенные

    Сообщений: 11

    Создано тем: 2

    Рейтинг: 1

    Репа: (6|6|0)

    Баллы: 51

    Был: 2020-03-18 13:10

    Лайков: 6

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

    mishem

    Звание: Бывалый

    Проверенные

    Сообщений: 159

    Создано тем: 1

    Рейтинг: 4

    Репа: (1|1|0)

    Баллы: 61

    Страна: не указана!

    Был: 2024-12-15 17:00

    Лайков: 3

    Попробуй использовать символы или или или
    Короче пробуй разные варианты. Может быть .
    28 ноября 2019 - 22:51 / #10

Статистика форума, пользователей онлайн: 1 (за последние 20 минут)

Создано тем
1201
Всего сообщений
15804
Пользователей
18048
Новый участник
puika