Qual è il punto sulla sintassi di gettext?


9

Finora ho gestito alcune traduzioni in Wordpress e ho provato a leggere la documentazione ufficiale di gettext ma non riuscirò a capire una cosa forse semplice: quali sono le differenze tra questi inizi come __ (, _e (, ecc.? E persino di più: quali altri ci sono accanto? Grazie in anticipo!

Franco


Grazie a tutti per le vostre elaborate risposte! Lo apprezzo molto qui!
Circuit Circus,

... Forse un'ulteriore domanda a questo: può essere esclusa la voce del dominio di testo? Ho iniziato a portarlo su ogni stringa che volevo tradurre, ma poi ho riconosciuto alcuni esempi nel codice Wordpress che non lo contengono affatto ...
Circus Circus

... Okay, ora l'ho trovato in questa pagina di codice - scusa per questa domanda ridondante :-)
Circuit Circus

Risposte:


13

__(doppio trattino basso) è la funzione di traduzione di base. Traduce una stringa e la restituisce come stringa.

_efa lo stesso di __, ma fa eco immediatamente al risultato.

_xè la funzione di traduzione contestuale. Ha una seconda opzione per fornire un contesto alle persone che fanno la traduzione.

_exè lo stesso di _x, ma l'eco è il risultato.

Esempio di utilizzo _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

A volte la stessa stringa può essere diversa in altre lingue. Fornire un contesto ai traduttori può aiutarli a scegliere le parole giuste.

Funzioni di scelta rapida:

  • esc_attr__: Equivalente a __ma esegue anche il risultato esc_attr.
  • esc_html__: Equivalente a __ma esegue anche il risultato esc_html.
  • esc_attr_e: Equivalente a _ema esegue anche il risultato esc_attr.
  • esc_html_e: Equivalente a _ema esegue anche il risultato esc_html.
  • esc_attr_x: Equivalente a _xma esegue anche il risultato esc_attr.
  • esc_html_x: Equivalente a _xma esegue anche il risultato esc_html.

_nè il gestore della pluralizzazione. Esempio:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

In questo esempio, ci sono due modi per dire il numero di tacos, a seconda che sia singolare o meno. Il primo utilizzo di $ number indica alla _nfunzione quale versione utilizzare. Il secondo uso di $ number si verifica nello sprintf, per sostituire% d con il numero effettivo nella stringa.

Non esiste una funzione eco equivalente per _n, ma esiste una funzione denominata _nx. È una combinazione di _ne _x. Pluralizzazione e contesto.

_n_noopè speciale. È usato per tradurre stringhe pluralizzate, ma in realtà non esegue immediatamente la traduzione. Ciò è utile se si desidera rendere le stringhe centralizzate ma in realtà svolgere il lavoro altrove. La funzione che svolge effettivamente il lavoro altrove è translate_nooped_plural.

Esempio:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Questo non è molto usato, ma può essere utile per l'organizzazione. Se metti tutte le tue stringhe in un file, ad esempio, poi le fai riferimento altrove, questo non sarebbe possibile solo con _n, hai bisogno di qualcosa del genere _n_noopper farlo.

_nx_noopè lo stesso di _n_noop, ma può anche prendere un contesto per i traduttori, lo stesso di _x.

Si noti che è possibile inserire il dominio nella chiamata della funzione noop o nella chiamata della funzione translate_nooped_plural. Qualunque abbia più senso per la tua organizzazione. Se entrambi hanno un dominio, vince quello passato alla chiamata noop.

number_format_i18nè l'equivalente del numero_formato incorporato di PHP , ma aggiunge la gestione di cose come i decimali e così via, che sono diversi in altre impostazioni locali.

date_i18nè l'equivalente della data incorporata di PHP , con tutta la gestione pertinente anche lì. Nomi dei mesi, nomi dei giorni, ecc.

Inoltre, non infrangere mai le leggi . Solo un promemoria. :)


Caspita, questa è davvero una buona spiegazione! Grazie mille per l'aiuto! Ora vedo chiaro.
Circuit Circus,

6

__ (), _e () e _x (), _ex ()

__()e _e()sono essenzialmente entrambi un involucro di translate()(non usare direttamente) e quasi lo stesso.

La differenza sta nel fatto che __()restituisce la stringa tradotta e la fa _e()eco. Entrambi devono ricevere una stringa come parametro richiesto e di solito, sebbene facoltativo, anche un dominio di testo.

Analogamente, c'è _x()e _ex(), che consente di specificare un contesto in grado di descrivere dove appare la stringa. Se il tuo progetto include più di alcune decine di stringhe traducibili, l'uso del contesto ha molto senso.

Si noti inoltre l'esistenza di _n()e _nx()per i plurali.

Esempio di utilizzo comune

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

parametri

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Tutti i parametri ma $numbersono stringhe. Tutti, ma $domainsono richiesti.

Ulteriore flessibilità con variabili e sprintf ()

Se le tue stringhe conterranno numeri o parole variabili, usa sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Risorse addizionali

Alcune risorse aggiuntive per l'imminente WordPress I18n Ninja:


Controlla anche "Localizzazione" in "Varie" nel codice per una suddivisione completa delle funzioni e spiegazioni dettagliate.
TheDeadMedic


@Johannes Pille: non ho notato la tua risposta fino a quando non ho pubblicato la mia, devo cancellare il mio post?
Jeremy Jared il

@JeremyJared No, perché? Ulteriori informazioni non possono essere una brutta cosa, vero ?! Penso che la tua risposta sia ben ponderata. +1 da me.
Johannes Pille,

@TheDeadMedic Modificato in "risorse aggiuntive".
Johannes Pille,

3

Non sono un esperto di traduzioni, ma la Pagina del Codex di WordPress ha una buona documentazione e spiega il motivo per utilizzare ogni istanza.

Dalle pagine del codice:

__()

Viene utilizzato quando il messaggio viene passato come argomento a un'altra funzione; _e()è usato per scrivere il messaggio direttamente nella pagina. Maggiori dettagli su queste due funzioni:

__('message')

Cerca nel modulo di localizzazione la traduzione di "messaggio" e passa la traduzione all'istruzione return PHP. Se non viene trovata alcuna traduzione per "messaggio", restituisce semplicemente "messaggio".

_e('message')

Cerca nel modulo di localizzazione la traduzione di "messaggio" e passa la traduzione all'istruzione di eco PHP. Se non viene trovata alcuna traduzione per "messaggio", fa semplicemente eco a "messaggio".

Nota che se stai internazionalizzando un tema o un plugin, dovresti usare a "Text Domain" .

Il framework gettext si occupa della maggior parte di WordPress. Tuttavia, ci sono alcuni punti nella distribuzione di WordPress in cui gettext non può essere usato:

  • Il file README principale di WordPress: è un file HTML statico, non un file PHP, quindi non può essere eseguito tramite le funzioni gettext.
  • Alcuni messaggi di errore vengono generati molto presto nel ciclo di caricamento di WordPress, prima che venga caricato gettext.

Link alla pagina del codice

Ulteriori informazioni su quando gettext non funziona

Speriamo che risponda alla tua domanda, se non facci sapere e forse qualcun altro può aiutare o posso fare qualche ricerca in più.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.