Come rendere le stringhe dai modelli traducibili in tutte le pagine che appaiono?


14

Ho alcune chiamate a t()nei file * .tpl.php. Per esempio, diciamo che sto parlando di prodotti e file product.tpl.php.

Le stringhe nei modelli non vengono riconosciute fino alla prima volta in cui vengono effettivamente utilizzate. C'è stato un thread su Drupal.org a riguardo e l'ho trovato accurato. Purtroppo, se vado a, diciamo, http://example.com/pl/product/200 , allora quella stringa verrà salvata nella {locales_source}tabella con il locationcampo impostato su /pl/product/200.

Ho bisogno che i miei utenti siano in grado di tradurre utilizzando lo strumento di traduzione in loco del modulo client di localizzazione , in modo che possano effettivamente vedere ciò che stanno traducendo, disponendolo nel giusto contesto. Con la posizione di origine impostata su /pl/product/200, il prodotto con ID 200 è l'unico su cui viene mostrato che la stringa viene tradotta. E molto peggio, se potrei essere in grado di forzare gli utenti a tradurre su quel particolare prodotto, ho bisogno che anche loro siano in grado di tradurre in russo, e non esiste un prodotto con posizione impostata su /ru/product/PID.

C'è un modo per riformattare la stringa di posizione nel database, per rendere visibili tutte le stringhe su tutti i prodotti, tutte le lingue nello strumento l10n_client?

Ho provato a impostarlo su:

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (modulo che genera dati a tema)

Ma li ha resi invisibili solo per lo strumento di traduzione.

Sono abbastanza sicuro che non sia un bug nel client di localizzazione , mostra la stringa in cui è stata comunicata questa stringa. E sembra che sia "il modo in cui funziona" anche per il sistema di traduzione Drupal 7 - è stato già discusso e riportato e non è cambiato nulla. Quindi questa non è una segnalazione di bug, chiedo solo come lavorare con ciò su cui dobbiamo lavorare.


Sto parlando di testi che non hanno nulla a che fare con il modulo dati su cui opera. Non voglio tradurre prodotti, ma solo stringhe di modelli che non hanno nulla a che fare con il prodotto stesso, come Precedente - Successivo sul modello di galleria di immagini del prodotto.

Ad esempio, il modulo restituisce 15 anteprime ed è compito di un tema mostrarne 5 alla volta. E le esigenze alte gli titleattributi dei collegamenti precedenti / successivi . Tradotto. Ma il mio modulo non lo sa. E mai dovrebbe aver bisogno.


Non sono sicuro di aver compreso appieno ciò che desideri, ma sarebbe sufficiente eseguire la scansione del sito in tutte le lingue? Puoi usare ad es. xmlsitemap per generare i collegamenti in più lingue e quindi utilizzare wgeto altro. Hackish, ma hai detto che era permesso (:
Andy,

@Andy Localization Client consente agli utenti di aprire una barra nella parte inferiore di una pagina e tradurre i testi che appaiono direttamente su quella pagina, quando li vedono. Posso esportare tutti i testi, ma non è esattamente questo il punto.
Mołot,

1
Ricordo da drupal_set_message () e dpm (), che questi messaggi verranno messi in coda per la richiesta successiva, se chiamati ad es. Da page.tpl.php. Questo perché i modelli vengono generalmente elaborati abbastanza tardi in una richiesta, dopo l'elaborazione dei messaggi. Qualcosa di simile potrebbe essere il caso con t () e client di localizzazione.
donquixote,

Bella domanda Bel problema.
barista dilettante

Solo un suggerimento ... se desideri che i tuoi utenti siano in grado di tradurre le tue stringhe tpl t () in qualsiasi momento in qualsiasi lingua, puoi estrarre queste stringhe con l'estrattore di modelli di traduzione ( drupal.org/project/potx ) e dare loro il .po originale, che potrebbero tradurre con uno strumento come Poedit? ( poedit.net ). Mentre presenti queste stringhe come alcune statiche, il lavoro verrebbe svolto contemporaneamente da ciascun traduttore ...
Kojo

Risposte:


5

Il tuo requisito:
Affinché il mio sito funzioni in più lingue
come utente autenticato,
devo essere in grado di tradurre immediatamente tutte le chiamate di traduzione trovate nella base di codice del mio sito che sono state eseguite con la funzione t ().

La descrizione di tale requisito è persino vicina a ciò che stai chiedendo?


Crawlers

Come qualcuno ha detto, un crawler potrebbe teoricamente passare attraverso l'intero sito per forzare la registrazione di tutte le chiamate t (). Ma 1) il crawler non sa quali pagine eseguire la scansione; 2) non stiamo cercando di mantenere un elenco di pagine da scansionare, quindi; 3) non vogliamo usare un cingolato, punto. Eww. Solo, eww. Giusto?


Il problema

  1. Non abbiamo un elenco di tutte le stringhe di traduzione.
  2. Drupal / PHP è un linguaggio dinamico a differenza di C che viene compilato. Quindi non possiamo andare ad esempio: compilare l'intera base di codice, quindi trovarmi tutte le istanze di questa funzione t(), quindi registrare quelle istanze nel database, quindi tradurre tutte quelle istanze registrate t()in una volta sola. Non credo sia un'opzione che abbiamo sul nostro tavolo.
  3. Uno strumento di analisi del codice statico sarebbe impotente per lo stesso motivo per cui un crawler sarebbe impotente. Ho trovato questo t()in questo file. Grande! In quale URL è utilizzato? Qual è il contesto?

Attaccare il problema con gli strumenti attuali (Drupal e alcuni moduli contrib) e con i vincoli attuali (basandosi su chiamate a tema in tempo reale -> file modello -> t()chiamate), qui sembra un vicolo senza uscita. Potremmo aver bisogno di pensare un po 'fuori dagli schemi.


Ciò che ci serve

  1. Abbiamo bisogno di una fonte di dati, un modello, che mi dica quali stringhe di traduzione correnti abbiamo e qual è il loro contesto -
  2. Modello di dati proattivo. Il modello di dati corrente è reattivo (il modello viene aggiornato ogni volta che si verifica una chiamata t()). Abbiamo bisogno di un modello di dati proattivo, uno in cui l'applicazione si occupa di cercare le t()istanze prima che vengano effettivamente eseguite dal cliente.
  3. Abbiamo bisogno del contesto. t()da solo non lo taglia - perché - non sappiamo che stiamo traducendo "pippo", ma la lingua di destinazione che stiamo traducendo dipende dall'URL del luogo in cui si t()verifica. Anche se potessimo codificare la lingua di destinazione nella t()chiamata, ad esempio, utilizzando una chiamata wrapper, non funzionerebbe per i tuoi scopi.

Ho identificato alcuni degli strumenti che, se li avessimo, aiuterebbero il nostro problema. Con questi strumenti potremmo entrare nel modello di dati e dire: dammi tutte le stringhe racchiuse t()che non sono state ancora popolate. Ora inserisci queste traduzioni. Grazie.

E la prossima volta che arriva il cliente, le traduzioni sono lì sul posto.

Come potremmo ... costruire questi strumenti?


vincoli

  1. La lingua di destinazione non può essere sul modello, che è deciso dall'URL. Supponendo che la stringa debba supportare qualsiasi lingua.
  2. La stringa tradotta non può essere sul modello. La traduzione risiederà in un database.

Ora che ho riflettuto maggiormente sul problema e ho identificato alcune sfide e vincoli, posso pensare a qualsiasi soluzione disponibile là fuori o a creare soluzioni personalizzate.

Brainstorming della soluzione

Ho bisogno di qualcosa che lega "tutto" insieme. Che dire di ... un'entità?

  • Un'entità può contenere il prodotto che deve essere tradotto.
  • Le entità possono fornire la relazione - la colla - tra il prodotto che deve essere tradotto e il suo contesto.
  • L'entità può specificare dire, in un campo, la posizione URL predefinita del prodotto.
  • I token possono essere utilizzati per specificare posizioni alternative (lingue?) Su cui verrà visualizzato il prodotto.
  • Le entità ci forniscono il modello di dati proattivo di cui abbiamo bisogno e il suo contesto. Il che a sua volta ci permette di fare cose come: andare nel database, prendere tutte le entità del prodotto e se non hanno una stringa di traduzione per i campi X, Y e Z, creare quelle stringhe di traduzione.

Quando il cliente quindi afferra /pl/product/200, fai un viaggio nel db, cerca il prodotto 200 e prendi la pltraduzione già esistente . Hai un campo titolo e didascalia anche per quel prodotto? Le traduzioni dovrebbero essere presenti anche lì.

Nota che qui sono molto vago e generico in termini di modulo di traduzione che stai utilizzando. Potresti benissimo finire con il tuo modulo di traduzione, molto probabilmente è così. Tutti i modelli di traduzione che ho visto in Drupal finora (a partire da D7, non ho ancora visto D8) sono reattivi, non proattivi.

In poche parole

In teoria, ci sono gli strumenti per costruire ciò di cui hai bisogno, le entità sono il componente chiave che legherebbe tutto insieme: - dati (stringa di traduzione), - lingue di destinazione. Non devi essere sull'entità stessa, preferibilmente un vocabolario tassonomico, diciamo per le lingue dei prodotti. o forse una tassonomia generica anche per altre entità. - Contesto. L'URL su cui viene visualizzata l'entità. L'URL conterrebbe un token e il token a sua volta farebbe riferimento alla tassonomia della lingua di destinazione.

Con questi tre ingredienti puoi dire: prendi tutte le productentità, vai sul URL aliascampo, ottieni il token di tassonomia, fai scorrere tutte le combinazioni di termini possibili, presenta tutte le combinazioni all'utente corrente usando una brutta forma molto grande - o, AJAX - e moduli multi-step (qualcosa del genere) e poiché l'utente attualmente connesso traduce le varie lingue per il prodotto 200, salvarle da qualche parte nel database

Da qualche parte nel database potrebbe esserci un campo API di campo nell'entità, il campo delle impostazioni appartenente a ciascuna entità (non esattamente l'API di campo, ma può ancora contenere dati) o una tabella separata che usi per questo. Penso che il salvataggio dei dati nell'entità manterrà il codice e i dati più ordinati e più facili.


Costruendolo: possibili soluzioni

  • D8MI (Drupal 8 Multilingual Initiative)
  • Codice personalizzato: traduzioni "indicizzate" rese disponibili nei modelli da t () interrogando e rendendo programmaticamente pacchetti disponibili e le relative implementazioni di hook a tema.

pseudocodice

Foreach entity (di tipo x),
Trova tutte le lingue (tassonomia o linguaggio principale associato al prodotto),
Rendering dell'entità,
- per rilevare le stringhe di traduzione t ()
- rendering chiamate theme (), che gestisce il livello di presentazione multilingue di il prodotto, non il modello di dati del prodotto stesso.

Risultato:
- La prima chiamata per il rendering del modello di entità in ogni lingua restituisce l'implementazione della lingua predefinita per ogni chiamata.
- I parametri t () sul modello sono ora memorizzati nella cache in Drupal e pronti per la traduzione (per ogni istanza di lingua, non per ogni istanza di prodotto).
- L'utente con ruolo di "traduttore" ora può accedere all'interfaccia di traduzione e tradurre tutti i parametri t () disponibili, per ciascuna lingua.
- Il proprietario del sito non ha bisogno di attendere che i clienti visitino ciascuna pagina del prodotto o visitino manualmente ogni pagina del prodotto, poiché ciò è stato programmato per lui.

Domande aperte:
- Qual è il contesto? Se eseguo una chiamata programmatica a theme () per ciascun pacchetto di entità "prodotto", registra la posizione da cui è stata effettuata la chiamata? Registra l'URL del nodo? Il "contesto" può essere modificato? Dove viene registrato il contesto? Cosa succede quando si dispone di modelli "dinamici", ovvero quando si dispone di più di un modello per prodotto e come si rilevano tali variazioni?

Come sempre, la teoria e lo pseudocodice sono utili solo per il brainstorming. Ma in fase di sviluppo difficilmente sapremo a che cosa siamo veramente confrontati fino a quando non inizieremo la prototipazione. Quindi, dopo aver elaborato un paio di vincoli, possibili soluzioni e possibili problemi o domande, ora posso procedere all'implementazione di una prova di concetto o di un prototipo funzionante. Ad alcune delle domande aperte sopra è possibile rispondere solo in questo modo, e la prima che prototipiamo (indipendentemente dal successo o dal fallimento), possiamo iniziare a rispondere ad alcune di queste domande o cambiare completamente l'approccio. Resta sintonizzato ~


1
Anche senza leggere l'intero post, quel tipo di risposta merita un voto
Oleg Videnov,

Il punto è - lo strumento che afferma che sta già facendo quello che mi serve per Drupal 7. È solo un problema con Drupal che salva queste stringhe con metadati errati. Ma posso cambiare detti metadati in db una volta raccolte le stringhe, nessun problema. Devo solo sapere su cosa impostarli, in modo che lo strumento possa vederlo. O almeno credevo fosse quello di cui avevo bisogno. E soprattutto: non voglio tradurre prodotti, ma solo stringhe di modelli che non hanno nulla a che fare con il prodotto stesso, come Precedente - Successivo sul modello di galleria di immagini di prodotti.
Mołot,

2

Ok, abbiamo trascorso un altro po 'di tempo con il client di localizzazione e il modulo di traduzione delle entità per riprodurre lo stesso scenario. Poiché questa risposta è totalmente diversa dalla mia precedente, aggiungendo come commento separato:

  1. La traduzione aggiunta per una lingua in uno / primo nodo è disponibile per tutti i nodi.

    Ecco un esempio:

    • Se aggiungo un nuovo prodotto dello stesso tipo di nid 200 e visito la traduzione pl il nuovo nodo (diciamo pl / product / 204), vedrei la stessa stringa di traduzione in pl / product / 200.

    • L'unica differenza è che non appare nel client di localizzazione. Possiamo richiedere questa funzione nella coda di emissione del modulo, tuttavia ciò creerebbe maggiore confusione in quanto la traduzione non è specifica della pagina corrente e interesserebbe tutte le pagine (cioè sia pl / product / 200 & pl / product / 204).

    • Se i due nodi creati da due persone diverse e quella successiva desidera modificare la traduzione, devono utilizzare la traduzione dell'interfaccia.

  2. La stringa è disponibile nel client di localizzazione per la prima lingua visitata per lo stesso nodo

    Ecco un esempio:

    • Se aggiungo il nuovo prodotto nid 199 e creo la traduzione per la lingua 'pl' (nid 200) e la traduzione per la lingua 'rs' (nid 201), puoi vedere la stringa solo sulla pagina 'pl', non sulla pagina 'rs'. Ancora una volta, questa sembra una limitazione nel modulo client di localizzazione.

1

L'approccio per aggiungere la stringa di traduzione a livello di file modello o modulo può funzionare per l'interfaccia utente della traduzione dell'interfaccia, ma non per il client di localizzazione.

Ovviamente quando avrai una versione russa del prodotto 200, sarà un nuovo nodo, ad esempio / ru / product / 201 dove puoi tradurre usando il client di localizzazione.

Solo un pensiero: cerca una stringa che può essere tradotta per tutte le lingue nell'interfaccia utente della traduzione dell'interfaccia e chiedi al cliente di tradurre il livello del prodotto quando è veramente necessario. Ecco un esempio:

"Questo è un prodotto della categoria"

e se siamo sicuri che diversi da "pippo" e "bar" possano essere comuni, possiamo aggiungere

$vars['product_title'] = t('This is product @product of category @category')

in preelaborazione.

e il file .tpl.php sarà

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>

È più sui titletesti per le frecce nel rotatore di immagini. Al mio modulo non importa come il tema mostrerà 15 immagini. E il tema visualizza 5 alla volta, con le frecce "prev" e "next" che hanno bisogno alte titleche hanno bisogno di essere tradotte. Modificare il modulo ogni volta che cambierà il mio front-end è possibile, ma certamente non dovrebbe essere necessario. Queste stringhe non hanno nulla a che fare con il modulo stesso. Ultimo ma non meno importante, potrei essere semplicemente stringhe inconsapevoli nel tema cambiato. O non disponibile per migrarli nel modulo.
Mołot,

IMHO, questo caso dovrebbe essere gestito nell'interfaccia utente della traduzione dell'interfaccia anziché nel client di localizzazione.
vijaycs85,

Il client di localizzazione mira a consentire di "correggere le traduzioni sul tuo sito quando vedi i problemi". - perché non dovrebbe applicarsi ai file modello? Le stringhe in tpl sono ancora più sensibili al contesto in cui appaiono, semmai.
Mołot,

1

AFAIK con l' estrattore del modello di traduzione è possibile estrarre la stringa in tutte le chiamate alla t()funzione.

L'estrattore di modelli di traduzione fornisce un'interfaccia di estrazione di modelli di traduzione Gettext basata su Web e da riga di comando per Drupal, nonché un'API riutilizzabile per cercare stringhe traducibili ed errori di traducibilità. Questo strumento viene utilizzato sotto il cofano di http://localize.drupal.org/ e serve anche come macchina per l'analisi delle versioni del progetto Drupal.org.

Leggi questo Come tradurre un modulo?

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.