2009-12-03 6 views
7

als Beispiel, ich habe eine Standard-Englisch locale Datei „en.yml“ mit Inhalt:Schienen - wie dynamisch hinzufügen/Überschreibung Wortlaut zu i18n yaml

en: 
    messages: messages 
    users: users 

jetzt gibt es einen Kunden, welche Nachrichten will Diskussionen in seinem Produkt genannt werden, aber Benutzer sollten Benutzer bleiben. Also, was ich tun möchte, ist „customer.en.yml“ Datei

en: 
messages: discussions 

zu schaffen, die die Standard „Nachrichten“ Übersetzung außer Kraft setzen würde, würde aber alle anderen Worten gleichen halten. Wie kann ich es erreichen?

weil, wenn ich laden en.yml mit:

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

und danach customer.en.yml laden (app_config [ 'customer_name'], bevor definiert ist) mit

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

wird es nur überschreiben mein "en" Gebietsschema, und "Benutzer" Übersetzung wird verschwinden, oder?

Antwort

3

Es sollte nicht Ihre "en" Gebietsschema überschreiben. Übersetzungen werden zusammengeführt. store_translations im einfachen I18n Backend aufruft merge_translations, die wie folgt aussieht:

# 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 

Wie Sie können sehen, nur die Tasten, die Sie in der letzten Übersetzung yml Datei eingeben überschrieben.

1

Ich wollte etwas ähnliches, als wir eine Übersetzung von pirate.yml geschrieben haben, aber ich wollte alles, was nicht in pirate.yml definiert ist, auf das, was wir in en.yml hatten.

Was ich schrieb, kann auf Github gefunden werden.

+0

Github-Link ist nicht mehr gültig! –

+0

Nicht gültig? Während es ein sehr altes Projekt ist, funktioniert der Link immer noch für mich. Bekommst du einen 404? –

+0

Genau eine "Seite nicht gefunden" ist was ich bekomme! –

-1

Ich denke, Sie könnten zwei verschiedene Dinge vermischen.

Die i18n-Datei ist für Übersetzungen gedacht.

Wenn Sie einen Client haben, der einen bestimmten Namen für ein Feld benötigt, ist das kein Übersetzungsproblem, sondern Funktionalität.

Mit anderen Worten, ich glaube, Sie so etwas wie dies braucht:

en: 
    messages: messages 
    users: users 
    discussions: discussions 

Und dann die spezifische Funktionalität woanders hinzufügen, zum Beispiel in der Ansicht:

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

Alternativ könnten Sie hinzufügen ein String-Attribut für Ihre Kunden, standardmäßig "Nachrichten". Dann würde Ihre Ansicht wie folgt aussehen:

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

Nun, wenn er 200 Änderungen in der Formulierung braucht, muss ich 200 IFS schreiben und 200 Kundeneinstellungen hinzufügen, und dasselbe für jeden anderen Kunden, der Produkt auf seine eigene Weise verwendet. Dies würde die Menge an Code stark erhöhen. und wenn der spezielle Kunde auf geht, bleiben all diese ifs im Code, während ich sonst einfach den Override der Übersetzung lösche. –

+0

Der Code war nur ein Beispiel - was ich meinte ist, dass Sie nicht i18n dafür verwenden sollten. Ich habe meinen Kommentar mit anderen Lösungen bearbeitet. Wenn Sie weiterhin daran denken, i18n zu verwenden, denken Sie darüber nach, was passieren wird, wenn Sie Ihre Anwendung beispielsweise ins Französische übersetzen müssen. – kikito

+1

Ich habe bereits Französisch und Englisch i18n, und oben drauf lade ich Kundenüberschreibungen. Ich habe locales/en.yml, locales/fr.yml und über ihnen lade ich locales/customer.en.yml und locales/customer.fr.yml, falls nötig. Es tut mir leid, aber ich denke wirklich, dass dieser Weg viel besser für einfache Formulierungen ist –

5

Verwenden i18n.fallbacks

Ich bin nicht sicher, wenn diese zu Rails wurde hinzugefügt, aber in 4.2.2 Sie tun können:

# 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", 
} 

Wenn Sie auch config.action_view.raise_on_missing_translations = true gesetzt (die ich in Entwicklungs- und Test tun), wird sie erhöht nur, wenn ein Schlüssel nicht in dem Lokalisierungs oder das Notfall gefunden wird.

Verwandte Themen