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

From Joomla! Documentation

This page is a translated version of the page Formatted fields in language translation strings and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎Nederlands • ‎русский

Иногда в переводимую строчку необходимо включить отформатированные по-особенному поля. Это обычно происходит когда в работу включаются номера, но может случиться и с датами и временем, когда требуются точные инструкции по форматированию. Если конкретные строчки не будут переводиться, то могут быть использованы стандартные функции РНР "printf" и " sprintf". Функция "printf" выдает строчку отформатированную с использованием вставляемых инструкций по форматированию; функция "sprintf" возвращает строчку, отформатированную с использованием тех же самых инструкций по форматированию.

Метод JText предоставляет методы wrapper для функций "printf" и "sprintf", позволяя перевод статичных текстов, а также позволяя в то же самое время вставку отформатированных с использованием одного и того же с функциями РНР синтаксиса полей.

Например, допустим что у Вас имеется строка "Donations of 12.45 GBP have been received”, где сумма поступает от некоторой переменной, допустим "$donations". Вы могли бы разделить эту строчку на две [части] следующим образом:

JText::_( 'Donations of' ) .  $donations GBP  . JText::_( 'have been received' )

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

DONATIONS OF=Donations of
HAVE BEEN RECEIVED=have been received

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

JText::sprintf( 'Donations have been received', $donations )

со строкой языкового перевода

DONATIONS HAVE BEEN RECEIVED=Donations of %.2f GBP have been received

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

JText::sprintf( 'String with numbers in it', $num1, $num2, $num3 )

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

STRING WITH NUMBERS IN IT=First %d, second %d, third %d

Синтаксис спецификаторов форматирования

Спецификатор форматирования состоит из знака процента ("%"), за которым идут один или более этих элементов, в порядке:

Порядок
Тип Значения
Описание
1.
Знак + или - На выбор, т.е. не обязательно. Принуждает использование с числом какого-либо знака (+ или -). Если число отрицательно, то по умолчанию используется знак -. Этот спецификатор также принуждает положительные числа присоединять знак +.
2.
Паддинг <space>

или 0

или '<char>

На Ваш выбор, т.е. не обязательно. Знаки для создания пробелов по обе стороны результатов правильно переведенной строки. Этим знаком может быть знак пробела или "0" (знак нуля). По умолчанию применяется знак пробела. Какой-либо дополнительный знак для создания пробела может быть создан приставкой к нему знака единичной кавычки ().
3.
Выравнивание <null> или - На Ваш выбор, т.е. совсем не обязательно. Определяет располагать ли результаты слева или справа. По умолчанию они располагаются справа; знак "-" здесь расположит [результаты] справа.
4.
Ширина Число На Ваш выбор, т.е. совсем не обязательно. Число знаков (минимальное), которое должно получиться в результате конвертирования.
5.
Точность Число На Ваш выбор, т.е. совсем не обязательно. Число десятичных знаков, которые должны быть показаны после точки для десятичных чисел. При использовании этого спецификатора в какой-либо строчке, он работает как ограничитель, настраивая лимит максимального числа знаков [языковой] строчки.
6.
Тип Обязательно. Тип данных аргумента. Возможные типы:
%
Буквальный знак процента. Никаких аргументов не требуется
b
Этот аргумент трактуется как [данные по типу] "integer" и выводится как бинарное число.
c
Этот аргумент трактуется как [данные по типу] "integer" и выводится в виде знака в ASCII.
d
Этот аргумент трактуется как [данные по типу] "integer" и выводится как десятичное число.
e
Этот аргумент трактуется как научная нотация (например, как 1.2e+2). Начиная с РНР 5.2.1, этот спецификатор точности означает число десятичных знаков после точки. В более ранних версиях [РНР] им считалось число значимых цифр (на одну меньше).
u
Этот аргумент трактуется как "integer" и выдается как неназначенное десятичное число.
f
Этот аргумент трактуется как "float" и выдается в виде числа со сдвигающейся точкой (понимающего язык).
F
Этот аргумент принимается как "float" и выдается как число со сдвигающейся точкой (не понимающего язык).
o
Этот аргумент трактуется как [данные по типу] "integer" и выводится как восьмеричное число.
s
Этот аргумент трактуется и выдается как какая-либо строчка.
x
Этот аргумент трактуется как "integer" и выдается как какое-либо восьмеричное числов (прописными буквами).
X
Этот аргумент трактуется как "integer" и выдается как некоторое восьмиричное число (в верхнем регистре).

Подмена формата аргумента

Формат строчек поддерживается нумерацию аргументов и даже [их] подмену. Это пригодно где в какую-либо строку необходимо вставить два или более объекта данных но различия в языковой структуре означают, что порядок использования этих объектов данных не будет тем же самым.

Например, допустим, что у нас есть следующий код:

echo JText::sprintf( 'Balls in the bucket', $number, $location );

где языковая строка перевода

BALLS IN THE BUCKET=There are %d balls in the %s

Тогда если

$number = 3
$location = 'hat'

выводом будет “There are 3 balls in the hat”. Но представьте себе, что Вы захотели изменить этот перевод на

BALLS IN THE BUCKET=The %s contains %d balls

То это выдаст “The 3 contains hat balls”, что явно является абсурдом. Вместо изменения этого кода, Вы можете указать этой языковой строчке на какой аргумент ссылается каждый заполнитель. Измените этот перевод на

BALLS IN THE BUCKET=The %2$s contains %1$d balls

и этот вывод становится “The hat contains 3 balls”, как и ожидалось.

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

BALLS IN THE BUCKET=The %2$s contains %1$d balls, so there are %1$d balls in the %2$s

и получите правильный вывод “The hat contains 3 balls, so there are 3 balls in the hat”.