Rails-Gem-Ansatz, MySQL-Ansatz und eine mehrsprachige Rails-Struktur
Most of the world doesn’t speak English. That’s where internationalization and localization come in. Rails has a great i18n API.
Referenz: http://guides.rubyonrails.org/i18n.html
Es bietet ein benutzerfreundliches und erweiterbares Framework für die Übersetzung Ihrer Anwendung in eine einzelne benutzerdefinierte Sprache außer Englisch oder für die Bereitstellung mehrsprachiger Unterstützung in unserer Anwendung.
I18n-API:
Die wichtigsten Methoden der I18n-API sind:
Übersetzen Sie #. Suchen Sie nach Textübersetzungen
# lokalisieren Datums- und Uhrzeitobjekte in lokale Formate lokalisieren
Diese haben die Aliase #t und #l, sodass Sie sie wie folgt verwenden können:
I18n.t 'app.title' I18n.l Time.now
Rails-i18n-Juwel:
Installation:
Zur Gemfile hinzufügen:
gem 'rails-i18n', Github: 'svenfuchs/rails-i18n', Zweig: 'master' # Für 5.x
Aufbau:
Standardmäßig lädt Rails-i18n alle im Gem verfügbaren Gebietsschemadateien sowie Pluralisierungs- und Transliterationsregeln. Dieses Verhalten kann geändert werden, wenn wir in config/environments/* die Locales angeben, die über die Option I18n.available_locales geladen werden müssen:
config.i18n.available_locales = ['es-CO', :de]
oder
config.i18n.available_locales = :nl
Wir können auch einen anderen Edelstein verwenden:
Juwel globalisieren:
Rails I18n De-facto-Standardbibliothek für die ActiveRecord-Modell-/Datenübersetzung. Globalize baut auf der I18n-API in Ruby on Rails auf, um Modellübersetzungen zu ActiveRecord-Modellen hinzuzufügen.
Installation:
Wenn Sie Bundler verwenden, fügen Sie dies in unsere Gemfile ein:
gem 'globalize', '~> 5.0.0' Um Globalize mit Rails 5 zu verwenden, fügen Sie dies in unsere Gemfile-Gem 'activemodel-serializers-xml' ein.
2. Dokumentation: https://github.com/globalize/globalize
DB Design für mehrsprachige App (Englisch und Arabisch):
Ansatz zur Unterstützung von 2 oder 3 Sprachen:
1. Säulenansatz:
Erstellen Sie ein Spaltenansatzmodell mit Sprachspalten. „title_en“ varchar(255) NICHT NULL, „title_ar“ varchar(255) NICHT NULL,
Nun ist auch die Art und Weise, wie Sie es abfragen würden, recht einfach. Wir können dies tun, indem wir automatisch die richtigen Spalten entsprechend der gewählten Sprache auswählen.
Vorteile:
- Simplicity – easy to implement
- Easy querying – no JOINs required
- No duplicates – doesn’t have duplicate content
Nachteile:
- Hard to maintain – works in easy way for 2-3 languages, but it becomes a really hard when you have a lot of columns or a lot of languages
- Es ist schwierig, eine neue Sprache hinzuzufügen
2. Übersetzungstabellenansatz:
Für jede übersetzbare Tabelle gibt es eine zugehörige Übersetzungstabelle.
CREATE TABLE PRODUCT (id int, PRICE NUMBER(18, 2)) CREATE TABLE PRODUCT_tr (id int, product_id INT FK, Sprachcode varchar, Namenstext, Beschreibungstext)
Auf diese Weise wäre bei mehreren übersetzbaren Spalten nur ein einziger Join erforderlich, um sie abzurufen, und es könnte einfacher sein, Elemente zusammen mit den zugehörigen Übersetzungen zu importieren.
- Doesn’t require altering the database schema for new languages (and thus limiting code changes)
- Doesn’t require a lot of space for unimplemented languages or translations of a particular item
Bietet die größte Flexibilität - We don’t end up with sparse tables
- We don’t have to worry about null keys and checking that we’re displaying an existing translation instead of some null entry.
Mehrsprachige App mit Rails-5 (Englisch und Arabisch):
Der Ansatz für mehrsprachige Rails-Anwendungen ist dem einsprachigen sehr ähnlich. Hier müssen wir YAML-Sprachdateien für alle benötigten Sprachen definieren und der Rails-Anwendung mitteilen, welche Sprache sie aktuell verwenden soll. Wir machen das über I18n.locale.
Festlegen von I18n.locale über das URL-Pfadpräfix
Wir möchten, dass http://0.0.0.0:3000/ar die arabische Version und http://0.0.0.0:3000/en die englische Version anzeigt.
config/routes.rb
Myapp::Application.routes.draw do Scope "(:locale)", :locale => /en|ar/ do root :to => 'page#index' get "page/index" end end
Stellen Sie ein before_filter in der app/controllers/application_controller.rb.
Klasse ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] || I18n.default_locale Ende Ende
Um es zu testen, gehen Sie zur URL;
http://0.0.0.0:3000/ar
Oder
http://0.0.0.0:3000/ar/page/index
Festlegen einer Standardsprache:
app/controllers/application_controller.rb: Klasse ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] || I18n.default_locale Rails.application.routes.default_url_options[:locale]= I18n.locale Ende Ende
Daher müssen wir nichts weiter tun. Alle über den Gerüstgenerator generierten Links werden automatisch entsprechend geändert.
Festlegen von I18n.locale über den HTTP-Header „Accept Language“ des Browsers:
app/controllers/application_controller.rbclass ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def extract_locale_from_accept_lingual_header request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[az]{2}/).first end def set_locale I18n.locale = extract_locale_from_accept_lingual_header || I18n.default_locale Ende Ende
Hier können wir unsere Routendatei ändern:
config/routes.rb: Myapp::Application.routes.draw erhält „page/index“ root :to => 'page#index' end
Speichern von I18n.locale in Sitzung
app/controllers/set_mylingual_controller.rb: Klasse SetMylingualController < ApplicationController #English def en I18n.locale = :en set_session_and_redirect end #Arabic def ar I18n.locale = :ar set_session_and_redirect end private def set_session_and_redirect session[:locale] = I18n.locale restart_to :back Rescue ActionController::RedirectBackError restart_to :root end end
Änderung im Anwendungscontroller:
app/controllers/application_controller.rb: Klasse ApplicationController < ActionController::Base protected_from_forgery before_filter :set_locale private def set_locale I18n.locale = session[:locale] || I18n.default_locale session[:locale] = I18n.locale Ende Ende
Für die Einstellung Arabisch:
http://0.0.0.0:3000/set_mylanguage/ar
Für die Einstellung Englisch:
http://0.0.0.0:3000/set_mylanguage/en
Textblöcke im YAML-Format:
Erstellen Sie zunächst die folgenden Verzeichnisse:
$ mkdir -p config/locales/models/item $ mkdir -p config/locales/views/item
Fügen Sie die folgenden Zeilen in die Datei config/application.rb ein:
# Das Standardgebietsschema ist :en und alle Übersetzungen aus config/locales/*.rb,yml werden automatisch geladen.
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', 'models', '*', '*.yml').to_s] config.i18n.load_path += Dir[Rails .root.join('config', 'locales', 'views', '*', '*.yml').to_s] config.i18n.default_locale = :en
Wir müssen hier eine Datei erstellen; config/locales/models/item
config/locales/models/item/ar.yml für Arabisch
und stellen Sie sicher, dass en.yml für Englisch vorhanden ist.
Englisches YAML:
Da die meisten Dinge für Englisch bereits im System vorhanden sind
Fügen Sie das Folgende in die Datei en.yml ein.
# Ruby-Kodierung: utf-8
en: Ansichten: Anzeigen: Anzeigen Bearbeiten: Bearbeiten Zerstören: Löschen are_you_sure: Sind Sie sicher? zurück: Zurück Artikel: Index: Titel: Liste aller Artikel neu: Titel: Neuer Artikel flash_messages: item_was_successfully_created: „Artikel wurde erfolgreich erstellt.“
Arabisches YAML:
Wir müssen Werte/Texte auf Arabisch in ar.yml wie in en.yml einfügen
Sogar wir können eine vorgefertigte Standardübersetzung von Sven Fuchs aus seinem Github-Repository kopieren https://github.com/svenfuchs/rails-i18n:
$ cd config/locales
$ curl -O https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ar.yml
Übersetzen in Ansicht:
Wir können human_attribute_name() für die Attribute verwenden und die Links müssen mit I18n.t übersetzt werden. Wir können number_to_currency() verwenden, um den Betrag/Preis in formatierter Form anzuzeigen:
Beispiele:
<% = t ‘views.item.index.listing_items’ %>
<% = link_to I18n.t('views.show'),@item %> <%= Item.human_attribute_name(:name) %><%=Item.human_attribute_name(:description) %>
Flash-Nachrichten im Controller übersetzen
if @item.save format.html { weitergeleitet_zu @item, Hinweis: I18n.t('views.item.flash_messages.item_was_successfully_created') } format.json { json rendern: @item, Status: :erstellt, Speicherort: @item } else format.html { Aktion rendern: „neu“ } format.json { json rendern: @item.errors, Status: :unprocessable_entity } Ende
Für andere vorgefertigte Sprachübersetzungen:
https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale