Как формируется файл R2E.LNG¶
- Table of contents
- Как формируется файл 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)"}