So machen Sie Ihre Rails-Anwendung mehrsprachig

Rails-Gem-Ansatz, MySQL-Ansatz und eine mehrsprachige Rails-Struktur

Der Großteil der Welt spricht kein Englisch. Hier kommen Internationalisierung und Lokalisierung ins Spiel. Rails verfügt über eine großartige 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:

  • Einfachheit – einfach umzusetzen
  • Einfache Abfrage – keine JOINs erforderlich
  • Keine Duplikate – hat keinen doppelten Inhalt

Nachteile:

  • Schwierig zu warten – funktioniert problemlos für 2-3 Sprachen, wird aber sehr schwierig, wenn Sie viele Spalten oder viele Sprachen haben
  • 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.

  • Erfordert keine Änderung des Datenbankschemas für neue Sprachen (und somit keine Begrenzung von Codeänderungen)
  • Benötigt nicht viel Platz für nicht implementierte Sprachen oder Übersetzungen eines bestimmten Elements
    Bietet die größte Flexibilität
  • Am Ende haben wir keine spärlichen Tabellen
  • Wir müssen uns keine Gedanken über Nullschlüssel machen und müssen nicht prüfen, ob wir eine vorhandene Übersetzung anstelle eines Nulleintrags anzeigen.

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

LUBAIB CEEJEY
Senior Ruby on Rails-Entwickler

Abonnieren Sie die neuesten Updates

zusammenhängende Posts

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEGerman