Как установить gettext на windows 10

Обновлено: 03.07.2024

Описания

config.rpath

config.rpath выводит зависящий от системы набор переменных, describing how to set the run time search path of shared libraries in an executable.

gettext

gettextize

gettextize копирует все стандартные файлы gettext в каталог. Используется для создания пакетов с переводами gettext.

hostname

hostname выводит имя системы в разных форматах.

msgattrib

msgcat

msgcmp

msgcmp сравнивает 2 файла перевода.

msgcomm

msgconv

msgconv конвертирует каталог перевода в другую кодировку.

msgen

msgen создает каталог переводов для английского языка.

msgexec

msgexec применяет команду ко всем переводам из каталога перевода.

msgfilter

msgfilter применяет фильтр ко всем переводам из каталога переводов.

msgfmt

msgfmt program компилирует перевод в машинный код. Используется для создания окончательного перевода программы или пакета.

msggrep

msginit

msginit создает новый файл PO, инициализирую метаинформацию значениями пользовательского окружения.

msgmerge

msgmerge объединяет два перевода в один файл. Используется для обновления перевода при помощи исходных файлов.

msgunfmt

msgunfmt декомпилирует файлы перевода. Возможно использование, только если есть скомпилированные версии.

msguniq

msguniq приводит к единому образцу дублирующиеся переводы в каталоге переводов.

ngettext

project-id

project-id выводит идентификационную информацию пакета.

team-address

team-address выводит адрес команды переводчиков на стандартный вывод и выдает дополнительные инструкции.

trigger

trigger проверяет, является ли пакет пакетом GNOME или KDE.

urlget

urlget получает содержимое URL.

user-email

user-email выводит адрес электронной почты пользователя, с подтверждением.

xgettext

Библиотеки

Описания

libgettextlib

На данный момент нет описания.

libgettextsrc

На данный момент нет описания.

Зависимости Gettext

Последняя проверка: версия 0.10.40.

Autoconf: autoconf, autoheader
Automake: aclocal, automake
Bash: sh
Binutils: ar, as, ld, nm, ranlib, strip
Bison: bison
Diffutils: cmp
Fileutils: chmod, install, ln, ls, mkdir, mv, rm, rmdir
Gcc: cc, cc1, collect2, cpp0, gcc
Grep: egrep, fgrep, grep
M4: m4
Make: make
Gawk: gawk
Sed: sed
Sh-utils: basename, echo, expr, hostname, sleep, uname
Texinfo: install-info, makeinfo
Textutils: cat, sort, tr, uniq

Все чаще и чаще современный разработчик сталкивается с необходимостью поддержки разных языков в рамках одного проекта. Говоря о разных языках мы здесь имеем ввиду любой язык, в алфавите которого присутствуют символы , отличные от латинских. Латинский язык мы не считаем за отдельный язык, ибо символы этого алфавита, как правило, присутствуют всегда и нормально поддерживаются на уровне баз данных. В этом материале мы будем говорить о по-настоящему многоязычных приложениях, в которых, наряду с латинскими символами, могут присутствовать, скажем, русские, китайские и так далее буквы.

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

GetText – описание возможностей

В преодолении вышеуказанных препятствий, система GetText предлагает нам помощь в следующем:

  • освобождает наши скрипты от языкозависимых данных, точнее нам не надо будет заботиться о том, с каким языком будут работать наши скрипты;
  • предлагает набор утилит для работы с языковыми данными;
  • а также, разработки сторонних авторов позволяют в значительной степени облегчить труд переводчиков и стандартизировать данные;
  • и, очень важная особенность, если вы по каким-то причинам не перевели те или иные строки, скажем, на китайский, то GetText вернем вам их на языке поумолчанию (обычно английский), что очень удобно, так как освобождает нас от полного перевода всех текстов.

Все эти возможности в свое время привлекли мое внимание и теперь разработка моих скриптов в значительной степени стала более эффективной. Возможности этой утилиты при командной разработке или при значительном разделении труда при производстве приложений вообще трудно переоценить.

От описательной части, перейдем к делу.

Найтройка GetText

Прежде чем перейти к процессу освоения новой технологии, давайте произведем установку нужного софта, или проверим наличие оного.

Поскольку в основном (по моему опыту) разработка ведется на основе Windows систем, то в рамках данной статьи я буду говорить именно о работе в Windows. В Linux системах как правило указанных действий вообще производить не надо, так как все нужные утилиты там устанавливаются поумолчанию.

Для дальнейшей установки нам понадобятся файлы: gettext-runtime-0.13.1.bin.woe32.zip и libiconv-1.9.1.bin.woe32.zip.

Скопируйте файлы intl.dll, gettext.exe, asprintf.dll, envsubst.exe, ngettext.exe из первого пакета в папку SYSTEM32 вашей Windows, затем тоже самое проделайте с файлами charset.dll, iconv.dll, iconv.exe из второго пакета.

Теперь перейдите в папку dlls вашей инсталляции PHP и скопируйте из нее файл libintl-1.dll в туже папку, что и предыдущие файлы.

Далее, найдите php.ini (как правило он находится в папке установки PHP или в папке WINDOWS вашей системы). Раскомментируйте в нем 2 строки: extension=php_gettext.dll (чтобы включить поддержку GetText) и extension=php_iconv.dll (чтобы включить поддержку iconv). Теперь перезапустите ваш сервер (например, Apache) и посмотрите phpinfo();. PHP сообщит вам, что GetText и iconv расширения подключены и включены (enabled).

У нас остался еще один пакет: gettext-tools-0.13.1.bin.woe32.zip. Создайте на своем диске отдельную папку и распакуйте эти утилиты туда.

И так, когда все действующие лица собраны воедино, давайте посмотрим, как же это работает.

взгляд изнутри

Для начала, нам необходимо проделать с нашими скриптами несложные изменения, эти изменения вносятся 1 раз и более никогда. В дальнейшем нам просто надо будет сразу придерживаться определенных правил.

И так, вернемся к тому, что же необходимо проделать с нашими скриптами.

Как правило, в скриптах строки используются следующим образом:

Установленное выше расширение PHP добавляет в наш арсенал несколько команд, при помощи которых мы можем преобразовать примеры выше следующим образом:

Эти примеры полностью идентичны. Советую использовать первый способ, так как он более экономичный в плане записи и, на мой взгляд, более наглядный, так как не вносит в структуру скрипта значительного “мусора”.

И так, наши скрипты переделаны указанным способом и мы переходим к следующему этапу.

утилита XGetText

Изменить скрипты – это только половина работы. Что же делать дальше? А дальше нам необходимо создать 2 файла, которые будут содержать в себе все, “обернутые” указанной выше конструкцией, строки. В первом файле они будут содержаться в виде текста, а второй файл – это скомпилированная версия первого.

Для начала нам необходимо извлечь все строки из наших скриптов. Поможет нам в этом утилита xgettext.exe из пакета утилит.

В упрощенном виде, вам необходимо запустить ее следующим образом:

В результате вы получите первый файл: messages.po.

Давайте рассмотрим другие команды этой утилиты:

--files-from=FILE – вы можете составить перечень всех своих скриптов создав отдельный файл, где каждая строка – это название файла. Тогда за один проход утилита может обработать сразу все ваши скрипты. В результате работы вы получите ЕДИНЫЙ .po файл.

--directory=DIRECTORY – добавить директорию в список для поиска скриптов.

--default-domain=NAME – NAME определяет название .po файла (NAME.po).

--output=FILE – перенаправляет вывод данных в указанный (FILE) файл.

--output-dir=DIR – выходящие файл будут созданы в каталоге DIR.

--language=NAME – NAME указывает на каком языке программирования вы написали свои скрипты, в данном случае PHP.

--join-existing – если у вас уже есть .po файл, то вы можете добавлять к нему строковые данные при помощи этой команды не создавая нового файла.

--exclude-file=FILE.po – если в новых скриптах есть строки, которые уже есть в вашем .po файле, вы можете пропустить такие строки при помощи этой команды.

--extract-all – эта команда заставит утилиту извлекать все строки подряд без определения языка программирования. Использование этой опции не рекомендуется – вы получите слишком “мусорный” .po файл.

--keyword[=WORD] – вы можете задать список так называемых стоп слов, которые будут пропущены утилитой.

Остальные опции вспомогательные и вы можете разобраться с ними сами, запустив xgettext --help для вывода англоязычной подсказки.

И так, файл создан, что дальше?

Описание .PO файла

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

Далее я приведу пример такого файла:

По сути, это и есть файл, который вы должны отдать переводчику. Переводчик должен задать значение следующим строкам:

Тут многие из вас, наверное, почешут голову и скажут, что все это полный отстой. Советую дочитать материал до конца и вы поймете, что все вовсе не так плохо, потому что далее мы также рассмотрим заявленную нами в названии статьи “профессиональную” работу.

Далее, давайте рассмотрим структуру заголовка файла (только самые важные):

Укажите здесь свои авторские копирайты.

Версия проекта и его название.

Укажите здесь имя и емаил адрес переводчика.

Название языка (например, Russian).

Кодировка, в которой сделан перевод (например, UTF-8). Рекомендую вам всегда делать переводы в Unicode кодировке UTF-8. Это избавит вас от многих проблем, а данные от GetText вы всегда сможете получить в той кодировке, в которой вам необходимо.

утилита MsgFmt

GetText не может работать с .po файлом. Чтобы информация из него стала доступной, его надо скомпилировать. Этим занимается заявленная в названии утилита. В результате ее работы у вас появится второй файл с расширением .mo.

Вот, собственно, и все.

структура каталогов

Для удобства, создайте в корне своего приложения папку locale. Внутри этой директории необходимо создать папки для каждого из поддерживаемых языков: ru/, en/ и так далее. Внутри них необходимо создать папку LC_MESSAGES, а в эту папку, в свою очередь, необходимо поместить созданные нами .mo файлы для каждого языка (.po файлы можете поместить туда же, это не помешает).

Давайте посмотрим, как будет выглядеть дерево папок в финальном виде:

В предыдущих нескольких главах мы с вами познакомились с технологией работы GetText. Настало время рассмотреть варианты “Профессиональной работы”.

профессиональная работа

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

На этом этапе мы с вами воспользуемся замечательным бесплатным редакторов poedit, который вы уже скачали и установили себе в одной из первых глав нашего повествования. С запуском этого редактора мы переходим к профессиональной части.

Poedit поддерживает множество языков интерфейса, в том числе и русский.

При первом запуске выберите язык интерфейса (поддерживается русский). А также редактор попросит ввести ваше имя и емаил. Другие установки оставьте поумолчанию. Во вкладке “Парсеры” удалите все, кроме PHP.

И так – начинаем работать. Во вкладке “Файлы” выбираем “Новый каталог”.

Далее заполняем появившуюся форму.


В следующей вкладке задайте путь (пути), где находятся скрипты вашего проекта.


Теперь жмем “ОК”. Редактор начнет рекурсивно обрабатывать все найденные в указанной папке и ее подпапках скрипты на предмет наличия в них “обернутых” строк.


Перед вами появится меню, в котором содержится перечень всех новых строк, которые нуждаются в переводе, а во второй вкладке будут показаны те строки, которые исчезли (удалены за ненадобностью) из ваших скриптов. После нажатия “ОК”, .po файл будет обновлен – новые строки добавятся, старые удалятся.


Редактор сам попробует подобрать перевод к новым строкам из уже имеющихся переведенных строк. Строки, к которым перевод удалось подобрать (обращаю ваше внимание, что редактор делает это по странному алгоритму и вам не стоит на него надеяться), будут выделены коричневым цветом. Строки, к которым перевод не подобран и которые нуждаются в переводе будут сине-зелеными, белые строки – это нормально переведенные строки.


И так, теперь, если передать редактор вместе с .po файлом переводчику, то ему будет очень легко и понятно переводить указанный файл. Редактор поддерживает все языки (в том числе и китайские иероглифы). Давайте рассмотрим все элементы редактора.


БЛОК 1 – это блок вспомогательного меню, куда вынесены некоторые нужные функции. Первые 2 иконки понятны, о третьей я расскажу ниже. Четвертая иконка включает показ кавычек в окнах оригинала (БЛОК 3) и перевода (БЛОК 4). Пятая иконка - если нажата, то это означает что для строки был подобран перевод самим редактором и этот перевод не точен. Следующая иконка вызывает окно редактирования комментария (БЛОК 6). В поле комментария вы можете дать пояснение переводчику к любой, требующей перевода, строке. Следующая иконка убирает заголовок окна, растягивая область экрана на весь декстоп. Последняя иконка – вызов справки. БЛОК 5 – блок автоматических комментариев. БЛОК 2 – это перечень всех переведенных и непереведенных строк. Нажмите на любую строку, чтобы произвести перевод или отредактировать его.

Как видите, процесс перевода очень прост и вот уже скоро (буквально после нажатия кнопки сохранить) редактор создаст для вас автоматически файл .mo.


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

После нажатия этой иконки редактор полностью пересканирует указанный при создании проекта каталог и выявит все новые не переведенные строки в ваших скриптах, а также найдет все удаленные из скриптов строки. Обращаю ваше внимание, что если вы используете в своем проекте шаблонизатор Smarty, то вам необходимо очистить папки со скомпилированными шаблонами, так как редактор не может корректно обработать имена файлов этих шаблонов.

Таким образом, вы получаете мощный инструмент для автоматизированного перевода ваших приложений на разные языки, а также удобный инструмент для переводчика.

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

Do you speak по-русски?

Наконец все нужные файлы созданы и переведены, и вы с чистым сердцем можете заставить ваше приложение бодро откликнуться на нужном вам языке. Давайте посмотрим, как это работает.

В конфигурационный файл или в самом начале вашего индексного файла необходимо добавить следующие строки.

Пройдемся по порядку.

Эта строка включает нужную пользователю кодировку. В данном случае русскую. А вот таким образом включаем английскую:

Теперь нам необходимо настроить локаль, в которой работаем. Для русской локали это выглядит так:

Для английской – так:

Переменная $domain в данном случае указывает домен (или имя файла .mo) нашего проекта. Все файлы .mo должны называться так: $domain.mo.

Далее указываем корневую папку, где у нас содержатся все переводы (.mo файлы для всех языков).

Как вы понимаете, доменов может быть несколько. Это необходимо, например, если ваше приложение состоит из нескольких самостоятельных частей. У каждой части моет быть свой языковой файл.

Теперь необходимо подключить (выбрать) заданный выше домен:

Все – наше приложение “выучило” язык, заданный вами в настройках!

В рамках данного материала мы с вами подробно познакомились с замечательной технологией GNU GetText. Рассмотрели принципы функционирования и организации многоязычных приложений. Рассмотрели возможности оптимизации работы программистов и переводчиков, а также заложили основы профессионального использования в своих приложениях предлагаемых технологий.

Я выполнил все шаги, общие для всех stackoverflow и других вопросов, чтобы установить gettext для windows (10), но все же я получаю ошибку: "Can't find msguniq, make sure you have gettext tools installed" при использовании интернационализации в django. Я попытался загрузить файлы напрямую и добавил их в PATH, и даже установщик, который уже скомпилировал все и добавил в путь автоматически, но он все еще не работает, и я не знаю, что еще делать. Помогите, пожалуйста!

Спасибо, что уделили мне время.

3 ответа

Свежая установка Windows 10 Home Build 10586. Пытаюсь установить java, файл jdk-8u101-windows-x64.exe. После запуска установщика, как администратор, в диспетчере задач появляется на 2 секунды Java Platform SE binary, а затем он исчезает без появления окна ошибки. Установщик Xamarin попытался.

Не уверен, с какой проблемой вы столкнулись, но ниже команда работала для меня

pip установить python-gettext

enter image description here

В windows вам просто нужно скачать :

gettext-tools-xx.zip gettext-runtime-xx.zip отсюда: введите описание ссылки здесь

а затем вам нужно распаковать их и скопировать все в папку bin обоих файлов в C:\Program Files\gettext-utils\bin, а затем вам нужно перейти в панель управления-> система -> дополнительно -> переменные среды и добавить этот path:C:\Program Files\gettext-utils\bin в переменные пути. Примечание:

Похожие вопросы:

Я пытаюсь создать кросс-компиляционную установку, которая позволит мне компилировать программы для Linux, Windows, Mac и Android. Однако в данный момент я столкнулся с проблемой, которую не знаю.

Свежая установка Windows 10 Home Build 10586. Пытаюсь установить java, файл jdk-8u101-windows-x64.exe. После запуска установщика, как администратор, в диспетчере задач появляется на 2 секунды Java.

Невозможно установить и настроить модуль Python Requests в Pycharm в windows 10. Получение ошибок.

В течение двух дней я пытаюсь установить magento версию 2.2 на операционную систему windows 10. Я клонирую существующий проект из онлайн-репозитория. Когда все сделано и когда я пытаюсь запустить.

Я пытался использовать python -m pip install windows-curses и ошибка, которая появляется, такова: ERROR: Could not find a version that satisfies the requirement windows-curses (from versions: none).

Теперь попробуем использовать.
При запуске приложения нам неизвестен его язык, т.е. он будет “Untranslated”. Указать язык можно где угодно — в initialization, в конструкторе формы, после выбора юзером языка и т.д. Для того, чтоб перевелась форма, в ее конструкторе следует вызвать метод translatecomponent.
Попробуем создать VCL Form Application с таким текстом в конструкторе формы:

Список поддерживаемых кодов языка можно посмотреть тут.
Далее создадим кнопку с Caption:=’Translate me’, по нажатию на которую покажем месседж и переключим язык приложения:

Он будет генерить РО файлы с нашего исходника тулзой dxgettext.exe в файл default.po в корневой папке приложения. Так как при генерации создается файл без переводов, то нужно учесть, что при добавлении туда переводов при следующем вызове dxgettext они исчезнут. Для этого скрипт далее делает слияние (msgmergedx) нового файла без переводов со старым файлом с переводами. В итоге мы сохраним все старые записи и переводы, а новые записи добавятся без перевода. Нужно учесть что все одинаковые тексты в оригинале будут сгруппированы в одну запись и переведены одинаково. То есть если у нас на трёх формах будет пункт меню “Save”, то в РО файле будет только одна запись и перевод будет одинаковым для всех трёх форм. Полезная фича dxgettext в том, что в комментарии для записи будут перечислены все места в коде, где она встречается.
Теперь попробуем что-то перевести. Можно использовать любой редактор из просторов интернета, можно просто в текстовом редакторе, но я взял редактор от того самого автора, моего бывшего босса — Gorm. Он точно также с открытыми исходниками и насыщен фичами больше некуда. Итак, идём в папку locale\en\LC_MESSAGES\ и открываем Gorm’ом default.po.
Для корректной работы перевода нужно указать какой язык этого файла, и при желании прочую инфу — автор перевода, версия, и т.д. Для этого открываем File / Edit header и в поле Language выбираем English. Можно заметить, что в перевод попал и ненужный нам пункт с именем шрифта. Чтоб его не переводить можно нажать кнопку Ignore справа. А для остальных впишем перевод в поле Translation внизу:

Сохраним. То же сделаем и для русского языка, указав его в хэдере. Теперь чтоб перевод появился в нашем приложении, РО файл нужно скомпилировать. Если был установлен dxgettext, это можно сделать двойным кликом по РО файлу, можно прямо в Gorm’е — Tools / Compile to MO file. Для того, чтобы наше приложение увидело файлы перевода, нужно у проекта поменять Output directory на корневую папку проекта (пустой путь или “.”). Теперь запустим его.


Кроме того, можно избавиться от МО файлов, и приложение будет работать с переводами без них. Для этого создадим еще один скриптик в корневой папке приложенияи назовём его translate.cmd. Он нам скомпилит РО файлы (да, еще один способ это сделать) и внедрит переводы в ЕХЕ файл.


Теперь у нас есть файл Project1_Translated.exe, который можно перемещать в другую папку, на другую машину, и переводы в нём уже встроены.

Далее рассмотрим типичные задачи, с которыми столкнётся программист, внедряя локализацию в приложение.

Строка в формате

Иногда нужно в текст втсавить значение переменной. Для перевода такой строки не нужно ее разбивать на куски, ведь тогда теряется смысл и переводчику будет трудно понять о чём этот кусок. Перевод можно сделать таким образом:

Функция перевода должна быть внутри формата, тогда перевод на русский к примеру будет “Количество %s: %d”. При этом Gorm будет показывать предупреждение, если количество параметров формата в переводе отличается.

Множественное число


Тут проявляется первый минус Gorm’а — такие переводы он не умеет редактировать. Поэтому вызовем updatepofiles.cmd для нашего проекта и попробуем написать перевод в текстовом редакторе. Для этого откроем locale\ru\LC_MESSAGES\default.po и найдём наши яблоки. Перевод будет вот таким:

msgid «apple»
msgid_plural «apples»
msgstr[0] «яблоко»
msgstr[1] «яблока»
msgstr[2] «яблок»

Скомпилим РО файл и запустим приложение. Мэсседж с яблоками будет выглядить так:
English Русский
1 apple 1 яблоко
2 apples 2 яблока
3 apples 3 яблока
4 apples 4 яблока
5 apples 5 яблок
6 apples 6 яблок
7 apples 7 яблок
8 apples 8 яблок
9 apples 9 яблок
10 apples 10 яблок
11 apples 11 яблок
21 apples 21 яблоко

Одинаковые слова с разными значениями

Если в приложении встречаются слова, которые при разном значении в языке по умолчанию пишутся одинаково (омонимы), то dxgettext.еxe, который вытаскивает переводы в РО файл, посчитает это одним и тем же словом, и перевод соответственно будет одинаков во всех местах, где встречается это слово. К примеру, если у нас чудным образом в приложении нужно перевести слово “bow” как лук (который стреляет), и как смычок для музыкальных инструментов, то получится неопределенность. Пример:

Тут уже либо стрелять смычком, либо играть луком. Обойти такую проблему можно разделив слово по значениям.



Результат:

Используй лук для стрельбы по врагам.
Используй смычок для игры на скрипке.
Домены

Иногда приложение разделено на модули, и эти модули нужно переводить отдельно. Для этого в dxgettext используются домены. По умолчанию все переводы попадают в домен “default”, потому и РО файл так называется. Но если мы будем использовать функции dgettext или dngettext где домен указывается параметром, то перевод будет попадать в РО файл с указанным доменом и соответственно поиск перевода будет выполняться в файле с именем домена. Кроме того, домен можно установить перманентно процедурой textdomain.

Выводы

Функционала dxgettext хватает с головой для локализации даже профессиональных и больших программных продуктов. Работает шустро, при внедрении переводов в исполняемый файл добавляет несколько мегабайт к его объёму, что сносно в случае Delphi, где небольшое приложение и так уже весит несколько десятков мегабайт ;)

Читайте также: