Project

General

Profile

Как формируется файл R2E.LNG

Назначение файла

Данный файл содержит строки, используемые в пользовательском интерфейсе и перевод этих строк на 2 основных языка - русский и английский. Как формируется исходный файл написано ниже. После формирования файла он может быть дополнительно обработан утилитой перевода строк lang.exe - изменен перевод строк на обоих языках, исправлены орфографические ошибки и пр.
В процессе работы программа берет все переводимые строки из данного файла, и, в зависимости от настроек, использует перевод на один из двух языков.

Расположение файла

При работе приложения файл должен находится в том же каталоге, что и выполняемые файлы.
В системе исходных текстов файл R2E.LNG находится в каталоге версия>\RUS_ENG.

<code class="div">
Внимание, файл находится под контролем SourceSafe, его изменение должно сопровождаться операциями Check out и Check in.

Формат файла

Файл является текстовым и записан в байтовой кодировке Windows-1251.
Для каждой текстовой строки в файле хранится несколько строк, идущих подряд. например:

KEY "Z_Cancel tasks"
FLG "1"
RUS "Остановить задания"
ENG "Cancel tasks"
  • KEY - Это ключевая строка, по которой программа ищет перевод. Ее нельзя модифицировать. Данная строка имеет вид или Z_English string, или *Русский текст-=-Английский текст*. В первом случае предопределен только английский текст, во втором- русский и английский
  • FLG - Бывает только с последующей 1. Признак того, что строка актуально используется в программе. Сделано для того, чтобы сохранить в файле строки, переведенные ранее. Возможно, в будущем данные строки снова будут использованы и перевод будет сохранен.
    Неиспользуемые строки смещены в конец файла, после всех используемых.
  • RUS - перевод на русский. Изначально формируется по ключевой строке, если он там есть. Эту строку можно менять.
  • ENG - перевод на английский. Изначально формируется по ключевой строке, он там есть всегда. Эту строку можно менять.

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

Формирование файла

До версии 2.14 включительно файл R2E.LNG формировался при помощи утилиты trans_src.exe, которая, в свою очередь, использовала компилятор C VC6. В виду достаточно высокой сложности использования trans_src.exe данный файл формировался достаточно редко и часть строк, используемых в программе, отсутствовала в файле, была недоступна для перевода через lang.exe, и при отображении использовался только стандартный перевод на английский и русский языки, взятый из ключа.

Начиная с 2.15 система формирования строк изменена. Теперь для этого используются две утилиты, расположенные в каталоге версия>\RUS_ENG.

* DumpSln - извлекает из файлов .sln или.vcproj все файлы, включенные в солюшн или проект.
Исходный проект утилиты находится в версия>\UTILITIES\DumpSln

* Это консольное приложение, параметры запуска:

* DumpSln.exe [/ext:ext_1] … [/ext:ext_n] file_1 [file_2] [file_3] …

* file_i - имя файла проекта или солюшна. Можно указывать относительные имена, относительно текущего каталога.

* /ext:ext_1 - указание фильтра расширений. Например, /ext:cpp. Можно указать произвольное кол-во расширений. Если не указать ни одного - будут выданы все включенные файлы, включая файлы .vcpoj, включенные в.sln

* Результат работы выводится в стандартный поток вывода в виде списка имен файлов.

* Ошибки выводятся в поток ошибок

* Файлы выводятся в виде полных имен.

* ExtractStrings - извлекает из файлов .сpp,.h, *.RC строки, предназначенные для перевода и формирует результат в формате R2E.LNG
Исходный проект утилиты находится в версия>\UTILITIES\ExtractStrings

* Программа считывает из входного потока построчный список файлов и ищет в них строки, предназначенные для перевода. Какие это строки, чем они отличаются, знает Констатнтинов П.А. и Хаханов. А.В.

* Параметры запуска

* ExtractStrings.exe [trace | Path_to_R2E.LNG]

* trace - включает режим трассировки, при этом на выход подается поток из найденных в исходных файлах строк и сформированных по ним ключей. Для отладки. При реальной работе нельзя указывать.

* Программа считывает указанный файл R2E.LNG. Если имя не указано, предполагается, что файл находится в текущем каталоге и называется R2E.LNG

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

* Программа сохраняет перевод строк, сделанный ранее. Т.е. единожды переведенная строка сохраняет свой перевод при последующих формированиях R2E.LNG

Обе утилиты устанавливают переменную окружения ERRORLEVEL в ненулевое значение при завершении работы с ошибкой, это можно использовать при автоматизации их вызова.

Практическое использование

При запуске из каталога версия>\RUS_ENG командная строка, формирующая R2E.LNG для всех строк, используемых в проекте DIGIDPOT выглядит так:

dumpsln.exe /ext:h /ext:cpp /ext:rc ../solutions/digispot/digispot.sln  | extractstrings.exe >r2e.lng
<code class="div">
Это ПРИМЕР использования, не проверяющий ошибки и результаты работы!


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

В файле версия>\RUS_ENG\ExtractStrings.BAT находится пример практического кода формирования R2E.LNG с проверками ошибок вызова.

Перевод файла

Перевод файла осуществляется либо при помощи утилиты lang.exe, находящейся в каталоге версия>\RUS_ENG, либо, что гораздо менее удобно и не рекомендуется, при помощи любого текстового редактора.

LANG.exe, параметры запуска:

* LANG.exe [-admin]

* -admin- позволяет сохранить изменения, если ключ не указан, то программа запускается в режиме только чтение, без возможности сохранить изменения.

Программа должна быть запущена из того же каталога, где хранится R2E.lng.

Главное окно

{{Image("lang.PNG")}}

Группа кнопок SHOW. Выбирает, что отображается для каждой строки:

  • ID. Это внутренний ключ. Не меняется. Например, Z_Refresh или Обновить-=-Refresh
  • RUS. Перевод на русский
  • ENG: Перевод на английский
  • LNG: Перевод на третий язык.

Sort: По какому поля отсортировано

Lng: Выбор "третьего" языка. При создании нового файла необходимо дать ему правильное имя из трех символов, например, DEU. Список имен приведен в конце страницы.

Вторая строчка органов управления: поиск, в строке указывается искомое, переключатель определяет, в каких полях идет поиск. Cmn - в поле комментария.
Внимание. Поиск идет в полях, соответствующих НАЖАТОЙ кнопке, а не подсвеченной зеленым.

Для перевода строки нужно выполнить двойной клик на строке RUS или нажать Enter. Ввести текст и снова нажать Enter.

Работу с программой необходимо завершить, нажав кнопку OK в правом нижнем углу, тогда результаты сохранятся в r2e.lng

Список языков

{0x401, "ARA",  "Arabic (Saudi Arabia)"},
{0x402, "BGR",  "Bulgarian"},
{0x403, "CAT",  "Catalan"},
{0x404, "CHT",  "Chinese (Taiwan)"},
{0x405, "CSY",  "Czech"},
{0x406, "DAN",  "Danish"},
{0x407, "DEU",  "German (Germany)"},
{0x408, "ELL",  "Greek"},
{0x409, "ENU",  "English (United States)"},
{0x40A, "ESP",  "Spanish (Traditional Sort)"},
{0x40B, "FIN",  "Finnish"},
{0x40C, "FRA",  "French (France)"},
{0x40D, "HEB",  "Hebrew"},
{0x40E, "HUN",  "Hungarian"},
{0x40F, "ISL",  "Icelandic"},
{0x410, "ITA",  "Italian (Italy)"},
{0x411, "JPN",  "Japanese"},
{0x412, "KOR",  "Korean"},
{0x413, "NLD",  "Dutch (Netherlands)"},
{0x414, "NOR",  "Norwegian (Bokmal)"},
{0x415, "PLK",  "Polish"},
{0x416, "PTB",  "Portuguese (Brazil)"},
{0x418, "ROM",  "Romanian"},
{0x419, "RUS",  "Russian"},
{0x41A, "HRV",  "Croatian"},
{0x41B, "SKY",  "Slovak"},
{0x41C, "SQI",  "Albanian"},
{0x41D, "SVE",  "Swedish"},
{0x41E, "THA",  "Thai"},
{0x41F, "TRK",  "Turkish"},
{0x420, "URD",  "Urdu"},
{0x421, "IND",  "Indonesian"},
{0x422, "UKR",  "Ukrainian"},
{0x423, "BEL",  "Belarusian"},
{0x424, "SLV",  "Slovenian"},
{0x425, "ETI",  "Estonian"},
{0x426, "LVI",  "Latvian"},
{0x427, "LTH",  "Lithuanian"},
{0x429, "FAR",  "Farsi"},
{0x42A, "VIT",  "Vietnamese"},
{0x42B, "HYE",  "Armenian"},
{0x42C, "AZE",  "Azeri (Latin)"},
{0x42D, "EUQ",  "Basque"},
{0x42F, "MKI",  "FYRO Macedonian"},
{0x432, "TSN",  "Tswana"},
{0x434, "XHO",  "Xhosa"},
{0x435, "ZUL",  "Zulu"},
{0x436, "AFK",  "Afrikaans"},
{0x437, "KAT",  "Georgian"},
{0x438, "FOS",  "Faeroese"},
{0x439, "HIN",  "Hindi"},
{0x43A, "MLT",  "Maltese"},
{0x43B, "SME",  "Sami, Northern (Norway)"},
{0x43E, "MSL",  "Malay (Malaysia)"},
{0x43F, "KKZ",  "Kazakh"},
{0x440, "KYR",  "Kyrgyz (Cyrillic)"},
{0x441, "SWK",  "Swahili"},
{0x443, "UZB",  "Uzbek (Latin)"},
{0x444, "TTT",  "Tatar"},
{0x445, "BNG",  "Bengali (India)"},
{0x446, "PAN",  "Punjabi"},
{0x447, "GUJ",  "Gujarati"},
{0x449, "TAM",  "Tamil"},
{0x44A, "TEL",  "Telugu"},
{0x44B, "KAN",  "Kannada"},
{0x44C, "MYM",  "Malayalam (India)"},
{0x44E, "MAR",  "Marathi"},
{0x44F, "SAN",  "Sanskrit"},
{0x450, "MON",  "Mongolian (Cyrillic)"},
{0x452, "CYM",  "Welsh"},
{0x456, "GLC",  "Galician"},
{0x457, "KNK",  "Konkani"},
{0x45A, "SYR",  "Syriac"},
{0x465, "DIV",  "Divehi"},
{0x46B, "QUB",  "Quechua (Bolivia)"},
{0x46C, "NSO",  "Northern Sotho"},
{0x481, "MRI",  "Maori"},
{0x801, "ARI",  "Arabic (Iraq)"},
{0x804, "CHS",  "Chinese (PRC)"},
{0x807, "DES",  "German (Switzerland)"},
{0x809, "ENG",  "English (United Kingdom)"},
{0x80A, "ESM",  "Spanish (Mexico)"},
{0x80C, "FRB",  "French (Belgium)"},
{0x810, "ITS",  "Italian (Switzerland)"},
{0x813, "NLB",  "Dutch (Belgium)"},
{0x814, "NON",  "Norwegian (Nynorsk)"},
{0x816, "PTG",  "Portuguese (Portugal)"},
{0x81A, "SRL",  "Serbian (Latin)"},
{0x81D, "SVF",  "Swedish (Finland)"},
{0x82C, "AZE",  "Azeri (Cyrillic)"},
{0x83B, "SMF",  "Sami, Northern (Sweden)"},
{0x83E, "MSB",  "Malay (Brunei Darussalam)"},
{0x843, "UZB",  "Uzbek (Cyrillic)"},
{0x86B, "QUE",  "Quechua (Ecuador)"},
{0xC01, "ARE",  "Arabic (Egypt)"},
{0xC04, "ZHH",  "Chinese (Hong Kong S.A.R.)"},
{0xC07, "DEA",  "German (Austria)"},
{0xC09, "ENA",  "English (Australia)"},
{0xC0A, "ESN",  "Spanish (International Sort)"},
{0xC0C, "FRC",  "French (Canada)"},
{0xC1A, "SRB",  "Serbian (Cyrillic)"},
{0xC3B, "SMG",  "Sami, Northern (Finland)"},
{0xC6B, "QUP",  "Quechua (Peru)"},
{0x1001,"ARL",  "Arabic (Libya)"},
{0x1004,"ZHI",  "Chinese (Singapore)"},
{0x1007,"DEL",  "German (Luxembourg)"},
{0x1009,"ENC",  "English (Canada)"},
{0x100A,"ESG",  "Spanish (Guatemala)"},
{0x100C,"FRS",  "French (Switzerland)"},
{0x101A,"HRB",  "Croatian (Bosnia and Herzegovina)"},
{0x103B,"SMJ",  "Sami, Lule (Norway)"},
{0x1401,"ARG",  "Arabic (Algeria)"},
{0x1404,"ZHM",  "Chinese (Macau S.A.R.)"},
{0x1407,"DEC",  "German (Liechtenstein)"},
{0x1409,"ENZ",  "English (New Zealand)"},
{0x140A,"ESC",  "Spanish (Costa Rica)"},
{0x140C,"FRL",  "French (Luxembourg)"},
{0x141A,"BSB",  "Bosnian (Latin, Bosnia and Herzegovina)"},
{0x143B,"SMK",  "Sami, Lule (Sweden)"},
{0x1801,"ARM",  "Arabic (Morocco)"},
{0x1809,"ENI",  "English (Ireland)"},
{0x180A,"ESA",  "Spanish (Panama)"},
{0x180C,"FRM",  "French (Monaco)"},
{0x181A,"SRS",  "Serbian (Latin, Bosnia and Herzegovina)"},
{0x183B,"SMA",  "Sami, Southern (Norway)"},
{0x1C01,"ART",  "Arabic (Tunisia)"},
{0x1C09,"ENS",  "English (South Africa)"},
{0x1C0A,"ESD",  "Spanish (Dominican Republic)"},
{0x1C1A,"SRN",  "Serbian (Cyrillic, Bosnia and Herzegovina)"},
{0x1C3B,"SMB",  "Sami, Southern (Sweden)"},
{0x2001,"ARO",  "Arabic (Oman)"},
{0x2009,"ENJ",  "English (Jamaica)"},
{0x200A,"ESV",  "Spanish (Venezuela)"},
{0x203B,"SMS",  "Sami, Skolt (Finland)"},
{0x2401,"ARY",  "Arabic (Yemen)"},
{0x2409,"ENB",  "English (Caribbean)"},
{0x240A,"ESO",  "Spanish (Colombia)"},
{0x243B,"SMN",  "Sami, Inari (Finland)"},
{0x2801,"ARS",  "Arabic (Syria)"},
{0x2809,"ENL",  "English (Belize)"},
{0x280A,"ESR",  "Spanish (Peru)"},
{0x2C01,"ARJ",  "Arabic (Jordan)"},
{0x2C09,"ENT",  "English (Trinidad)"},
{0x2C0A,"ESS",  "Spanish (Argentina)"},
{0x3001,"ARB",  "Arabic (Lebanon)"},
{0x3009,"ENW",  "English (Zimbabwe)"},
{0x300A,"ESF",  "Spanish (Ecuador)"},
{0x3401,"ARK",  "Arabic (Kuwait)"},
{0x3409,"ENP",  "English (Philippines)"},
{0x340A,"ESL",  "Spanish (Chile)"},
{0x3801,"ARU",  "Arabic (U.A.E.)"},
{0x380A,"ESY",  "Spanish (Uruguay)"},
{0x3C01,"ARH",  "Arabic (Bahrain)"},
{0x3C0A,"ESZ",  "Spanish (Paraguay)"},
{0x4001,"ARQ",  "Arabic (Qatar)"},
{0x400A,"ESB",  "Spanish (Bolivia)"},
{0x440A,"ESE",  "Spanish (El Salvador)"},
{0x480A,"ESH",  "Spanish (Honduras)"},
{0x4C0A,"ESI",  "Spanish (Nicaragua)"},
{0x500A,"ESU",  "Spanish (Puerto Rico)"}

Add picture from clipboard (Maximum size: 742 MB)