--=REKLAMA=--

Tłumaczenie szablonu/Formatowanie pól w napisach do tłumaczenia

Z Joomla!WikiPL

Niekiedy konieczne jest umieszczenie wewnątrz tłumaczonego napisu specjalnie sformatowanego pola (elementu). Zdarza się to zwykle wówczas, gdy dodawane są (włączane są) jakieś liczby, ale także oznaczenia czasu, daty, a także specjalne instrukcje formatujące. Gdyby napisy nie miały być tłumaczone, wystarczyłoby zastosowanie standardowej funkcji PHP printf lub sprintf. Funkcja printf zwraca napis sformatowany zgodnie z podanym zbiorem reguł określonych argumentem w postaci napisu formatującego. Podobnie funkcja sprintf zwraca napis powstały w wyniku sformatowania łańcucha znaków zgodnie z regułami formatującymi.

Klasa JText umożliwia zastosowanie funkcji dla printf i sprintf pozwalających formatować tłumaczone teksty za pomocą tej samej składni, co funkcje PHP

Na przykład, przyjmijmy że masz napis “Donations of 12.45 GBP have been received” („Nadeszła darowizna wysokości 12.45 GBP”), w którym wysokość darowizny pochodzi ze zmiennej $donations. Można by podzielić napis na dwie części, jak poniżej:

JText::_( 'DONATIONS_OF' ) .$donations GBP “ . JText::_( 'HAVE_BEEN_RECEIVED' )

a w plikach językowych umieścić definicje napisów:

DONATIONS_OF="Donations of"
HAVE_BEEN_RECEIVED="have been received"
 
# w polskim pliku językowym np.
DONATIONS_OF="Darowiznę w wysokości"
HAVE_BEEN_RECEIVED="otrzymano."

Ale nie jest to dobre rozwiązanie w przypadku języków, których składnia wymaga określonego szyku wyrazów, jak na przykład w języku polskim. Zamiast powyższego rozwiązania można skorzystać z funkcji sprintf, jak poniżej:

JText::sprintf( 'DONATIONS_HAVE_BEEN_RECEIVED', $donations )

a w plikach językowych umieścić definicje:

DONATIONS_HAVE_BEEN_RECEIVED="Donations of %.2f GBP have been received"
 
# w polskim pliku językowym
DONATIONS_HAVE_BEEN_RECEIVED="Nadeszła darowizna wysokości %.2f GBP"

W napisie do przetłumaczenia można umieścić więcej niż jedną dyrektywę formatującą. Podstawienie następuje zgodnie z podaną kolejnością

JText::sprintf( 'STRING_WITH_NUMBERS_IN_IT', $num1, $num2, $num3 )

z definicją napisu w plikach językowych:

STRING_WITH_NUMBERS_IN_IT="First %d, second %d, third %d"
 
# w polskim pliku językowym
STRING_WITH_NUMBERS_IN_IT="Pierwszy %d, drugi %d, trzeci %d"

Składnia wyznaczników formatowania

Każdy wyznacznik formatowania rozpoczyna się od znaku procenta (%) i może zawierać jedną lub więcej z pięciu poniższych dyrektyw z zachowaniem - gdy elementów jest więcej - podanej kolejności:

Kolejność
Typ Wartość
Opis
1.
Znak + lub - Wymusza znak (+ lub -) zastosowany z liczbą. Domyślnie tylko znak minus jest stosowany na oznaczenie liczb ujemnych. Aby wymusić umieszczenie oznaczenie liczby dodatniej można umieścić znak +.
2.
Dopełnienie <spacje>

lub 0

albo '<znak>

Opcjonalny określnik dopełnienia - znak dopełniający wynik do odpowiedniej długości. Można podać znaki spacji albo 0 albo jakikolwiek inny znak poprzedzony pojedynczym cudzysłowem ('). Domyślnie jako dopełnienie stosowane są spacje.
3.
Wyrównanie <nic> albo -

Opcjonalny znak wyrównania. Domyślnie dane są wyrównywane do prawej. Znak minusa (-) wymusza wyrównanie do lewej.

4.
Szerokość Liczba Opcjonalna minimalna ilość znaków, jaką powinien zawierać element - rezultat tego przekształcenia.
5.
Precyzja .Liczba Opcjonalne określenie precyzji - ilości cyfr dziesiętnych w liczbach zmiennoprzecinkowych. Dla innych liczb niż zmiennoprzecinkowe - ignorowany.
6.
Typ Wymagane. Informuje funkcje printf i sprintf o typie przekazywanych do nich danych. Możliwe są następujące typy:
%
Znak procenta. Oznacza, że nie jest konieczne podawanie żadnego argumentu.
b
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie wyświetlona w postaci binarnej.
c
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie przedstawiona w postaci znaku o takim kodzie ASCII.
d
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie przedstawiona jako liczba dziesiętna.
e
Argument będzie traktowany jako liczba zmiennoprzecinkowa, a jego wartość zostanie przedstawiona w zapisie naukowym (np. 1.2e+2). The precision specifier stands for the number of digits after the decimal point since PHP 5.2.1. In earlier versions, it was taken as the number of significant digits (one less).
u
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie przedstawiona bez znaku w formacie dziesiętnym.
f
Argument będzie traktowany jako liczba zmiennoprzecinkowa o podwójnej precyzji (typ double), a jego wartość zostanie przedstawiona jako liczba zmiennoprzecinkowa (z automatyczną konwersją - przecinek lub kropka).
F
Argument będzie traktowany jako liczba zmiennoprzecinkowa o podwójnej precyzji (typ double), a jego wartość zostanie przedstawiona jako liczba zmiennoprzecinkowa (bez automatycznej konwersji).
o
Argument będzie traktowany jako liczba ), a jego wartość zostanie przedstawiona jako liczba ósemkowa.
s
Argument będzie traktowany jako napis (łańcuch znaków) i zostanie przedstawiony jako napis.
x
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie przedstawiona jako liczba szesnastkowa (małymi literami).
X
Argument będzie traktowany jako liczba całkowita, a jego wartość zostanie przedstawiona jako liczba szesnastkowa (wielkimi literami).

Format argument swapping

Format napisów obsługuje argumenty liczbowe oraz even swapping. To jest przydatne, gdy dwa lub więcej elementów danych musi być wstawione w napisie, ale różna składnia języków powoduje, że nie można zastosować takiej samej kolejności argumentów.

Przykładowo, weźmy następujący kod:

echo JText::sprintf( 'BALLS_IN_THE_BUCKET', $number, $location );

z definicjami napisów w plikach językowych:

BALLS_IN_THE_BUCKET="There are %d balls in the %s"
 
# w polskim pliku językowym np.
BALLS_IN_THE_BUCKET="Mamy %d piłki w %s"

Wtedy, jeżeli

$number = 3
$location = 'hat' // hat=kapelusz

to otrzymamy na wyjściu napis brzmiący tak: “Mamy 3 piłki w kapelusz”. Ale zobaczmy, co się stanie, gdy zmienimy tłumaczenie na:

BALLS_IN_THE_BUCKET="The %s contains %d balls"
 
# w polskim pliku językowym np.
BALLS_IN_THE_BUCKET="%s zawiera %d piłki"

Teraz w efekcie otrzymalibyśmy napis "3 zawiera kapelusz piłki", co jest oczywistym nonsensem. Raczej gdy zmienisz kod, możesz wskazywać w tłumaczeniu napisu, który argument do którego wypełniacza się odnosi. Zmień tłumaczenie na

BALLS_IN_THE_BUCKET="The %2$s contains %1$d balls"

i otrzymujemy wyjście "Kapelusz zawiera 3 piłki" zgodnie z oczekiwaniem.

Dodatkową korzyścią możliwości numerowania argumentów jest możliwość powtórzenia znaków wypełniacza, dodając więcej argumentów w kodzie. Na przykład zmieńmy tłumaczenie na

BALLS_IN_THE_BUCKET="The %2$s contains %1$d balls, so there are %1$d balls in the %2$s"
 
# w polskim pliku językowym np.
BALLS_IN_THE_BUCKET="%2$s zawiera %1$d piłki, tak jak %1$d piłki są w %2$s"

co da poprawne zdanie "Kapelusz zawiera 3 piłki, tak jak 3 piłki są w kapeluszu"

Dziękujemy za wkład

» Stefan Wajda [zwiastun],