Campos con formato en las cadenas de idioma

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:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎русский

En ocasiones es necesario incluir campos con un formato especial dentro de una cadena a traducir. Esto habitualmente ocurre cuando hay números implicados pero puede ocurrir con fechas y horas o cuando se requieren instrucciones de formato específicas. Si las cadenas no van a ser traducidas, pueden usarse las funciones estándar de PHP printf o sprintf. La función printf muestra una cadena formateada usando instrucciones incluidas; la función sprintf devuelve una cadena formateada utilizando las mismas instrucciones de formateo incluidas.

La clase JText proporciona métodos de contenedor para las funciones printf y sprintf permitiendo texto estático para ser traducidos, además también permite campos formateados para ser incorporado utilizando la misma sintaxis que las funciones de PHP.

Por ejemplo, suponga que tiene la cadena "Donations of 12.45 GBP have been received", donde la cantidad proviene de una variable, $donations. Se podría dividir la cadena en dos como estas:

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

con cadenas de definición de idiomas

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

pero esto no funciona bien en los idiomas donde los datos insertados no están en un lugar similar en la cadena traducida. En su lugar utilice el método de "sprintf" de esta forma

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

con cadena de definición de idioma

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

Se puede incluir más de un especificador de formato en una cadena de traducción. Las sustituciones se realizan en orden, de manera que esto funcionara como se espera

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

con cadena de definición de idioma

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

Sintaxis de los especificadores de formato

El especificador de formato consta de un signo de porcentaje (%), seguido por uno o más de estos elementos, en orden:

Orden
Tipo Valores
Descripción
1.
Símbolo + ó - Opcional. Fuerza un símbolo (+ ó -) en un número. De forma predeterminada sólo se utiliza el símbolo - en un número si es negativo. Este especificador fuerza que los números positivos tengan el símbolo + también.
2.
Relleno <space>

o 0

or '<char>

Opcional. Carácter que se utilizará para el relleno de los resultados para el correcto tamaño de la cadena. Puede ser un carácter de espacio o un 0 (número cero). El valor predeterminado es para rellenar con espacios en blanco. Una alternativa de relleno de caracteres puede ser especificado por el prefijo con una comilla simple ( ' ).
3.
Alineación <null> or - Opcional. Determina si el resultado debe ser justificado a la izquierda o justificado a la derecha. El valor predeterminado es justificado a la derecha; un carácter - aquí indica justificado a la izquierda.
4.
Ancho Número Opcional. Número de caracteres (como mínimo) que deben resultar de la conversión.
5.
Precisión Número Opcional. Número de dígitos decimales que se deben mostrar para los números de punto flotante. Cuando se utiliza este especificador en una cadena, actúa como punto de corte, estableciendo un límite máximo de caracteres de la cadena.
6.
Tipo Obligatorio. El tipo de los datos argumento. Los tipos posibles son:
%
Un carácter de porcentaje literal. No requiere argumento
b
El argumento se trata como un entero y se presenta como un número binario.
c
El argumento es tratado como un entero y presentado como el carácter del valor ASCII.
d
El argumento es tratado como un entero y presentado como un número decimal con signo.
e
El argumento es tratado como notación científica (por ejemplo, 1.2 e+2). El especificador de precisión es el número de dígitos después del punto decimal desde PHP 5.2.1. En versiones anteriores, se tomaba como el número de dígitos significativos (menos uno).
u
El argumento es tratado como un entero y presentado como un número decimal sin signo.
f
El argumento es tratado como un float, y presentado como un número de punto flotante (considera la configuración local).
F
El argumento es tratado como un float, y presentado como un número de punto flotante (no considera la configuración local).
o
El argumento es tratado como un entero y presentado como un número octal.
s
El argumento de que se trata y se presenta como una cadena.
x
El argumento es tratado como un entero y presentado como un número hexadecimal (en minúsculas).
X
El argumento es tratado como un entero y presentado como un número hexadecimal (en mayúsculas).

Intercambio de argumento del formato

La cadena de formato admite el argumento de numeración e incluso de intercambio. Esto es útil cuando dos o más elementos de datos deben ser integrados en una cadena, pero las diferencias en la estructura de la lengua significa que el orden de uso de los elementos de datos no es el mismo.

Por ejemplo, supongamos que tenemos el siguiente código:

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

con esta traducción de la cadena de idioma

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

Entonces si

$number = 3
$location = 'hat'

esto resultará en "Hay 3 bolas en el sombrero". Pero considere si quiere cambiar la traducción a

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

Este sería ahora la salida de "El 3 contiene sombrero bolas", que es claramente absurdo. En lugar de cambiar el código, se puede indicar en la cadena de traducción la posición de referencia del argumento de cada uno de los marcadores. Cambiar la traducción a

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

Y el resultado será ahora "El sombrero contiene 3 pelotas" tal y como esperábamos.

Una ventaja añadida de poder numerar los argumentos es que puede repetir los contenedores sin añadir más argumentos al código. For ejemplo, cmabie la traducción a

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

Y esto mostrará "El sombrero contiene 3 pelotas, por lo que hay 3 pelotas en el sombrero".