2009-12-03 13 views
7

come un esempio, ho predefinita inglese un file locale "en.yml" con un contenuto:rotaie - Come aggiungere dinamicamente/esclusione formulazione di i18n YAML

en: 
    messages: messages 
    users: users 

ora, c'è un cliente che vuole i messaggi essere nominato discussioni nel suo prodotto, ma gli utenti dovrebbero rimanere utenti. Quindi quello che voglio fare è creare il file "customer.en.yml"

en: 
messages: discussions 

che ignorare le "messaggi" di default di traduzione, ma manterrebbe tutte le altre parole stesso. come posso ottenerlo?

perché se carico en.yml con:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 

e successivamente carico customer.en.yml (APP_CONFIG [ 'customer_name'] è definito in precedenza) con

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales', APP_CONFIG['customer_name']+'.{rb|yml}')] 

sarà solo sovrascrivi la mia localizzazione "en" e la traduzione degli "utenti" scomparirà, giusto?

risposta

3

Non dovrebbe sovrascrivere il locale "en". Le traduzioni sono unite. store_translations nel semplice backend I18n chiamate merge_translations, che assomiglia a questo:

# Deep merges the given translations hash with the existing translations 
# for the given locale 
def merge_translations(locale, data) 
    locale = locale.to_sym 
    translations[locale] ||= {} 
    data = deep_symbolize_keys(data) 

    # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } 
    translations[locale].merge!(data, &merger) 
end 

Come si può vedere, solo i tasti inseriti nel file yml traduzione quest'ultimo verrà sovrascritto.

1

Volevo qualcosa di simile quando stavamo scrivendo una traduzione di pirate.yml, ma volevo qualcosa che non fosse definito in pirate.yml come predefinito in quello che avevamo in en.yml.

Quello che ho scritto può essere trovato su Github.

+0

Il collegamento Github non è più valido! –

+0

Non valido? Anche se è un progetto molto vecchio, il collegamento funziona ancora per me. Stai ricevendo un 404? –

+0

Esattamente una 'pagina non trovata 'è ciò che sto ottenendo! –

-1

Penso che potresti confondere due cose diverse.

Il file i18n è per le traduzioni.

Se si dispone di un client che richiede un nome specifico per alcuni campi, non si tratta di un problema di traduzione, ma di funzionalità.

In altre parole, penso che avete bisogno di qualcosa di simile:

en: 
    messages: messages 
    users: users 
    discussions: discussions 

e quindi aggiungere la funzionalità specifiche da qualche altra parte, ad esempio, a suo avviso:

if(customer.needs_discussions?) 
<%= t(:discussions) %> 
else 
<%= t(:messages) %> 
end 

In alternativa, è possibile aggiungere un attributo di stringa per i tuoi clienti, per impostazione predefinita a "messaggi". Allora la vostra vista sarebbe simile a questa:

<%= t(customer.messages_field_name) %> 
+2

bene, quindi se ha bisogno di 200 modifiche nella formulazione, devo scrivere 200 se e aggiungere 200 impostazioni del cliente, e lo stesso per ogni altro cliente che utilizza il prodotto a modo suo. questo aumenterebbe notevolmente la quantità di codice. e, se il cliente specifico se ne va, tutti i if resterebbero nel codice, mentre altrimenti io cancellerei semplicemente la sostituzione della traduzione. –

+0

Il codice era solo un esempio: volevo dire che non dovresti usare i18n per quello. Ho modificato il mio commento con altre soluzioni. Se continui a pensare di usare i18n, pensa a cosa succederà quando dovrai tradurre la tua domanda in francese, ad esempio. – kikito

+1

ho già i18n in francese e in inglese, e in cima a loro ho caricato le sostituzioni dei clienti. ho locales/en.yml, locales/fr.yml e sopra di essi carico locales/customer.en.yml e locales/customer.fr.yml, se necessario. mi dispiace, ma penso davvero che in questo modo sia molto meglio per le semplici personalizzazioni del testo –

5

Usa i18n.fallbacks

Non sono sicuro di quando questo è stato aggiunto al Rails, ma in 4.2.2 si può fare:

# application.rb 
# If key is not found in a locale, we look in fallback 
config.i18n.fallbacks = { 
    "locale_1" => "en", 
    "locale_2" => "en", 
    "locale_3" => "de", 
} 

Se anche si imposta config.action_view.raise_on_missing_translations = true (che faccio in fase di sviluppo e test), si alzerà solo se la chiave non si trova nel locale o il fallback.

Problemi correlati