Редактирование: Gettext в приложениях Windows собранных CMake с использованием MinGW
Материал из Wiki.crossplatform.ru
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
ПРЕДУПРЕЖДЕНИЕ: Длина этой страницы составляет 30 килобайт. Страницы, размер которых приближается к 32 КБ или превышает это значение, могут неверно отображаться в некоторых браузерах. Пожалуйста, рассмотрите вариант разбиения страницы на меньшие части.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 2: | Строка 2: | ||
В данном руководстве будет разобран простой пример локализации приложения в [http://ru.wikipedia.org/wiki/Microsoft_Windows ОС Microsoft Windows] с помощью пакета программ [http://ru.wikipedia.org/wiki/Gettext Gettext]. | В данном руководстве будет разобран простой пример локализации приложения в [http://ru.wikipedia.org/wiki/Microsoft_Windows ОС Microsoft Windows] с помощью пакета программ [http://ru.wikipedia.org/wiki/Gettext Gettext]. | ||
- | |||
При этом подразумеваем, что приложение будем собирать с использованием компилятора [http://ru.wikipedia.org/wiki/MinGW MinGW] при помощи системы кросс-платформенной сборки [http://ru.wikipedia.org/wiki/CMake CMake]. | При этом подразумеваем, что приложение будем собирать с использованием компилятора [http://ru.wikipedia.org/wiki/MinGW MinGW] при помощи системы кросс-платформенной сборки [http://ru.wikipedia.org/wiki/CMake CMake]. | ||
- | После запуска приложение просто будет выполнять печать в консоль строки ''"Привет, мир!"'' и завершаться. | + | После своего запуска, приложение просто будет выполнять печать в консоль строки ''"Привет, мир!"'' и завершаться. |
Данное руководство не является панацеей или каким-то определенным рецептом при решении данной задачи, | Данное руководство не является панацеей или каким-то определенным рецептом при решении данной задачи, | ||
Строка 18: | Строка 17: | ||
# [http://ru.wikipedia.org/wiki/Microsoft_Windows ОС Microsoft Windows] - операционная система семейств XP/Vista/7 и т.п. | # [http://ru.wikipedia.org/wiki/Microsoft_Windows ОС Microsoft Windows] - операционная система семейств XP/Vista/7 и т.п. | ||
# [http://ru.wikipedia.org/wiki/MinGW MinGW] - порт пакета утилит и компиляторов GCC для Microsoft Windows. | # [http://ru.wikipedia.org/wiki/MinGW MinGW] - порт пакета утилит и компиляторов GCC для Microsoft Windows. | ||
- | # [http://ru.wikipedia.org/wiki/CMake CMake] - | + | # [http://ru.wikipedia.org/wiki/CMake CMake] - кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода. |
# [http://ru.wikipedia.org/wiki/Gettext Gettext] - библиотека проекта GNU для интернационализации. | # [http://ru.wikipedia.org/wiki/Gettext Gettext] - библиотека проекта GNU для интернационализации. | ||
= Получение и установка инструментов = | = Получение и установка инструментов = | ||
- | == Получение и установка | + | == Получение и установка опереционной системы MS Windows == |
Описывать этот процесс не имеет смысла, т.к. всем и так все ясно. :) | Описывать этот процесс не имеет смысла, т.к. всем и так все ясно. :) | ||
Строка 29: | Строка 28: | ||
'''Получение:''' | '''Получение:''' | ||
- | Этот пакет программ распространяется бесплатно и скачать инсталляцию можно | + | Этот пакет программ распространяется бесплатно и скачать инсталляцию можно '''тут'''. |
'''Установка:''' | '''Установка:''' | ||
Строка 40: | Строка 39: | ||
'''Получение:''' | '''Получение:''' | ||
- | Этот пакет программ распространяется бесплатно и скачать инсталляцию можно | + | Этот пакет программ распространяется бесплатно и скачать инсталляцию можно '''тут'''. |
- | + | ||
Скачивать и использовать можно как версии 2.6.x так и версии 2.8.x, но лучше все-же использовать более свежую версию 2.8.x. | Скачивать и использовать можно как версии 2.6.x так и версии 2.8.x, но лучше все-же использовать более свежую версию 2.8.x. | ||
Строка 56: | Строка 54: | ||
Скачиваемый пакет является полным набором всех необходимых файлов для локализации приложения, | Скачиваемый пакет является полным набором всех необходимых файлов для локализации приложения, | ||
- | т.е. содержит как | + | т.е. содержит как RunTime компоненты, так и компоненты для разработки программ. |
'''Установка:''' | '''Установка:''' | ||
Строка 65: | Строка 63: | ||
При этом, интересующими нас директориями будут являться: | При этом, интересующими нас директориями будут являться: | ||
- | * ''D:\GnuWin32\bin'' - директория | + | * '''D:\GnuWin32\bin''' - директория runtime компонентов |
- | * ''D:\GnuWin32\include'' - директория заголовочных файлов [http://ru.wikipedia.org/wiki/Gettext Gettext] для | + | * '''D:\GnuWin32\include''' - директория заголовочных файлов [http://ru.wikipedia.org/wiki/Gettext Gettext] для разрабтчика |
- | * ''D:\GnuWin32\lib'' - директория линкуемых библиотек [http://ru.wikipedia.org/wiki/Gettext Gettext] для | + | * '''D:\GnuWin32\lib''' - директория линкуемых библиотек [http://ru.wikipedia.org/wiki/Gettext Gettext] для разрабтчика |
= Подготовка к сборке = | = Подготовка к сборке = | ||
== Создание дерева директории исходных кодов проекта == | == Создание дерева директории исходных кодов проекта == | ||
- | Итак, локализовать мы будем простое консольное приложение (которое сами же и напишем и соберем) на два | + | Итак, локализовать мы будем простое консольное приложение (которое сами же и напишем и соберем) на два языва: ''русский'' и ''немецкий''. |
+ | |||
+ | При этом, наш проект будет иметь такую структуру директорий: | ||
- | |||
/SourceTestProject | /SourceTestProject | ||
|->main.cpp | |->main.cpp | ||
Строка 83: | Строка 82: | ||
| | | | ||
|->CMakeLists.txt | |->CMakeLists.txt | ||
+ | |||
где: | где: | ||
- | * ''/SourceTestProject'' - директория исходных кодов нашего проекта | + | * '''/SourceTestProject''' - директория исходных кодов нашего проекта |
- | * ''main.cpp'' - собственно код нашего приложения | + | * '''main.cpp''' - собственно код нашего приложения |
- | * ''/po'' - директория с каталогами, содержащими файлы исходных переводов на различные языки | + | * '''/po''' - директория с каталогами, содержащими файлы исходных переводов на различные языки |
- | * ''/de, /ru'' - директории, которые содержат файлы переводов на русский и немецкий языки соответственно | + | * '''/de, /ru''' - директории, которые содержат файлы переводов на русский и немецкий языки соответственно |
- | * ''CMakeLists.txt'' - файлы конфигурации сборки приложения для [http://ru.wikipedia.org/wiki/CMake CMake] | + | * '''CMakeLists.txt''' - файлы конфигурации сборки приложения для [http://ru.wikipedia.org/wiki/CMake CMake] |
== Создание директории сборки проекта == | == Создание директории сборки проекта == | ||
- | Сборку проекта с использованием [http://ru.wikipedia.org/wiki/CMake CMake] лучше всего производить вне директории нашего проекта чтобы не | + | Сборку проекта с использованием [http://ru.wikipedia.org/wiki/CMake CMake] лучше всего производить вне директории нашего проекта, |
+ | чтобы не замусоривать её, а также для исключения случайной модификации исходных файлов директории проекта. | ||
+ | Да и вообще, сборка вне директории с исходным кодом является "правилом хорошего тона". | ||
- | + | Поэтому для сборки, параллельно директории проекта, создадим директорию сборки: | |
- | |||
/.. | /.. | ||
|->/SourceTestProject | |->/SourceTestProject | ||
|->/build-project | |->/build-project | ||
+ | |||
где: | где: | ||
- | * ''/..'' - какая-то родительская директория | + | * '''/..''' - какая-то родительская директория |
- | * ''/SourceTestProject'' - директория исходных кодов нашего проекта | + | * '''/SourceTestProject''' - директория исходных кодов нашего проекта |
- | * ''/build-project'' - директория для сборки нашего проекта (в которой бумем его собирать) | + | * '''/build-project''' - директория для сборки нашего проекта (в которой бумем его собирать) |
== Создание окружения сборки проекта == | == Создание окружения сборки проекта == | ||
Строка 110: | Строка 112: | ||
консоль сборки с необходимыми нам параметрами. | консоль сборки с необходимыми нам параметрами. | ||
- | Для этого создадим файл ''MyBuildEnv.bat'' с таким содержимым: | + | Для этого создадим файл '''MyBuildEnv.bat''' с таким содержимым: |
<source lang="dos"> | <source lang="dos"> | ||
@echo off | @echo off | ||
Строка 122: | Строка 124: | ||
</source > | </source > | ||
где: | где: | ||
- | * ''D:\MinGW\bin'' - путь к runtime компонентам компилятора [http://ru.wikipedia.org/wiki/MinGW MinGW] | + | * '''D:\MinGW\bin''' - путь к runtime компонентам компилятора [http://ru.wikipedia.org/wiki/MinGW MinGW] |
- | * ''D:\CMake\bin'' - путь runtime компонентам сборщика [http://ru.wikipedia.org/wiki/CMake CMake] | + | * '''D:\CMake\bin''' - путь runtime компонентам сборщика [http://ru.wikipedia.org/wiki/CMake CMake] |
- | * ''D:\GnuWin32\bin'' - путь runtime компонентам транслятора [http://ru.wikipedia.org/wiki/Gettext Gettext] | + | * '''D:\GnuWin32\bin''' - путь runtime компонентам транслятора [http://ru.wikipedia.org/wiki/Gettext Gettext] |
- | * ''%SystemRoot%\System32'' - путь системным runtime компонентам Windows | + | * '''%SystemRoot%\System32''' - путь системным runtime компонентам Windows |
- | * ''GETTEXT_INCLUDE_DIR=d:\GnuWin32\include'' - путь к заголовочным файлам | + | * '''GETTEXT_INCLUDE_DIR=d:\GnuWin32\include''' - путь к заголовочным файлам Gettext (понадобится далее для сборки приложения) |
- | * ''GETTEXT_LIB_DIR=d:\GnuWin32\lib'' - путь к линкуемым библиотекам | + | * '''GETTEXT_LIB_DIR=d:\GnuWin32\lib''' - путь к линкуемым библиотекам Gettext (понадобится далее для сборки приложения) |
+ | |||
+ | Скопируем/переместим этот файл куда нибудь, например, пусть он будет находится в корне диска '''D:''' | ||
- | |||
D:\MyBuildEnv.bat | D:\MyBuildEnv.bat | ||
Теперь создадим на рабочем столе ярлык, указывающий на нашу консоль сборки | Теперь создадим на рабочем столе ярлык, указывающий на нашу консоль сборки | ||
- | в которой будут использованы переменные окружения из ''MyBuildEnv.bat'' | + | в которой будут использованы переменные окружения из '''MyBuildEnv.bat''' |
На вкладке "Общие" задаем имя нашей консоли, например: | На вкладке "Общие" задаем имя нашей консоли, например: | ||
Строка 146: | Строка 149: | ||
== Создание кода приложения == | == Создание кода приложения == | ||
- | Весь код нашего приложения будет находится в одном единственном файле ''main.cpp''. | + | Весь код нашего приложения будет находится в одном единственном файле '''main.cpp'''. |
- | Код ''main.cpp'': | + | Код '''main.cpp''': |
<source lang="cpp"> | <source lang="cpp"> | ||
#include <iostream> | #include <iostream> | ||
Строка 162: | Строка 165: | ||
bindtextdomain(domain.c_str(), localedir.c_str()); | bindtextdomain(domain.c_str(), localedir.c_str()); | ||
textdomain(domain.c_str()); | textdomain(domain.c_str()); | ||
- | |||
std::cout << gettext("Hello, world!") << std::endl; | std::cout << gettext("Hello, world!") << std::endl; | ||
return 0; | return 0; | ||
Строка 168: | Строка 170: | ||
</source> | </source> | ||
где: | где: | ||
- | * ''#include <libintl.h>'' - подключаемые заголовки [http://ru.wikipedia.org/wiki/Gettext Gettext] | + | * '''#include <libintl.h>''' - подключаемые заголовки [http://ru.wikipedia.org/wiki/Gettext Gettext] |
- | * ''#include <locale.h>'' - подключаемые системные заголовки компилятора | + | * '''#include <locale.h>''' - подключаемые системные заголовки компилятора |
- | * ''#include <iostream>'' - подключаемые системные заголовки компилятора | + | * '''#include <iostream>''' - подключаемые системные заголовки компилятора |
- | * ''domain("test")'' - домен которому мы присвоили имя | + | * '''domain("test")''' - домен которому мы присвоили имя "test" (этим именем у нас также будет назван и исполняемый файл test.exe нашего приложения) |
- | * ''string localedir("./locale")'' - это имя каталога в котором будут находится бинарные файлы переводов. | + | * '''string localedir("./locale")''' - это имя каталога в котором будут находится бинарные файлы переводов. |
- | * ''gettext("Hello, world!")'' - собственно строка, которую будем локализовать на разные языки. | + | * '''gettext("Hello, world!")''' - собственно строка, которую будем локализовать на разные языки. |
- | + | ||
- | + | ||
== Определение структуры и содержимого каталогов собранного приложения == | == Определение структуры и содержимого каталогов собранного приложения == | ||
Задаем имя и расположение директории локализаций по нашему усмотрению, | Задаем имя и расположение директории локализаций по нашему усмотрению, | ||
- | но обычно (в Windows) лучше и проще чтобы она имела имя ''locale'' | + | но обычно (в Windows) лучше и проще чтобы она имела имя '''locale''' |
и находилась в корне каталога с исполняемым файлом приложения. | и находилась в корне каталога с исполняемым файлом приложения. | ||
+ | (Да и у нас далее, в исходном коде приложения будет задано именно такое расположение каталога локализации). | ||
- | |||
{{Замечание | В данном случае речь идет о структуре каталогов уже готового (т.е. собранного приложения) | {{Замечание | В данном случае речь идет о структуре каталогов уже готового (т.е. собранного приложения) | ||
- | и никоим образом это не относится к описанному в | + | и никоим образом это не относится к описанному в (<Создание дерева директории исходных кодов проекта>). }} |
Поддиректории в этой директории должны иметь определенную структуру, например: | Поддиректории в этой директории должны иметь определенную структуру, например: | ||
+ | |||
/InstallTestProject | /InstallTestProject | ||
|-> test.exe | |-> test.exe | ||
Строка 203: | Строка 204: | ||
где: | где: | ||
- | * ''/InstallTestProject'' - имя директории с готовым проектом (например, установленным в "Program Files" и т.п.) | + | * '''/InstallTestProject''' - имя директории с готовым проектом (например, установленным в "Program Files" и т.п.) |
- | * ''test.exe'' - исполняемый файл нашего приложения | + | * '''test.exe''' - исполняемый файл нашего приложения |
- | * ''test1.dll/testN.dll'' - разделяемые библиотеки нашего приложения (но в текущей задаче их у нас нет) | + | * '''test1.dll/testN.dll''' - разделяемые библиотеки нашего приложения (но в текущей задаче их у нас нет) |
- | * ''/ru, /de'' - директории в которых находятся откомпилированные [http://ru.wikipedia.org/wiki/Gettext Gettext]-ом переводы | + | * '''/ru, /de''' - директории в которых находятся откомпилированные [http://ru.wikipedia.org/wiki/Gettext Gettext]-ом переводы *.mo |
- | * ''/LC_MESSAGES'' - обязательная директория, имя которой должно быть таким как есть | + | * '''/LC_MESSAGES''' - обязательная директория, имя которой должно быть таким как есть |
== Создание конфигурации сборки для CMake == | == Создание конфигурации сборки для CMake == | ||
- | Конфигурация для сборки проекта при помощи [http://ru.wikipedia.org/wiki/CMake CMake] будет содержаться всего в двух файлах | + | Конфигурация для сборки проекта при помощи [http://ru.wikipedia.org/wiki/CMake CMake] будет содержаться всего в двух файлах CMakeLists.txt: |
* один находится в корне проекта с исходными кодами | * один находится в корне проекта с исходными кодами | ||
+ | |||
/SourceTestProject/CMakeLists.txt | /SourceTestProject/CMakeLists.txt | ||
+ | |||
* другой находится в корне директории /po c переводами | * другой находится в корне директории /po c переводами | ||
/po/CMakeLists.txt | /po/CMakeLists.txt | ||
Строка 219: | Строка 222: | ||
===Содержимое файла /SourceTestProject/CMakeLists.txt=== | ===Содержимое файла /SourceTestProject/CMakeLists.txt=== | ||
+ | |||
Ниже приведено содержимое файла с подробными комментариями: | Ниже приведено содержимое файла с подробными комментариями: | ||
<source lang="cmake"> | <source lang="cmake"> | ||
# Задаем имя нашему проекту. | # Задаем имя нашему проекту. | ||
# При этом результирующий исполняемый файл приложения пусть тоже имеет такое имя, где: | # При этом результирующий исполняемый файл приложения пусть тоже имеет такое имя, где: | ||
- | # test - имя проекта | + | # '''test''' - имя проекта |
set( APP_TARGET test ) | set( APP_TARGET test ) | ||
project( ${APP_TARGET} ) | project( ${APP_TARGET} ) | ||
Строка 231: | Строка 235: | ||
# которые нам потребуются для сборки приложения. | # которые нам потребуются для сборки приложения. | ||
# В данном случае нам нужны только заголовки от gettext, где: | # В данном случае нам нужны только заголовки от gettext, где: | ||
- | # GETTEXT_INCLUDE_DIR - переменная окружения пути к заголовкам gettext, | + | # '''GETTEXT_INCLUDE_DIR''' - переменная окружения пути к заголовкам gettext, |
# которую мы установили, запустив *.bat файл. | # которую мы установили, запустив *.bat файл. | ||
include_directories( $ENV{GETTEXT_INCLUDE_DIR} ) | include_directories( $ENV{GETTEXT_INCLUDE_DIR} ) | ||
Строка 238: | Строка 242: | ||
# которые нам потребуются для линковки приложения. | # которые нам потребуются для линковки приложения. | ||
# В данном случае нам нужны только библиотеки от gettext, где: | # В данном случае нам нужны только библиотеки от gettext, где: | ||
- | # GETTEXT_LIB_DIR - переменная окружения пути к библиотекам gettext, | + | # '''GETTEXT_LIB_DIR''' - переменная окружения пути к библиотекам gettext, |
# которую мы установили, запустив *.bat файл. | # которую мы установили, запустив *.bat файл. | ||
link_directories( $ENV{GETTEXT_LIB_DIR} ) | link_directories( $ENV{GETTEXT_LIB_DIR} ) | ||
Строка 247: | Строка 251: | ||
# Указываем какие именно нам нужны библиотеки для линковки с приложением. | # Указываем какие именно нам нужны библиотеки для линковки с приложением. | ||
- | # В нашем случае это библиотека от gettext: intl. | + | # В нашем случае это библиотека от gettext: '''intl'''. |
target_link_libraries( ${APP_TARGET} intl ) | target_link_libraries( ${APP_TARGET} intl ) | ||
# Указываем имя директории (bin) куда установится исполняемый файл приложения | # Указываем имя директории (bin) куда установится исполняемый файл приложения | ||
- | # после выполнения команды: $mingw32-make install. | + | # после выполнения команды: '''$mingw32-make install'''. |
install( TARGETS ${APP_TARGET} RUNTIME DESTINATION bin ) | install( TARGETS ${APP_TARGET} RUNTIME DESTINATION bin ) | ||
Строка 259: | Строка 263: | ||
===Содержимое файла /po/CMakeLists.txt=== | ===Содержимое файла /po/CMakeLists.txt=== | ||
+ | |||
Ниже приведено содержимое файла с подробными комментариями: | Ниже приведено содержимое файла с подробными комментариями: | ||
<source lang="cmake"> | <source lang="cmake"> | ||
- | |||
set( DOMAIN ${APP_TARGET} ) | set( DOMAIN ${APP_TARGET} ) | ||
Строка 268: | Строка 272: | ||
# языком приложения по умолчанию, поэтому переводить его не нужно). | # языком приложения по умолчанию, поэтому переводить его не нужно). | ||
# При этом, кодам имен локализаций у нас соответствуют имена | # При этом, кодам имен локализаций у нас соответствуют имена | ||
- | # поддиректорий de, ru. Это сделано просто для упрощения и наглядности, | + | # поддиректорий '''de, ru'''. Это сделано просто для упрощения и наглядности, |
# а в принципе структуру поддиректорий и их названий можно делать какой угодно, | # а в принципе структуру поддиректорий и их названий можно делать какой угодно, | ||
# главное в дальнейшем правильно написать скрипты для CMake. :) | # главное в дальнейшем правильно написать скрипты для CMake. :) | ||
Строка 275: | Строка 279: | ||
# Устанавливаем имя директории в которую будут устанавливаться уже готовые, | # Устанавливаем имя директории в которую будут устанавливаться уже готовые, | ||
# откомпилированные с помощью gettext файлы переводов *.mo., где: | # откомпилированные с помощью gettext файлы переводов *.mo., где: | ||
- | # locale - имя этой директории. | + | # '''locale''' - имя этой директории. |
set( LOCALE_INSTALL_DIR locale ) | set( LOCALE_INSTALL_DIR locale ) | ||
Строка 283: | Строка 287: | ||
# Генерируем шаблон перевода, сканируя исходники приложения и | # Генерируем шаблон перевода, сканируя исходники приложения и | ||
# извлекая всё что подлежит переводу. | # извлекая всё что подлежит переводу. | ||
- | |||
file( GLOB _srcFiles ../*.cpp ) | file( GLOB _srcFiles ../*.cpp ) | ||
+ | message( STATUS "src files: ${_srcFiles} ") | ||
add_custom_target( translation ALL DEPENDS ) | add_custom_target( translation ALL DEPENDS ) | ||
Строка 295: | Строка 299: | ||
file( GLOB _poFile ${LANG}/*.po ) | file( GLOB _poFile ${LANG}/*.po ) | ||
if( EXISTS ${_poFile} ) | if( EXISTS ${_poFile} ) | ||
+ | #message( STATUS " Po file: ${_poFile}" ) | ||
set( PO_FILE_NEW ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po ) | set( PO_FILE_NEW ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.po ) | ||
set( GMO_FILE_NEW ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo ) | set( GMO_FILE_NEW ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo ) | ||
Строка 307: | Строка 312: | ||
</source> | </source> | ||
- | Генерация бинарных файлов переводов происходит у нас в несколько этапов: | + | |
- | # Сначала из всех | + | {{Замечание | Генерация бинарных файлов переводов происходит у нас в несколько этапов: |
- | # Далее, по очереди проверяется наличие готовых исходных файлов переводов | + | |
- | # Далее, на основе каждого вновь созданного (обновленного) файла | + | # Сначала из всех *.cpp файлов проекта извлекаются всё то, что подлежит переводу, и создается файл-шаблон *.pot (команда '''$xgettext'''). |
+ | # Далее, по очереди проверяется наличие готовых исходных файлов переводов *.po разных языков и, на их основе, и основе шаблона *.pot создаются обновленные файлы переводов *.po. При этом, исходные файлы переводов остаются нетронутыми. Это сделано для исключения модификации файлов в директории исходных кодов (команда '''$msgmerge'''). | ||
+ | # Далее, на основе каждого вновь созданного (обновленного) файла *.po создается результирующий бинарный файл перевода *.gmo ( команда '''$msgfmt'''). }} | ||
= Сборка приложения = | = Сборка приложения = | ||
- | Итак, после того | + | Итак, после того как все готово, можно приступить к сборке приложения, |
но перед этим необходимо сгенерировать и перевести файлы исходных переводов. | но перед этим необходимо сгенерировать и перевести файлы исходных переводов. | ||
Строка 331: | Строка 338: | ||
$ msginit -i messages.pot -o po\ru\messages.po -l ru | $ msginit -i messages.pot -o po\ru\messages.po -l ru | ||
</source> | </source> | ||
- | После выполнения данных команд, в директориях ''po\de'' и ''po\ | + | После выполнения данных команд, в директориях ''po\de'' и ''po\de'' появятся необходимые нам файлы. |
- | Теперь файл шаблона | + | Теперь файл шаблона нам не нужен и мы можем его удалить. |
- | + | Т.е. для распространения исходных кодов нашего проекта достаточно иметь только файлы переводов ''*.po'' | |
+ | (естественно и иметь ''*.cpp'' и ''CMakeLists.txt'', это само собой разумеется). | ||
Далее, произведем "перевод" сообщений в ''*.po'' файлах на требуемые нам языки. | Далее, произведем "перевод" сообщений в ''*.po'' файлах на требуемые нам языки. | ||
Для этого, редактируем их любым доступным образом и добавляем нужные сообщения: | Для этого, редактируем их любым доступным образом и добавляем нужные сообщения: | ||
- | * для ''po\de\messages.po'' | + | |
+ | * для '''po\de\messages.po''' | ||
... | ... | ||
msgid "Hello, world!" | msgid "Hello, world!" | ||
msgstr "Hallo Welt!" | msgstr "Hallo Welt!" | ||
... | ... | ||
- | * для ''po\ru\messages.po'' | + | |
+ | * для '''po\ru\messages.po''' | ||
... | ... | ||
msgid "Hello, world!" | msgid "Hello, world!" | ||
Строка 366: | Строка 376: | ||
При успехе в консоль отобразится примерно следующее: | При успехе в консоль отобразится примерно следующее: | ||
+ | |||
D:\SVN\lang_test>cd ..\build | D:\SVN\lang_test>cd ..\build | ||
Строка 402: | Строка 413: | ||
При этом, автоматически сгенерируются: | При этом, автоматически сгенерируются: | ||
- | * исполняемый файл приложения ''test.exe'' | + | * исполняемый файл приложения '''test.exe''' |
- | * бинарные файлы переводов ''*.gmo'' | + | * бинарные файлы переводов '''*.gmo''' |
= Установка проекта = | = Установка проекта = | ||
Строка 415: | Строка 426: | ||
</source> | </source> | ||
- | В итоге, в директории ''d:\install'' получим следующую структуру каталогов: | + | В итоге, в директории '''d:\install''' получим следующую структуру каталогов: |
+ | |||
/install | /install | ||
|->/Program Files | |->/Program Files | ||
Строка 426: | Строка 438: | ||
| |->test.mo | | |->test.mo | ||
|->/ru | |->/ru | ||
- | + | |->/LC_MESSAGES | |
- | + | |->test.mo | |
{{Замечание | Как видно, файлы переводов теперь вместо расширений ''*.gmo'' имеют расширение ''*.mo'', процесс переименования файлов произошел в процессе установки приложения. }} | {{Замечание | Как видно, файлы переводов теперь вместо расширений ''*.gmo'' имеют расширение ''*.mo'', процесс переименования файлов произошел в процессе установки приложения. }} | ||
= Запуск приложения = | = Запуск приложения = | ||
- | Для запуска приложения необходимо, находять в нашей консоли сборки, перейти в директорию с установленным проектом и выполнить файл ''test.exe'' | + | Для запуска приложения необходимо, находять в нашей консоли сборки, перейти в директорию с установленным проектом и выполнить файл '''test.exe''' |
<source lang="bash"> | <source lang="bash"> | ||
$ cd d:\install\Program Files\test | $ cd d:\install\Program Files\test | ||
Строка 439: | Строка 451: | ||
После выполнения в консоли увидим: | После выполнения в консоли увидим: | ||
+ | |||
D:\SVN\inst\Program Files\test>bin\test.exe | D:\SVN\inst\Program Files\test>bin\test.exe | ||
- | Привет, мир! | + | ¦ЁштхЄ, ьшЁ! |
+ | |||
+ | Крякозяблы ''¦ЁштхЄ, ьшЁ!'' есть текст перевода ''"Привет, мир!"'', не пугайтесь! :) | ||
+ | |||
+ | {{Замечание | Дело в том, что текст в консоли Windows выводится в кодировке ''CP866'', но у нас файлы перевода сгенерированы для кодировки ''CP1251''. Если бы мы делали GUI приложение, то текст в нем выводился бы корректно (в теории), но в данном случае нам необходимо выполнить ряд мер | ||
+ | для устранения данного несоответствия, о чем, может быть, будет написано позже. }} | ||
+ | = Важные замечания = | ||
{{Замечание | Так как мы линковали наше приложение с библиотеками от [http://ru.wikipedia.org/wiki/Gettext Gettext], то для правильной его работы необходимо, чтобы наше приложение имело к ним доступ, для чего можно поступить двумя путями: | {{Замечание | Так как мы линковали наше приложение с библиотеками от [http://ru.wikipedia.org/wiki/Gettext Gettext], то для правильной его работы необходимо, чтобы наше приложение имело к ним доступ, для чего можно поступить двумя путями: | ||
- | * Или, в каталог с исполнеяемым файлом ''test.exe'' скопировать как минимум такие библиотеки [http://ru.wikipedia.org/wiki/Gettext Gettext] как: ''libintl3.dll'' и ''libiconv2.dll''. И в этом случае, наше приложение будет работать на любой машине где не установлен [http://ru.wikipedia.org/wiki/Gettext Gettext]. | + | * Или, в каталог с исполнеяемым файлом '''test.exe''' скопировать как минимум такие библиотеки [http://ru.wikipedia.org/wiki/Gettext Gettext] как: '''libintl3.dll''' и '''libiconv2.dll'''. И в этом случае, наше приложение будет работать на любой машине где не установлен [http://ru.wikipedia.org/wiki/Gettext Gettext]. |
- | * Или, если на машине установлен Gettext, необходимо в переменных окружения прописать путь к runtime компонентам Gettext (т.е. путь к директории где находятся разделяемые библиотеки | + | * Или, если на машине установлен Gettext, необходимо в переменных окружения прописать путь к runtime компонентам Gettext (т.е. путь к директории где находятся разделяемые библиотеки *.dll [http://ru.wikipedia.org/wiki/Gettext Gettext]-а , например, ''/bin''). }} |