Что такое код dcngettext

Содержание

Linux.yaroslavl.ru

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

dcngettext — множественная версия dcgettext.

Описание

string dcngettext (string domain, string msgid1, string msgid2, int n, int category)

Эта функция в настоящее время ещё не задокументирована; имеется только список аргументов.

FPublisher

Web-технологии: База знаний

Документация PHP

dcngettext

(PHP 4 >= 4.2.0, PHP 5)

dcngettext — Версия dcgettext для множественного числа

Описание

string dcngettext ( string $domain , string $msgid1 , string $msgid2 , int $n , int $category )

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

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

dgettext

(PHP 4, PHP 5, PHP 7)

dgettext — Переопределяет текущий домен для одного сообщения

Описание

Функция dgettext() позволяет переопределить текущий домен domain для одного сообщения.

Список параметров

Возвращаемые значения

В случае успеха возвращает значение типа string .

Смотрите также

  • gettext() — Ищет сообщение в текущем домене

User Contributed Notes 1 note

While using this function, remember to call bindtextdomain for as many domains as you want to use in your application. For example, if I have module1 and module2 as 2 separate domains in the same application, you can do the following:

bindtextdomain(«module1», «//path/to/my/locale/folder»);
bindtextdomain(«module2», «//path/to/my/locale/folder»);
textdomain(«module1»);

echo _(«Label1»); // this call will get the message from module1
echo dgettext(«module2», «Label1»); // this call will get the message from module2

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() , поскольку в общем перевод может содержать символы % .

Вскоре, в разделе 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() и не обращая на это внимания.

xgettext vs gettext

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

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

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

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

Создан 30 авг. 09 2009-08-30 03:21:35 Kentor

Возможно, вам захочется разбить вторую и третью части на свои вопросы. – C.W.Holeman II 07 июн. 10 2010-06-07 05:29:24

4 ответа

Что касается вопроса:

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

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

В длину, SO answer в Complete C++ i18n gettext() “hello world” example показывает как часть ++ исходного кода файла C hellogt.cxx :

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

Что такое класс в 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. После этого в начало каждого файла добавьте такую строчку:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

xgettext vs gettext

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

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

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

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

Создан 30 авг. 09 2009-08-30 03:21:35 Kentor

Возможно, вам захочется разбить вторую и третью части на свои вопросы. – C.W.Holeman II 07 июн. 10 2010-06-07 05:29:24

4 ответа

Что касается вопроса:

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

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

В длину, SO answer в Complete C++ i18n gettext() “hello world” example показывает как часть ++ исходного кода файла C hellogt.cxx :

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

Как написать такой код?

Добрый вечер.
Помогите, разбираюсь с базами данных, увидел вот такой код

С хелпа у UniDac

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

|U»,$file,$frazes); $myper = array(); .

Как написать код к предыдущему числу + 1
Добрый день, люди помогите, пожалуйста, написать код программы. Задача в том, что на Формк1 есть.

ADOQuery GetText как правильно написать код
Записал в ADOQuery поля, выбираю поле «Цена». как правильно написать код в этом событие.

Delphi! ClientDataSet1, почему такой код изменяет только последнюю запись?
with clientDataSet1 do begin ik:=0; first; while not EOF do begin Edit; //.

Подскажите как правильно написать код для ComboBox
Доброго времени суток. Недавно начала изучать дельфи. Подскажите как правильно написать в следующим.

Разбираем исходный код GNU Coreutils: утилита yes

Зачем?

GNU Coreutils

GNU Core Utilites — это набор утилит для выполнения базовых пользовательских операций: создание директории, вывод файла на экран и так далее. По замыслу разработчиков, эти утилиты должны быть доступны в любой операционной системе, что мы и наблюдаем в настоящее время: для Windows есть Cygwin, ну а про *nix и говорить нечего. Сохранить единообразность работы в разных системах помогает стандарт POSIX, который в Coreutils пытаются соблюдать. Coreutils содержит такие часто используемые утилиты, как cat, tail, echo, wc и многие другие.

Для начала выберем самую тривиальную программу под названием yes. Её простота позволит разобраться с используемыми в Coreutils инструментами и библиотеками.

Утилита yes

Как говорится в мане, всё что умеет утилита yes — это бесконечно выводить «yn» в stdout. Если мы передадим yes какие-то аргументы, то вместо «y» yes будет выводить аргументы через пробел. Наверняка похожую программу писал каждым, кто начинал изучать C. А значит у многих есть возможность сравнить свой подход с тем, как это делают суровые бородатые дядьки из GNU. О практическом применении yes немного написано в Википедии.

Исходный код

Переходим к исходному коду. Достать его можно либо с помощью apt-get source и получить версию, которая используется в вашей системе по-умолчанию, либо вытянуть новейшую версию из репозиториев. Мы выберем второй вариант: он более удобен и привычен.

  1. Coreutils: git clone git://git.sv.gnu.org/coreutils
  2. Gnulib (заглянем туда пару раз): git clone git://git.savannah.gnu.org/gnulib.git

Исходный код yes умещается в одном файле coreutils/src/yes.c , его и откроем.

Coding style

Первое, на что обращаешь внимание — непривычное форматирование кода. Почитать о нём можно в соответствующей главе GNU Coding Standarts. Например, при определении функции тип возвращаемого значения должен располагаться на отдельной строке, как и открывающая скобка:

Для отступов и выравнивания используются только пробелы. Между различными уровнями вложенности разница в отступе составляет 2 пробела. Особо извращённую форму имеют фигурные скобки при операторах:

12 строк

yes.c начинается с обязательного для всех GPL-програм комментария. Он уже успел намозолить мне глаза в других программах и необходимость его наличия была для меня загадкой. Оказывается, что текст этого комментария зафиксирован в инструкции по применению GPL. Именно в ней прописано, что все, кто желает выпускать своё ПО под GPL, должны добавлять эти 12 строк заявления о праве копирования в начало каждого файла исходного кода.

initialize_main

Первое, что делает программа, это вызов initialize_main . Эта функция предназначена для того, чтобы программа выпонила свои специфичные действия над аргументами. На практике, в Coreutils нет ни одной утилиты, которая бы использовала эту функцию для чего-то полезного. Везде используется заглушка, представленная в файле coreutils/src/system.h :

Название программы

В утилитах Coreutils различают два названия программы:

  1. Официальное название, которое пользователь не может изменить.
  2. Реальное название исполняемого файла.

Официальное название используется при выводе информации о версии приложения:

Причём это название никак не зависит от имени исполняемого файла:

Такое поведение обеспечивается специально определённым в начале файла макросом PROGRAM_NAME :

Реальное название без всяких хитростей берётся из argv[0] и используется при выводе ошибок и подсказок:

Значение argv[0] помещается в глобальную переменную program_name с помощью вызова функции set_program_name во второй строке main :

Функция set_program_name предоставляется библиотекой Gnulib. Соответствующий код находится в каталоге gnulib/lib/ , в файлах progname.h и progname.c . Интересно заметить, что set_program_name не просто сохраняет значения argv[0] в глобальную переменную program_name , объявленную в progname.h , но и выполняет дополнительные преобразования, связанные с тонкостями использования GNU Libtool, инструмента для разработки динамических библиотек.

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

Coreutils используют по всему миру, поэтому во всех утилитах предусмотрена возможность локализации. Причём эта возможность обеспечивается минимальными усилиями благодаря использованию пакета GNU gettext. Немногих удивит использование именно gettext, ведь этот пакет распространился далеко за пределы проекта GNU. Например, интернационализация в моём любимом web-фреймворке Django построена именно на gettext. Про использование gettext совместно с различными языками и фреймворками уже писали на хабре.

Замечательным свойством gettext является то, что он во всех языках используется примерно одинаково, и C не исключение. Здесь есть стандартная магическая функция _ , использование которой можно найти в функции usage :

Определение функции _ находится в уже знакомом нам файле system.h :

Инициализация механизма интернационализации в Coreutils производится вызовом трёх функций в main :

  • setlocale устанавливает стандартную локаль окружения в качестве рабочей для приложения
  • bindtextdomain говорит, где искать файл с переводами для конкретного домена сообщений
  • textdomain устанавливает текущий домен сообщений

Обработка ошибок

Двигаясь дальше по коду main , мы встречаем такую строку:

Интуитивно можно подумать, что в функции close_stdout закрывается стандартный поток вывода, что исключает потерю данных, если мы подменили stdout каким-нибудь файловым дескриптором и используем буферизированный вывод. Но найти исходный код этой функции и понять, что же на самом деле там происходит, выполняются ли какие-нибудь дополнительные действия по подчистке ресурсов, у меня не получилось.

Аргументы командной строки

Это последний вопрос, который не касается работы самой программы. Здесь, как и в случае с интернационализацией, используется проверенное временем и пролезшее во многие проекты (например, в Python) решение — модуль getopt. Этот модуль очень прост: фактически, от разработчика требуется вызывать в цикле одну из функций getopt или getopt_long . Подробнее о getopt можно почитать в интернете, да и на хабре о нём тоже писали.

В Gnulib есть специальная функция parse_long_options для обработки аргументов —version и —help , которые любое GNU-приложение обязано поддерживать. Находится она в файле gnulib/lib/long-options.c и использует getopt_long в своей работе.

Исходный код yes является классным примером работы с getopt. Тут одновременно отсутствует излишняя для обучения сложность с разбором десятков аргументов и присутствует использование всех средств getopt. Сначала, естественно, выполняется вызов parse_long_options . Затем проверяется, что больше никаких опций-ключей не передано и остальные аргументы, если они есть, являются просто произвольными строками:

Следующий код можно перевести на русский так: «Если в списке аргументов командой строки ничего кроме ключей —version и —help не было, то мы будем выводить „y“ в stdout»:

Запись в argv[argc] не является ошибкой: стандарт ANSI C требует, чтобы элемент argv[argc] был нулевым указателем.

Главный цикл

Ну вот мы и добрались до самого функционала программы. Вот он весь, как есть:

Здесь можно отметить, что все действия выполняются внутри условия if , а не в его теле. Значит, Кёрниган и Ритчи не врали, когда писали, что опытный C-программист реализует копирование строк так:

SYNOPSIS

This method also allows you to use unsupported file formats, so long as you can parse them into the above format.

Use XMLHttpRequest (actually, SJAX — syncronous) to load an external resource.

Supported external formats are:

(see GNU Gettext’s xgettext)

Machine Object (compiled .po) (.mo)

NOTE: .mo format isn’t actually supported just yet, but support is planned.

(see GNU Gettext’s msgfmt)

METHODS

The following methods are implemented:

new Gettext (args)

Several methods of loading locale data are included. You may specify a plugin or alternative method of loading data by passing the data in as the «locale_data» option. For example:

The above can also be used if locale data is specified in a statically included tag. Just specify the variable name in the call to new. Ex:

Finally, you may load the locale data by referencing it in a

  • tag. Simply exclude the ‘locale_data’ option, and all
  • items will be tried. The
  • should be specified as:

    The Gettext domain, not www.whatev.com. It’s usually your applications basename. If the .po file was «myapp.po», this would be «myapp».

    Raw locale data (in json structure). If specified, from_link data will be ignored.

    textdomain( domain )

    Set domain for future gettext() calls

    A message domain is a set of translatable msgid messages. Usually, every software package has its own message domain. The domain name is used to determine the message catalog where a translation is looked up; it must be a non-empty string.

    The current message domain is used by the gettext, ngettext, pgettext, npgettext functions, and by the dgettext, dcgettext, dngettext, dcngettext, dpgettext, dcpgettext, dnpgettext and dcnpgettext functions when called with a NULL domainname argument.

    If domainname is not NULL, the current message domain is set to domainname.

    If domainname is undefined, null, or empty string, the function returns the current message domain.

    If successful, the textdomain function returns the current message domain, after possibly changing it. (ie. if you set a new domain, the value returned will NOT be the previous domain).

    gettext( MSGID )

    Returns the translation for MSGID. Example:

    If no translation can be found, the unmodified MSGID is returned, i. e. the function can never fail, and will never mess up your original message.

    One common mistake is to interpolate a variable into the string like this:

    The interpolation will happen before it’s passed to gettext, and it’s unlikely you’ll have a translation for every «Hello Tom» and «Hello Dick» and «Hellow Harry» that may arise.

    Use strargs() (see below) to solve this problem:

    This is espeically useful when multiple replacements are needed, as they may not appear in the same order within the translation. As an English to French example:

    (The example is stupid because neither color nor thing will get translated here . ).

    dgettext( TEXTDOMAIN, MSGID )

    Like gettext() , but retrieves the message for the specified TEXTDOMAIN instead of the default domain. In case you wonder what a textdomain is, see above section on the textdomain() call.

    dcgettext( TEXTDOMAIN, MSGID, CATEGORY )

    Like dgettext() but retrieves the message from the specified CATEGORY instead of the default category LC_MESSAGES .

    NOTE: the categories are really useless in javascript context. This is here for GNU Gettext API compatability. In practice, you’ll never need to use this. This applies to all the calls including the CATEGORY.

    ngettext( MSGID, MSGID_PLURAL, COUNT )

    Retrieves the correct translation for COUNT items. In legacy software you will often find something like:

    NOTE: javascript lacks a builtin printf, so the above isn’t a working example

    The first example looks awkward, the second will only work in English and languages with similar plural rules. Before ngettext() was introduced, the best practice for internationalized programs was:

    This is a nuisance for the programmer and often still not sufficient for an adequate translation. Many languages have completely different ideas on numerals. Some (French, Italian, . ) treat 0 and 1 alike, others make no distinction at all (Japanese, Korean, Chinese, . ), others have two or more plural forms (Russian, Latvian, Czech, Polish, . ). The solution is:

    In English, or if no translation can be found, the first argument (MSGID) is picked if count is one, the second one otherwise. For other languages, the correct plural form (of 1, 2, 3, 4, . ) is automatically picked, too. You don’t have to know anything about the plural rules in the target language, ngettext() will take care of that.

    This is most of the time sufficient but you will have to prove your creativity in cases like

    That said, javascript lacks printf() support. Supplied with Gettext.js is the strargs() method, which can be used for these cases:

    NOTE: the variable replacement isn’t done for you, so you must do it yourself as in the above.

    dngettext( TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT )

    Like ngettext() but retrieves the translation from the specified textdomain instead of the default domain.

    dcngettext( TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT, CATEGORY )

    Like dngettext() but retrieves the translation from the specified category, instead of the default category LC_MESSAGES .

    pgettext( MSGCTXT, MSGID )

    Returns the translation of MSGID, given the context of MSGCTXT.

    Both items are used as a unique key into the message catalog.

    This allows the translator to have two entries for words that may translate to different foreign words based on their context. For example, the word «View» may be a noun or a verb, which may be used in a menu as File->View or View->Source.

    The above will both lookup different entries in the message catalog.

    In English, or if no translation can be found, the second argument (MSGID) is returned.

    dpgettext( TEXTDOMAIN, MSGCTXT, MSGID )

    Like pgettext() , but retrieves the message for the specified TEXTDOMAIN instead of the default domain.

    dcpgettext( TEXTDOMAIN, MSGCTXT, MSGID, CATEGORY )

    Like dpgettext() but retrieves the message from the specified CATEGORY instead of the default category LC_MESSAGES .

    npgettext( MSGCTXT, MSGID, MSGID_PLURAL, COUNT )

    Like ngettext() with the addition of context as in pgettext() .

    In English, or if no translation can be found, the second argument (MSGID) is picked if COUNT is one, the third one otherwise.

    dnpgettext( TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT )

    Like npgettext() but retrieves the translation from the specified textdomain instead of the default domain.

    dcnpgettext( TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT, CATEGORY )

    Like dnpgettext() but retrieves the translation from the specified category, instead of the default category LC_MESSAGES .

    strargs (string, argument_array)

    This is a utility method to provide some way to support positional parameters within a string, as javascript lacks a printf() method.

    The format is similar to printf() , but greatly simplified (ie. fewer features).

    Any percent signs followed by numbers are replaced with the corrosponding item from the argument_array.

    The format numbers are 1 based, so the first itme is %1.

    A lone percent sign may be escaped by preceeding it with another percent sign.

    A percent sign followed by anything other than a number or another percent sign will be passed through as is.

    Some more examples should clear up any abmiguity. The following were called with the orig string, and the array as Array(«[one]», «[two]») :

    This is especially useful when using plurals, as the string will nearly always contain the number.

    It’s also useful in translated strings where the translator may have needed to move the position of the parameters.

    NOTE: this may be called as an instance method, or as a class method.

    NOTES

    These are some notes on the internals

    Loaded locale data is currently cached class-wide. This means that if two scripts are both using Gettext.js, and both share the same gettext domain, that domain will only be loaded once. This will allow you to grab a new object many times from different places, utilize the same domain, and share a single translation file. The downside is that a domain won’t be RE-loaded if a new object is instantiated on a domain that had already been instantiated.

    BUGS / TODO

    Currently, there are several places that throw errors. In GNU Gettext, there are no fatal errors, which allows text to still be displayed regardless of how broken the environment becomes. We should evaluate and determine where we want to stand on that issue.

    Currently, fetching language data is done purely syncronous, which means the page will halt while those files are fetched/loaded.

    This is often what you want, as then following translation requests will actually be translated. However, if all your calls are done dynamically (ie. error handling only or something), loading in the background may be more adventagous.

    It’s still recommended to use the statically defined method, which should have the same delay, but it will cache the result.

    domain support while using shortcut methods like _(‘string’) or i18n(‘string’) .

    Under normal apps, the domain is usually set globally to the app, and a single language file is used. Under javascript, you may have multiple libraries or applications needing translation support, but the namespace is essentially global.

    It’s recommended that your app initialize it’s own shortcut with it’s own domain. (See examples/wrapper/i18n.js for an example.)

    Basically, you’ll want to accomplish something like this:

    If you use this raw Gettext object, then this is all handled for you, as you have your own object then, and will be calling myGettextObject.gettext(‘string’) and such.

    May want to add encoding/reencoding stuff. See GNU iconv, or the perl module Locale::Recode from libintl-perl.

    COMPATABILITY

    This has been tested on the following browsers. It may work on others, but these are all those to which I have access.

    REQUIRES

    bin/po2json requires perl, and the perl modules Locale::PO and JSON.

    SEE ALSO

    bin/po2json (included), examples/normal/index.html, examples/wrapper/i18n.html, examples/wrapper/i18n.js, Locale::gettext_pp(3pm), POSIX(3pm) , gettext(1) , gettext(3)

    AUTHOR

    Copyright (C) 2008, Joshua I. Miller , all rights reserved. See the source code for details.

    Илон Маск рекомендует:  Direct draw термины и концепции интерфейсы directdraw и directdraw2
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL
  • Предупреждение!
    05.03.2020, 22:30

    Регулярные выражения. Как вот такой код с php перевести на Delphi!?
    $file = preg_match_all(«|

    (.*)