Что такое код dgettext

Содержание

php — xgettext vs gettext

У меня есть несколько вопросов:

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

Как установить xgettext в Windows?

И, наконец, есть ли у кого-нибудь учебник по установке библиотеки php-gettext http://savannah.nongnu.org/projects/php-gettext/ (этого обычно не приходит с PHP). Я читал об этом в статье, но я не уверен, как заставить ее работать в Windows. Дело в том, что иногда, когда вы вносите изменения, вам нужно перезапустить Apache, чтобы увидеть новые данные с gettext, который поставляется с PHP (но с библиотекой, которую вам не нужно перезапускать), поэтому я хотел использовать библиотеку для разработки, Спасибо!

    2 4
  • 21 апр 2020 2020-04-21 16:03:58
  • Kentor

4 ответа

Ссылка ссылка на функцию говорит мне, что нет xgettext.

Может быть, они означают один из

обработка «x» как шаблона

  • 21 апр 2020 2020-04-21 16:03:59
  • pavium

xgettext является частью gettext, это программа, которая извлекает переводимые строки из источников программы. См. gettext manual.

Я не знаю о его доступности в Windows, Google сообщает мне, что есть порт.

  • 21 апр 2020 2020-04-21 16:03:59
  • Josh Davis

Установите Cygwin и выберите пакет gettext-devel.
Это установит xgettext.exe

В Zend Framework есть gettext адаптер Zend_Translate, который не требует расширения php gettext.

  • 21 апр 2020 2020-04-21 16:03:58
  • Bob Fanger

В отношении вопроса:

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

Короче говоря, gettext() — это функция, а xgettext — служебная программа для извлечения сообщений из исходного кода.

В длинном, SO answer в Полный С++ i18n gettext() пример «привет мир» показывает как часть файла исходного кода С++ hellogt.cxx :

Функция gettext() передается текстовой строкой, которая используется как индекс для сообщения, которое будет использоваться во время выполнения. Он возвращает указанное сообщение для языка, который указан либо в коде, либо во время вызова программы.

Что такое код dgettext

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

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

Библиотека gettext предполагает хранение перевода в файлах с расширениями .mo (англ. Machine Object , бинарный файл, удобный для чтения программой и специфичный для платформы), или .gmo (GNU .mo) .po (англ. Portable Object , человеко-читаемый файл перевода, не зависящий от платформы) и .pot (англ. PO template — каталог, заготовка файла .po для перевода на новый язык). [2] . Кроме самих строк перевода, .po файлы могут содержать комментарии переводчика и различные служебные пометки.

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

Первоначально, строки из исходного текста программы собираются с помощью программы xgettext в .pot-файл (каталог). Обновление этого файла и файлов переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программой msgmerge . При этом сохраняются все уже переведённые строки, а те, которые изменились, помечаются как неточные (англ. fuzzy ). По умолчанию, такие строки не будут использоваться программой. Они нужны для удобства переводчика: часто проще базироваться на существующем, пусть и устаревшем, переводе, чем переводить всю фразу заново.

Для начала перевода программы на конкретный язык, переводчик создаёт .po -файл: копирует .pot -файл в нужное место и меняет в нём заголовок. Для этого можно использовать программу msginit . Готовый файл перевода конвертируется в .mo-файлы утилитой msgfmt . [2] .

Также существуют утилиты для переводчиков, облегчающие редактирование перевода, например:

  • Poedit кросплатформенный использует wxWidgets (при сохранении .po-файла пересобирает и соответствующий .mo -файл).
  • Lokalize (ранее kBabel) для KDE.
  • Gtranslator для GNOME.
  • Pootle машинный перевод в он-лайн и инструмент управления переводами.
  • gted плагин для Eclipse IDE.
  • TM-database машинный перевод .po файлов c помощью он-лайн переводчика и память переводов
  • В крайнем случае можно использовать простой текстовый редактор.

Кроме базовой реализации gettext для стандартного Си, существуют реализации аналогичного подхода для языков C++, Objective-C, сценарии sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Паскаль, wxW >[2] .

Использование в большинстве языков схоже с использованием в Си.

Использование

Для программиста

Простые строки

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

Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции gettext — _ (символ подчёркивания). Таким образом, вызов преобразуется в

Для вышеприведённой строки в каталоге появится запись вроде этой:

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

Для перевода множественного числа используется функция ngettext , которая принимает в качестве параметров две англоязычные строки (для единственного и множественного числа соответственно) и целое число. В PHP вызов ngettext для вывода строки с числом выглядит следующим образом:

Функция ngettext сама по себе не производит подстановку числового значения вместо %d , поэтому программисту необходимо вызвать функцию printf или подобную ей для формирования нужной строки с числом.

Примеры форматирования текста

При переводе строк для формирования веб-интерфейсов можно форматировать текст, заключив текст в определённые HTML-теги. Например:

В С-подобных языках (в частности, в php) перенос строки отображается символами \n , и переводя строки для программ, написанных на них, этим тоже можно пользоваться. Пример:

результат:
Текст.
Текст

Для переводчика

Простые строки

Затем он переводит строки в этом файле, например, для русского перевода:

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

Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как Project-Id-Version и PO-Revision-Date ) .po -файла было указано правило формирования множественных чисел для данного языка. Например, в русском языке существует три формы множественных чисел:

  • 1, 21, 31… день
  • 2, 3, 4, 22, 23, 24, 32, 33, 34… дня
  • 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36… дней

Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой [3] :

Выражение для plural здесь пишется с использованием синтаксиса языка Си, и может опираться лишь на переменную n , которая обозначает выводимое число.

После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом:

Для пользователя

Обычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной LANG , которая обычно уже установлена в требуемое значение.

Linux программирование в примерах (148 стр.)

GNU gettext дает возможность перевода сообщений программы на другие языки во время исполнения. Внутри кода программы этот перевод включает несколько шагов, каждый из которых использует свои библиотечные функции. Когда сама программа должным образом подготовлена, несколько утилит на уровне оболочки дают возможность подготовить переводы на другие языки. Каждый такой перевод называется списком сообщений (message catalog).

13.3.1. Установка текстового домена: textdomain()

Законченное приложение может содержать множество компонентов: отдельные исполняемые файлы, написанные на С или C++ или на языках сценариев, которые также могут получить доступ к возможностям gettext , таких, как gawk или оболочка Bash Все компоненты приложения разделяют один и тот же текстовый домен, который является строкой, уникально идентифицирующей приложение. (Примерами могут быть » gawk » или » coreutils «; первое является простой программой, а последнее — целым набором программ.) Текстовый домен устанавливается функцией textdomain() :

char* textdomain(const char *domainname)

Каждый компонент должен вызывать эту функцию со строкой, указывающей на текстовый домен, в составе первоначальной инициализации в main() . Возвращаемое значение является текущим текстовым доменом. Если аргумент domainname равен NULL , возвращается текущий домен; в противном случае, он устанавливается в указанное значение, а последнее возвращается. Возвращаемое значение NULL указывает на какую-нибудь разновидность ошибки.

Если текстовый домен не установлен с помощью textdomain() , по умолчанию используется » messages «.

13.3.2. Перевод сообщений: gettext()

Следующим после установки текстового домена шагом является использование функции gettext() (или ее разновидности) для каждой строки, которая должна быть переведена. Несколько функций предоставляют службы перевода:

char *gettext(const char *msgid);

char *dgettext(const char *domainname, const char *msgid);

char *dcgettext(const char *domainname, const char *msgid, int category);

Аргументы, используемые в этих функциях, следующие:

const char *msgid

Переводимая строка. Она действует в качестве ключа к базе данных переводов.

const char *domainname

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

Одна из описанных ранее категорий доменов ( LC_TIME и т.п.). Доменом по умолчанию является то, что было раньше установлено с помощью textdomain() (» messages «, если textdomain() никогда не вызывалась). Категорией по умолчанию является LC_MESSAGES . Предположим, main() делает следующий вызов:

Тогда ‘ gettext(«my message») ‘ эквивалентно ‘ dgettext(«killerapp», «my message») ‘. Обе функции, в свою очередь, эквивалентны ‘ dcgettext(«killerapp», «my message», LC_MESSAGES) ‘.

В 99,9% времени бывает нужно использовать gettext() . Однако, другие функции обеспечивают гибкость при работе с другими текстовыми доменами или категориями локалей. Скорее всего, эта гибкость потребуется при программировании библиотек, поскольку автономная библиотека почти наверняка будет использовать свой собственный текстовый домен.

Все функции возвращают строки. Строка является либо переводом данного msgid , либо, если перевода не существует, первоначальной строкой. Таким образом, всегда имеется какой-нибудь вывод, даже если это первоначальное сообщение (предположительно на английском). Например:

/* Каноническая первая программа, локализованная версия. */

printf(«%s\n», gettext(«hello, world»));

Хотя сообщение является простой строкой, мы не используем ее непосредственно в форматирующей строке printf() , поскольку в общем перевод может содержать символы % .

Илон Маск рекомендует:  Reset - Процедура Delphi

Вскоре, в разделе 13.3.4 «Упрощение использования gettext() «, мы увидим, как облегчить использование gettext() в крупномасштабных, реальных программах.

13.3.3. Работа с множественными числами: ngettext()

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

printf(«%d word%s misspelled\n», nwords, nwords > 1 ? «s» : «»);

printf(«%d %s misspelled\n», nwords, nwords == 1 ? «word» : «words»).

Это подходит для английского языка, но перевод становится трудным. Во-первых, во многих языках множественное число не образуется с такой же легкостью, как в английском (добавлением суффикса s для большинства слов). Во-вторых, во многих языках, особенно в Восточной Европе, имеются несколько форм множественного числа, каждая из которых указывает на то, сколько объектов обозначает форма. Соответственно даже код наподобие следующего не будет достаточным:

printf(«one word misspelled\n»);

printf(«%d words misspelled\n», nwords);

Решением является параллельный набор процедур специально для форматирования множественных значений:

char *ngettext(const char *msgid, const char *msgid_plural,

unsigned long int n);

char *dngettext(const char *domainname, const char *msgid,

const char *msgid_plural, unsigned long int n);

char *dcngettext(const char *domainname, const char *nmgid,

const char *msgid_plural, unsigned long int n,

Помимо первоначального аргумента msgid , эти функции принимают дополнительные аргументы:

const char *msgid_plural

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

unsigned long int n

Число имеющихся элементов.

Список сообщений каждой локали указывает, как переводить множественные числа. Функция ngettext() (и ее варианты) проверяет n и на основании спецификации в списке сообщений возвращает соответствующий перевод msgid . Если в списке нет перевода для msgid , или находясь в локали «С», ngettext() возвращает msgid , если ‘ n == 1 ‘; в противном случае она возвращает msgid_plural . Таким образом, наш пример ошибочных слов выглядит следующим образом:

printf(«%s\n», ngettext(«%d word misspelled», «%d words misspelled», nwords), nwords);

Обратите внимание, что nwords должен быть передан ngettext() для выбора форматирующей строки, а затем printf() для форматирования. Вдобавок, будьте осмотрительны и не используйте макрос или выражение, значение которого каждый раз изменяется, как в случае ‘ n++ ‘! Такое может случиться, если вы осуществляете глобальное редактирование, добавляя вызовы ngettext() и не обращая на это внимания.

Что такое код dgettext

Кроме стандартного Си, поддерживаются также: C++, Objective-C, сценарии sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R.

Использование в большинстве языков схоже с использованием в Си.

Интернационализация

Для программиста

Простые строки

Строки, которые необходимо перевести, размечаются в исходном коде вызовом функции gettext , ngettext или подобной. Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции gettext — _ (символ подчёркивания). Таким образом, вызов

Размеченные строки собираются в каталог с помощью программы xgettext . Например, для вышеприведённой строки в каталоге появится запись вроде этой:

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

Для перевода множественного числа используется функция ngettext , которая принимает в качестве параметров две строки (для единственного и множественного числа соответственно) и целое число. В PHP вызов ngettext выглядит следующим образом:

Две строки необходимы для того, чтоб не делать отдельный перевод этой фразы на английский язык, т.к. большинство разрабатываемых приложений и так пишутся на английском. Функция ngettext сама по себе не производит подстановку числового значения вместо %d , поэтому программисту необходимо вызвать функцию printf или подобную ей для формирования нужной строки с числом.

Для переводчика

Простые строки

Переводчик создаёт на основе каталога .po -файл, содержащий перевод на конкретный язык. (Для этого можно использовать программу msginit .) Затем он переводит строки в этом файле, например, для русского перевода:

Для редактирования .po -файлов существует множество инструментов, к примеру:

Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как Project-Id-Version и PO-Revision-Date ) .po -файла было указано правило формирования множественных чисел для данного языка. Например, в русском языке существует три формы множественных чисел:

  • 1, 21, 31. день
  • 2, 3, 4, 22, 23, 24, 32, 33, 34. дня
  • 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36. дней

Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой:

Эта формула имеет вид выражения на языке Си, в котором переменная n обозначает число.

После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом:

Для пользователя

Обычно пользователю в UNIX-подобных операционных системах не нужно предпринимать дополнительных шагов для выбора конкретного перевода. Перевод определяется системной переменной LANG , которая обычно уже установлена в требуемое значение.

Поддержка существующих переводов

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

См. также

Ссылки

В Википедии есть портал
«Свободное ПО»
  • Сайт gettext (англ.) . Проверено 23 ноября 2009.
  • Практическое применение gettext для локализации и интернационализации приложений (рус.) . Проверено 23 ноября 2009.

Wikimedia Foundation . 2010 .

Смотреть что такое «Gettext» в других словарях:

gettext — Developer(s) Various Stable release 0.18 (GNU gettext) / May 9, 2010 (GNU gettext) Operating system Cross platform Type Internationalization and localization … Wikipedia

Gettext — est la bibliothèque GNU d internationalisation (i18n). Elle est couramment utilisée pour écrire des programmes multilingues. Sommaire 1 Processus 1.1 Programmeur 1.1.1 Commentaires pour les traducteurs … Wikipédia en Français

Gettext — es la biblioteca GNU de internacionalización (i18n). Comúnmente se usa para escribir programas con interfaz en varios >Wikipedia Español

Gettext — es la libreria GNU de internacionalizacion (i18n). Es comunmente usada para escribir programas multilenguaje. La ultima version es la 0.14 … Enciclopedia Universal

Gettext — GNU gettext Entwickler: Das GNU gettext Team (Maintainer: Bruno Haible) Aktuelle Version: 0.17 (27. November 2006) Betriebssystem: Unix artige Betriebssysteme, Windows (s. Weblinks) … Deutsch Wikipedia

gettext — GNU gettext Тип локализация программного обеспечения Автор Ульрих Дреппер Разработчики сообщество Написана на C Интерфейс командная строка Операционная система Linux и др … Википедия

GNU gettext — gettext Développeur Projet GNU Dernière version 0.18.1 ( … Wikipédia en Français

GNU gettext — Infobox Software name = gettext developer = The GNU Project latest release version = 0.17 latest release date = November 11, 2007 operating system = Cross Platform genre = Development, Translation license = LGPL (library), GPL (tools), GFDL/GPL… … Wikipedia

GNU gettext — Entwickler Das GNU gettext Team (Maintainer: Bruno Haible) Aktuelle Version 0.18.1.1 (6. Juni 2010) Betriebssystem Unix artige Betriebssysteme, Windows (s. Weblinks) Kategorie … Deutsch Wikipedia

Что такое класс в Java

ООП — это то, на чём держится вся разработка на Java. С помощью объектов и классов можно создать любой функционал быстрее.

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

В программе, написанной по принципам ООП, отдельные компоненты рассматриваются как предметы из реального мира, такие как дом, дерево, кот, человек и даже Java-разработчик. У каждого объекта есть свои атрибуты. Вот какими они будут у принтера: цвет, марка, скорость печати, объём оставшейся краски и так далее.

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Также принтеру свойственно определённое «поведение»: печать, сканирование, копирование, проверка наличия краски, подключение к Wi-Fi и так далее — всё это называется методами.

Каждый принтер уникален, поэтому обладает своим идентификатором, по которому к нему можно обратиться, чтобы узнать или изменить тот или иной атрибут, а также вызвать метод:

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

Допустим, существует класс Бумага, которому прописываются свои параметры и методы: цвет, цена, размер, толщина и так далее. Каждый отдельный объект является экземпляром класса. Например, можно создать объект листБумаги1, листБумаги2, листБумаги3 — у всех них будут одинаковые атрибуты и поведение, но разные значения:

Эту бумагу можно, например, передать объекту класса Принтер, чтобы её распечатать:

Без объектов нам бы пришлось создавать отдельные функции и работать с ними. Сейчас мы можем написать такой код:

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

Без классов нам бы пришлось создавать множество негруппированных переменных, в которых хранилась бы вся эта информация:

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

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

Как работают классы в Java

Создавая программу, нужно объявить класс с её именем, а потом добавить метод main — из него начинается работа приложения:

В Java всё, что не является объектом, является классом. Даже System, с помощью которого выводится текст, — это объект.

Можно создать переменные для этого класса — атрибуты:

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

Пока не обращайте внимания на слова public и static — про них мы расскажем позже. Так же можно создавать методы, похожие на main. Для них укажите модификаторы доступа (public и static), возвращаемый тип и название:

Запустив программу, мы увидим результат работы метода GetCube():

Пока всё работает в пределах основного класса, но можно создать и другие. Для наглядности мы будем делать это на примере кода мессенджера. Здесь будут использоваться классы Сообщение (Message) и Пользователь (User).

Чтобы начать работать с классами, создайте папку для своего проекта: например, 01. Добавьте в неё ещё два каталога — src и bin. В первом будут храниться исходники, а во втором — скомпилированные файлы.

Теперь скомпилировать файл можно так:

А запустить — так:

Все классы должны находиться в отдельных файлах. которые нужно объединить в пакет. Его название должно выглядеть так: com.sitename.packagename. Хотя вы можете обойтись и без домена packagename. Чтобы создать пакет, сначала в папке src создайте следующую структуру:

В нашем случае для основного файла путь будет таким:

В тот же каталог поместите User.java и Message.java. После этого в начало каждого файла добавьте такую строчку:

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

Илон Маск рекомендует:  Что такое код alloca

Теперь можно компилировать программу с помощью команды:

Если вы всё сделали правильно, в папке bin появится такая же структура, как в src. Вот код корневого файла приложения:

Теперь этот код можно запустить, прописав такую команду:

Вот что выведет консоль:

Этот процесс можно ускорить, если скачать >Eclipse можно нажать File -> new -> class — этого будет достаточно.

Но если вы пока не уверены, что хотите продолжать работать на Java, можете поэкспериментировать в консоли.

Как создать класс в Java

Теперь можно приступить к созданию классов. Начнём с пользователя:

Слово public выступает модификатором доступа — он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:

  • public — доступно в любых частях программы (применимо и к другим компонентам);
  • default — доступно только классам из того же пакета.

Теперь в основном файле можно создать объект класса User:

Мы указали для объекта user1 класс User, а после оператора присваивания указали ключевое слово new и запустили конструктор (об этом позже). Вот как будет выполнена программа:

Создание объекта называется объявлением экземпляра класса — тут же можно использовать конструктор, чтобы сразу задать значения атрибутам.

Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:

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

Теперь, чтобы создать объект, нужно немного поменять код:

Дальше можно создать класс для работы с сообщениями:

Обратите внимание, что в этот раз для атрибутов from и to мы задали модификатор private, а в качестве типа стоит User. Private позволяет закрыть доступ к элементам извне — то есть их можно менять только внутри методов самого класса.

Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться getter и setter. Это специальные методы, которые позволяют обратиться к защищённой переменной:

Теперь можно написать код, который будет создавать сообщение:

локализация gettext

После перехода на новый сервер перестал работать способ локализации gettext, всё на английском, при способе PHP локализация работает верно.Модуль gettext на сервере есть. Как решить данную проблему?

В версии 1.13 фреймворка Webasyst мы добавили возможность локализации тем дизайна с помощью механизма gettext. Этот способ локализации работает так же, как и для приложений, плагинов и виджетов. Ознакомительная обновлённая версия фреймворка для.

Столкнулся с такой проблемой:Почему не переводится текст во фронтенде — именно в выводе всех записей блога. Подробнее:1) В записях блога (в режиме HTML) размещены тексты в формате [`text`]2) В .po файлы добавлены необходимые строки с переводами этих.

Поясните, как работает и в чем отличия при выборе настроек:Локализация Gettext (рекомендуется)Локализация PHPС наскоку не понял, экспериментировать нет сейчас возможности.Спасибо.

В настройках инсталлера есть параметр Локализация, в котором можно выбрать одно из двух значений:Gettext (рекомендуется) и PHP. Не совсем понятно, как этот параметр работает.Сейчас столкнулся с такой проблемой, что не для всех фраз разрабатываемого.

Доброго дня всем!Прошу Вебасист обратить внимание на проблему с приложением MyLang. В приложении существует перманентная проблема с обработкой файлов .mo и .po. Приложение, фактически, ломает эти файлы, из-за чего во фреймворке перестает полноценно.

В настройках приложения в селекте «Локализация» выбран Gettext Для локализации использую My Lang Lite. Редактирую необходимые мне строки, сохраняю. Очищаю кеш и в браузере и в админке сайта в инсталлере. Проверяю на серваке есть ли изменения в.

Я понимаю, что все ненавидят кириллические домены, но это не значит, что нужно обламывать тех, кто их использует.Вот что происходит с кириллическими доменами:dgettext(): msgid passed too long in /public_html/wa-system/locale/waLocaleAdapter.class.php.

Здравствуйте! Установил фрэймворк. Установка прошла успешно и без проблем. Но вся админка на английском. Installer->settings->»Default Webasyst interface language» стоит «русский». Пробовал менять на английский и обратно.

После какого-то обновления в одном из магазинов стало вот так. Внутри там всё тоже по английски. Хотя везде где можно стоит русский. Что делать, как поправить? Спасибо!

Вся админка на англ языке, хотя в настройках инсталлера стоит язык русский http://prntscr.com/elgudd в чем мистика?

добрый день! мы недавно произвели переход на shop-script 5 со старой версии движка при локальных настройках и доводках движок вел себя нормально при установке на тестовый временный хостинг — тоже при установке на постоянное место хостинга (другая.

Добрый день, примерно 2-3 недели назад часть админки и уведомлений стала на английском языке. Настроек языка не менял. Язык интерфейса инсталлера по умолчанию — русский, в настройка магазина тоже русский язык, язык пользователя — русский.

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

После последнего обновления при редактировании заказа, после того как его сохраняешь, цены округляются до целых (без копеек)

Все цены с дробными значениями не учитываются при редактировании заказа. Если цена меньше 1, например 0,90 — она вообще не считается в сумму заказа. В остальных случаях цены округляются до целых значений. Даже если просто нажать кнопку.

В шаблоне об успешном оформлении заказа есть фраза «Спасибо за ваш заказ, мы свяжемся с вами и т.д.» — а в коде она на англ. http://take.ms/qEdB5 Где править русский вариант?

Постоянно, само по себе, по неизвестной причине происходит следующее: в каталоге товаров вместо «в корзину» появляется надпись «add to cart» , при поиске товаров вместо «Поиск товаров «фыафывафы»» появляется.

Некоторые настройки действуют для всего Webasyst-аккаунта — для их изменения используется приложение «Настройки». В нём есть несколько разделов. Общие настройки Название сайта. Это значение может отображаться на страницах сайта и.

Было бы неплохо добавить плагин для smarty или модификатор для склонения имен существительных (заказ, заказа, заказов) в темах дизайна, или же сделать реализацию в theme.xml (если это возможно). Пока пользуюсь функцией (алгоритм из php варианта от.

Не понятно почему, но вот после обновления — Версия Вебасиста 1.9.1.275 — магазин стал на английском языке.Во всех настройках стоит язык русский, кэш чистил. некоторые части русские, а некоторые английские.Тема дизайна.

Удобная покупка. Многие страницы сайта (конкретно темы удобная покупка) имеют английские слова. Когда же при другой теме все слова на русском. Как исправить эту ошибку. Спасибо

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

Здравствуйте!У меня хостинг Агава. Задал им вопрос по тех. требованиям, все вроде бы в порядке, кроме трех, как мне сказали, незначительных параметров:1. Вместо mod_php у них режим ls php (если я правильно расслышал)2. Вместо domxml у них просто dom3.

Webasyst — это CMS нового поколения, совмещающая в себе инструменты для управления сайтом и интернет-магазином с полезными приложениями для совместной работы с коллегами и взаимодействия с клиентами. Единый центр управления бизнесом через интернет.

Платформа
Магазин Webasyst
Помощь
  • © 2002—2020 Webasyst
  • О компании
  • Блог
  • Договор-оферта
  • Webasyst.com

Мы получаем и обрабатываем персональные данные посетителей сайта в соответствии с Политикой обработки персональных данных. Отправка персональных данных с помощью любой страницы сайта подразумевает согласие со всеми пунктами Политики.

gettext

Описание

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

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

Библиотека gettext предполагает хранение перевода в файлах с расширениями .mo (англ. Machine Object, бинарный файл, удобный для чтения программой и специфичный для платформы), или .gmo (GNU .mo) .po (англ. Portable Object, человеко-читаемый файл перевода, не зависящий от платформы) и .pot (англ. PO template — каталог, заготовка файла .po для перевода на новый язык).

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

Первоначально, строки из исходного текста программы собираются с помощью программы xgettext в .pot-файл (каталог). Обновление этого файла и файлов переводов с использованием новых и изменившихся строк, появившихся в исходном коде, осуществляется программой msgmerge. При этом сохраняются все уже переведённые строки, а те, которые изменились, помечаются как неточные (англ. fuzzy). По умолчанию, такие строки не будут использоваться программой. Они нужны для удобства переводчика: часто проще базироваться на существующем, пусть и устаревшем, переводе, чем переводить всю фразу заново.

Для начала перевода программы на конкретный язык, переводчик создаёт .po-файл: копирует .pot-файл в нужное место и меняет в нём заголовок. Для этого можно использовать программу msginit. Готовый файл перевода конвертируется в .mo-файлы утилитой msgfmt.

Также существуют утилиты для переводчиков, облегчающие редактирование перевода, например: Poedit кросплатформенный использует wxWidgets (при сохранении .po-файла пересобирает и соответствующий .mo -файл).

В крайнем случае можно использовать простой текстовый редактор. Кроме базовой реализации gettext для стандартного Си, существуют реализации аналогичного подхода для языков C++, Objective-C, сценарии sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Паскаль, wxWidgets (с использованием класса wxLocale), YCP (язык YaST2), Tcl, Pike и R. Часть этих языков поддерживаются непосредственно упомянутыми выше утилитами.

Использование в большинстве языков схоже с использованием в Си.

Простые строки

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

Обычно для уменьшения размера исходного кода и улучшения читаемости объявляют и используют короткий синоним функции gettext — _ (символ подчёркивания). Таким образом, вызов преобразуется в

Для вышеприведённой строки в каталоге появится запись вроде этой:

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

Для перевода множественного числа используется функция ngettext, которая принимает в качестве параметров две англоязычные строки (для единственного и множественного числа соответственно) и целое число. В PHP вызов ngettext для вывода строки с числом выглядит следующим образом:

Функция ngettext сама по себе не производит подстановку числового значения вместо %d, поэтому программисту необходимо вызвать функцию printf или подобную ей для формирования нужной строки с числом.

Примеры форматирования текста

При переводе строк для формирования веб-интерфейсов можно форматировать текст, заключив текст в определённые HTML -теги. Например:

Илон Маск рекомендует:  Что такое код ebcdic2ascii

Затем он переводит строки в этом файле, например, для русского перевода:

Множественные числа Для перевода множественных чисел необходимо, чтобы в заголовке (там, где указываются такие данные, как Project-Id-Version и PO-Revision-Date) .po-файла было указано правило формирования множественных чисел для данного языка. Например, в русском языке существует три формы множественных чисел:

Выбор одной из этих трёх форм в зависимости от числа осуществляется следующей формулой:

Выражение для plural здесь пишется с использованием синтаксиса языка Си, и может опираться лишь на переменную n, которая обозначает выводимое число. После такого объявления формы приобретают номера 0, 1 и 2, и перевод фразы осуществляется следующим образом:

Что такое код dgettext

The gettext() , dgettext() , and dcgettext() functions attempt to retrieve a target string based on the specified msgid argument within the context of a specific domain and the current locale. The length of strings returned by gettext() , dgettext() , and dcgettext() is undetermined until the function is called. The msgid argument is a null-terminated string.

The ngettext() , dngettext() , and dcngettext() functions are equivalent to gettext() , dgettext() , and dcgettext() , respectively, except for the handling of plural forms. These functions work only with GNU-compatible message catalogues. The ngettext() , dngettext() , and dcngettext() functions search for the message string using the msgid1 argument as the key and the n argument to determine the plural form. If no message catalogues are found, msgid1 is returned if n == 1, otherwise msgid2 is returned.

The NLSPATH environment variable (see environ (5)) is searched first for the location of the LC_MESSAGES catalogue. The setting of the LC_MESSAGES category of the current locale determines the locale used by gettext() and dgettext() for string retrieval. The category argument determines the locale used by dcgettext(). If NLSPATH is not defined and the current locale is «C», gettext() , dgettext() , and dcgettext() simply return the message string that was passed. In a locale other than «C», if NLSPATH is not defined or if a message catalogue is not found in any of the components specified by NLSPATH , the routines search for the message catalogue using the scheme described in the following paragraph.

The LANGUAGE environment variable is examined to determine the GNU-compatible message catalogues to be used. The value of LANGUAGE is a list of locale names separated by a colon (‘:’) character. If LANGUAGE is defined, each locale name is tried in the specified order and if a GNU-compatible message catalogue is found, the message is returned. If a GNU-compatible message catalogue is found but failed to find a corresponding msgid , the msgid string is return. If LANGUAGE is not defined or if a Solaris message catalogue is found or no GNU-compatible message catalogue is found in processing LANGUAGE , the pathname used to locate the message catalogue is dirname / locale / category / domainname .mo, where dirname is the directory specified by bindtextdomain() , locale is a locale name, and category is either LC_MESSAGES if gettext() , dgettext() , ngettext() , or dngettext() is called, or LC_XXX where the name is the same as the locale category name specified by the category argument to dcgettext() or dcngettext() .

For gettext() and ngettext() , the domain used is set by the last valid call to textdomain() . If a valid call to textdomain() has not been made, the default domain (called messages ) is used.

For dgettext() , dcgettext() , dngettext() , and dcngettext() , the domain used is specified by the domainname argument. The domainname argument is equivalent in syntax and meaning to the domainname argument to textdomain() , except that the selection of the domain is valid only for the duration of the dgettext() , dcgettext() , dngettext() , or dcngettext() function call.

The textdomain() function sets or queries the name of the current domain of the active LC_MESSAGES locale category. The domainname argument is a null-terminated string that can contain only the characters allowed in legal filenames.

The domainname argument is the unique name of a domain on the system. If there are multiple versions of the same domain on one system, namespace collisions can be avoided by using bindtextdomain() . If textdomain() is not called, a default domain is selected. The setting of domain made by the last valid call to textdomain() remains valid across subsequent calls to setlocale (3C), and gettext() .

The domainname argument is applied to the currently active LC_MESSAGES locale.

The current setting of the domain can be queried without affecting the current state of the domain by calling textdomain() with domainname set to the null pointer. Calling textdomain() with a domainname argument of a null string sets the domain to the default domain ( messages ).

The bindtextdomain() function binds the path predicate for a message domain domainname to the value contained in dirname . If domainname is a non-empty string and has not been bound previously, bindtextdomain() binds domainname with dirname .

If domainname is a non-empty string and has been bound previously, bindtextdomain() replaces the old binding with dirname . The dirname argument can be an absolute or relative pathname being resolved when gettext() , dgettext() , or dcgettext() are called. If domainname is a null pointer or an empty string, bindtextdomain() returns NULL. User defined domain names cannot begin with the string SYS_ . Domain names beginning with this string are reserved for system use.

The bind_textdomain_codeset() function can be used to specify the output codeset for message catalogues for domain domainname . The codeset argument must be a valid codeset name that can be used for the iconv_open (3C) function, or a null pointer. If the codeset argument is the null pointer, bind_textdomain_codeset() returns the currently selected codeset for the domain with the name domainname . It returns a null pointer if a codeset has not yet been selected. The bind_textdomain_codeset() function can be used multiple times. If used multiple times with the same domainname argument, the later call overrides the settings made by the earlier one. The bind_textdomain_codeset() function returns a pointer to a string containing the name of the selected codeset. The string is allocated internally in the function and must not be changed by the user.

The external variables _nl_msg_cat_cntr and _nl_domain_bindings are provided for the compatibility with the GNU gettext() implementation.

RETURN VALUES

The gettext() , dgettext() , and dcgettext() functions return the message string if the search succeeds. Otherwise they return the msgid string.

The ngettext() , dngettext() , and dcngettext() functions return the message string if the search succeeds. If the search fails, msgid1 is returned if n == 1. Otherwise msgid2 is returned.

The individual bytes of the string returned by gettext() , dgettext() , dcgettext() , ngettext() , dngettext() , or dcngettext() can contain any value other than NULL . If msgid is a null pointer, the return value is undefined. The string returned must not be modified by the program and can be invalidated by a subsequent call to bind_textdomain_codeset() or setlocale (3C). If the domainname argument to dgettext() , dcgettext() , dngettext() , or dcngettext() is a null pointer, the the domain currently bound by textdomain() is used.

The normal return value from textdomain() is a pointer to a string containing the current setting of the domain. If domainname is a null pointer, textdomain() returns a pointer to the string containing the current domain. If textdomain() was not previously called and domainname is a null string, the name of the default domain is returned. The name of the default domain is messages . If textdomain() fails, a null pointer is returned.

The return value from bindtextdomain() is a null-terminated string containing dirname or the directory binding associated with domainname if dirname is NULL. If no binding is found, the default return value is /usr/lib/locale . If domainname is a null pointer or an empty string, bindtextdomain() takes no action and returns a null pointer. The string returned must not be modified by the caller. If bindtextdomain() fails, a null pointer is returned.

USAGE

These functions impose no limit on message length. However, a text domainname is limited to TEXTDOMAINMAX (256) bytes.

The gettext() , dgettext() , dcgettext() , ngettext() , dngettext() , dcngettext() , textdomain() , and bindtextdomain() functions can be used safely in multithreaded applications, as long as setlocale (3C) is not being called to change the locale.

The gettext() , dgettext() , dcgettext() , textdomain() , and bindtextdomain() functions work with both Solaris message catalogues and GNU-compatible message catalogues. The ngettext() , dngettext() , dcngettext() , and bind_textdomain_codeset() functions work only with GNU-compatible message catalogues. See msgfmt (1) for information about Solaris message catalogues and GNU-compatible message catalogues.

FILES

default path predicate for message domain files

/usr/lib/locale/ locale /LC_MESSAGES/ domainname .mo

system default location for file containing messages for language locale and domainname

/usr/lib/locale/ locale /LC_XXX/ domainname .mo

system default location for file containing messages for language locale and domainname for dcgettext() calls where LC_XXX is LC_CTYPE , LC_NUMERIC , LC_TIME , LC_COLLATE , LC_MONETARY , or LC_MESSAGES

dirname / locale /LC_MESSAGES/ domainname .mo

location for file containing messages for domain domainname and path predicate dirname after a successful call to bindtextdomain()

dirname / locale /LC_XXX/ domainname .mo

location for files containing messages for domain domainname, language locale, and path predicate dirname after a successful call to bindtextdomain() for dcgettext() calls where LC_XXX is one of LC_CTYPE , LC_NUMERIC , LC_TIME , LC_COLLATE , LC_MONETARY , or LC_MESSAGES

ATTRIBUTES

See attributes (5) for descriptions of the following attributes:

ATTRIBUTE TYPE ATTRIBUTE VALUE
Interface Stability See below.
MT-Level

The external variables _nl_msg_cat_cntr and _nl_domain_bindings are Uncommitted.

Могу ли я использовать массив доменов с dgettext для многоязычного приложения?

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

В настоящее время я могу сделать это с помощью следующего кода (обратите внимание, что это просто пример кода, а не требования конкретной страны):

Я хотел бы иметь возможность сделать следующее:

И сгенерируйте файл POT для каждой страны.

Есть ли метод gettext для обработки массива «доменов», или мне нужно будет расширить библиотеку gettext?

Включается ли «Адрес 1» в файл POT, когда я указываю флаг домена (-d) для xgettext, или мне нужен другой флаг для включения строк, обернутых в gettext и dgettext?

Linux.yaroslavl.ru

Учебник РНР
Назад Вперёд

XXXV. Функции Gettext

Функции gettext реализуют NLS (Native Language Support) API, который может использоваться для интернационализации ваших PHP-приложений. Просмотрите документацию о gettext для вашей системы по адресу http://www.gnu.org/manual/gettext/index.html.

Для использования этих функций вы обязаны загрузить и установить пакет GNU gettext с http://www.gnu.org/software/gettext/gettext.html

Чтобы включить поддержку GNU gettext в ваше построение PHP, вы обязаны добавить опцию
—with-gettext[=DIR] , где DIR это директория установки gettext, по умолчанию это /usr/local.

Это расширение не определяет никаких директив конфигурации.

Это расширение не определяет никакие типы ресурсов.

Это расширение не определяет никаких констант.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL