2010-06-17 7 views
10

Ich habe eine Multi-Tenant-Anwendung und experimentiere mit dem i18n-Juwel, um es jedem unserer Kunden zu ermöglichen, das System nach seinen Wünschen anzupassen, den Text auf verschiedenen Seiten zu ändern, E-Mails anzupassen und so weiter. Zugegeben, ich benutze i18n nicht so, wie es verwendet werden sollte, da ich nicht wirklich verschiedene "Sprachen" übersetze, alles ist in Englisch, aber jeder Klient hat ein anderes Englisch, wenn das Sinn macht.Schienen i18n: Kann ich "Übersetzung fehlende" Fehler abschalten?

Immerhin bin ich auf eine meiner Meinung nach schrecklich schlechte Designentscheidung gestoßen: Wenn jemals eine Übersetzung nicht existiert, anstatt einfach eine Übersetzung zu machen und auszudrucken, was auch immer sie normalerweise tun würde, wird das Problem deutlich ein Fehler. Zum Beispiel

<%= distance_of_time_in_words_to_now @press_release.submitted_at %> 

kommt als

translation missing: en, datetime, distance_in_words, x_days 

Ich meine, komm schon! Ich möchte das nicht übersetzen.

Ich verstehe, dass der Grund dafür ist, weil ich nicht die Standardübersetzungen geladen habe, aber ich benutze ActiveRecord als Backend und ich wollte es sauber zu halten. Die "Lösung" wäre, alle Yaml-Übersetzungsdateien in meinen Datenbank-Übersetzungsspeicher zu importieren, aber das scheint keine gute Idee zu sein. Was passiert, wenn ich die Schienen in Zukunft aktualisiere? Ich werde mich darum kümmern müssen, all diese Übersetzungen synchron zu halten.

Wieder kann ich nicht ergründen, warum dies das Standardverhalten ist. Wann möchte jemand diese funky Fehlermeldung angezeigt werden, anstatt nur den Standard "3 Tage" zu verwenden?

Wie auch immer, meine Frage ist, gibt es eine Möglichkeit, die Übersetzung automatisch zu deaktivieren und die nicht übersetzte Nachricht zu verwenden, wenn die Übersetzung nicht existiert? Vielen Dank!

Antwort

6

Dies scheint den Trick zu tun.

require 'i18n' # without this, the gem will be loaded in the server but not in the console, for whatever reason 

# store translations in the database's translations table 
I18n.backend = I18n::Backend::ActiveRecord.new 

# for translations that don't exist in the database, fallback to the Simple Backend which loads the default English Rails YAML files 
I18nSimpleBackend = I18n::Backend::Simple.new 
I18n.exception_handler = lambda do |exception, locale, key, options| 
    case exception 
    when I18n::MissingTranslationData 
    I18nSimpleBackend.translate(:en, key, options || {}) 
    else 
    raise exception 
    end 
end 
+2

Wo genau würden Sie das platzieren? –

+2

Wahrscheinlich in einer '.rb' Datei unter' config/initializers/'. – Dimitar

+1

'I18n.backend = I18n :: Backend :: ActiveRecord.new' verursacht nicht initialisierten const Fehler in Rails 4.2 – user938363

7

Wenn Sie im Umgang mit anderen Ausnahmen mit der Standard-Exception-Handler interessiert sind, diese modifizierte Code Antwort des Philip Brocoum sollte es tun (Rails 3.2.2-Version):

i18n_simple_backend = I18n::Backend::Simple.new 
old_handler = I18n.exception_handler 
I18n.exception_handler = lambda do |exception, locale, key, options| 
    case exception 
    when I18n::MissingTranslation 
    i18n_simple_backend.translate(:en, key, options || {}) 
    else 
    old_handler.call(exception, locale, key, options) 
    end 
end 

Diese Mit diesem Code können Sie nur die Ausnahmen erfassen, die Sie anders verarbeiten müssen.

+0

In Rails 4.2. 'i18n_simple_backend.translate (: en, key, options || {})' verursacht einen Fehler – user938363

Verwandte Themen