2011-01-31 2 views
14

Mi chiedevo se è possibile avere più file di un locale, forse organizzate in directory e ancora usare gli alias YAML, per esempio:Rails I18n più file aliasing

in un file comune:

# config/locales/common/en.yml 
en: 
    first_name: &first_name "First name" 
    last_name: &last_name "Last name" 

e in un file più specifico:

# config/locales/models/user/en.yml 
en: 
    helpers: 
    label: 
     user: 
     first_name: *first_name 
     last_name: *last_name 

Ciò contribuirà a ridurre al minimo traduzioni e cambiare in traduzioni. nella mia configurazione di rails, l'ho impostato per caricare tutto il file locale nelle sottodirectory. Questa configurazione non funziona per me, ottengo un errore di alias errato quando carico una pagina.

Ho provato ad avere uno script di init che compila tutto l'en.yml in uno e basta usare quello stesso file, e l'alias funziona e tutto, ma non riesco a fondere le chiavi. Ad esempio, se ho un altro "helper" in qualche altro file, usa solo ciò che è stato specificato per ultimo (infatti, anche l'en è sempre sovrascritto) invece di unire le chiavi.

O c'è uno schema migliore per tutto questo? Grazie mille!

risposta

5

Il modello di default di organizzare locali è presentato qui:

http://guides.rubyonrails.org/i18n.html#organization-of-locale-files

+0

Grazie per la risposta! Ho seguito questa guida, ed è molto simile a come la sto organizzando. Tuttavia, non riesco a fare la cosa dell'aliasing come voglio sopra con l'impostazione consigliata. Questo è il mio punto principale, è come fare l'aliasing su più file t8n. Grazie ancora! – janechii

5

Prova sostituire in application.rb valore predefinito di * * config.i18n.load_path parametro con che:

config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s] 

Funziona per me.

+1

Skydan, grazie per l'input! sfortunatamente, questo non ha funzionato per me. Si noti che sto usando l'alias YAML. Senza gli alias, funzionerebbe bene come hai detto tu. Un anno dopo la domanda originale e non ho ancora trovato una soluzione ideale. ho appena ripetuto le traduzioni – janechii

4

Per quanto ho capito, vuoi avere più file .yml e avere ancora la funzione di unione.

Purtroppo questo non è possibile a causa del modo in cui Rails funziona.

Contesto tecnico:

Ci sono due passi importanti che vengono eseguite da due sistemi non collegati:

  • Ogni file .yml viene caricato singolarmente utilizzando una libreria YAML. Ecco dove vengono risolte le ancore e gli alias. I nodi duplicati non sono consentiti in questo passaggio, cioè ogni nodo sovrascrive un nodo precedente con lo stesso nome e genitore.
  • Gli hash risultanti vengono quindi uniti da Rails utilizzando Ruby. È qui che i nodi YAML vengono uniti e duplicati da diversi file sono consentiti.

Ecco perché gli ancore e gli alias non possono estendersi su più file. D'altra parte si ottiene una funzione di unione netta che non è supportata da YAML.

In altre parole: compilando tutto in un file gigante, si otterrebbe la funzione "alias globale", ma si perderebbe la funzione di unione. Puoi avere l'uno o l'altro, ma non entrambi. In termini di manutenibilità, l'approccio a più file è decisamente più piacevole.


PS: Naturalmente la duplicazione, come nel tuo esempio mi fa rabbrividire, troppo, ma è meglio concentrarsi su chiavi DRY e una buona struttura chiave che su traduzioni SECCO.

Questo perché le traduzioni cambiano spesso nel tempo: ciò che era lo stesso nelle prime fasi dell'applicazione potrebbe essere leggermente diverso dopo l'evoluzione dell'applicazione. Forse in alcuni punti deve essere "Nome" e in un altro deve essere "Inserisci il tuo nome, per favore".

Posso anche immaginare che avere una "traduzione principale" non funzioni per ogni lingua, per quanto riguarda la grammatica e altri contesti che non hanno rilevanza in inglese.

Quindi il mio consiglio personale sarebbe: attenersi al metodo suggerito da Rails (cioè più file) e ignorare alcune duplicazione inevitabile.