Suche…


Syntax

  • I18n.t ("Schlüssel")
  • I18n.translate ("key") # entspricht I18n.t("key")
  • I18n.t ("Schlüssel", Anzahl: 4)
  • I18n.t ("key", param1: "Something", param2: "Else")
  • I18n.t ("doesnt_exist", Standard: "Schlüssel") # Gibt einen Standardwert an, wenn der Schlüssel fehlt
  • I18n.locale # =>: en
  • I18n.locale =: en
  • I18n.default_locale # =>: de
  • I18n.default_locale =: en
  • t (". key") # Wie I18n.t("key") , jedoch auf die Aktion / Vorlage, von der es aufgerufen wird

Verwenden Sie I18n in Ansichten

Angenommen, Sie haben diese YAML-Sprachdatei:

# config/locales/en.yml
en:
  header:
    title: "My header title"

Wenn Sie Ihre Titelzeichenfolge anzeigen möchten, können Sie dies tun

# in ERB files
<%= t('header.title') %>

# in SLIM files
= t('header.title')

I18n mit Argumenten

Sie können Parameter I18n passieren t - Methode:

# Example config/locales/en.yml
en:
  page:
    users: "%{users_count} users currently online"

# In models, controller, etc...
I18n.t('page.users', users_count: 12)

# In views

# ERB
<%= t('page.users', users_count: 12) %>

#SLIM
= t('page.users', users_count: 12)

# Shortcut in views - DRY!
# Use only the dot notation
# Important: Consider you have the following controller and view page#users

# ERB Example app/views/page/users.html.erb
<%= t('.users', users_count: 12) %>

Und erhalte folgende Ausgabe:

"12 users currently online"

Pluralisierung

Sie können I18n für die Pluralisierung verantwortlich machen, verwenden Sie einfach das Argument count .

Sie müssen Ihre Ländereinstellungsdatei folgendermaßen einrichten:

# config/locales/en.yml
en:
  online_users:
    one: "1 user is online"
    other: "%{count} users are online"

Verwenden Sie dann den soeben erstellten Schlüssel, indem Sie das count Argument an I18n.t Helfer I18n.t :

I18n.t("online_users", count: 1)
#=> "1 user is online"

I18n.t("online_users", count: 4)
#=> "4 users are online"

Festlegen des Gebietsschemas durch Anforderungen

In den meisten Fällen möchten Sie möglicherweise das Gebietsschema I18n . Möglicherweise möchten Sie das Gebietsschema für die aktuelle Sitzung, den aktuellen Benutzer oder basierend auf einem URL-Parameter before_action Dies kann leicht durch Implementierung einer before_action in einem Ihrer Controller oder in ApplicationController , um es in allen Controllern zu haben.

class ApplicationController < ActionController::Base
  before_action :set_locale

  protected

  def set_locale
    # Remove inappropriate/unnecessary ones
    I18n.locale = params[:locale] ||    # Request parameter
      session[:locale] ||               # Current session
      (current_user.preferred_locale if user_signed_in?) ||  # Model saved configuration
      extract_locale_from_accept_language_header ||          # Language header - browser config
      I18n.default_locale               # Set in your config files, english by super-default
  end

  # Extract language from request header
  def extract_locale_from_accept_language_header
    if request.env['HTTP_ACCEPT_LANGUAGE']
      lg = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.to_sym
      lg.in?([:en, YOUR_AVAILABLE_LANGUAGES]) ? lg : nil
    end
  end

URL-basiert

Das locale param könnte von einer solchen URL stammen

http://yourapplication.com/products?locale=en

Oder

http://yourapplication.com/en/products

Um letzteres zu erreichen, müssen Sie Ihre routes bearbeiten und einen scope hinzufügen:

# config/routes.rb
scope "(:locale)", locale: /en|fr/ do
  resources :products
end

Durch das http://yourapplication.com/en/products wird Ihr Gebietsschema auf http://yourapplication.com/en/products festgelegt :en . http://yourapplication.com/fr/products Sie stattdessen http://yourapplication.com/fr/products besuchen, wird http://yourapplication.com/fr/products festgelegt :fr . Außerdem erhalten Sie keinen Routing-Fehler, wenn Sie das :locale -Param fehlen. Beim Besuch von http://yourapplication.com/products wird das Standard- I18n- Gebietsschema geladen .

Sitzungsbasiert oder persistenzbasiert

Dies setzt voraus, dass der Benutzer auf eine Schaltfläche / eine Sprachmarkierung klicken kann, um die Sprache zu ändern. Die Aktion kann an einen Controller weiterleiten, der die Sitzung auf die aktuelle Sprache einstellt (und die Änderungen an einer Datenbank eventuell beibehalten, wenn der Benutzer verbunden ist).

class SetLanguageController < ApplicationController
  skip_before_filter :authenticate_user!
  after_action :set_preferred_locale

  # Generic version to handle a large list of languages
  def change_locale
    I18n.locale = sanitize_language_param
    set_session_and_redirect
  end

Sie müssen sanitize_language_param mit Ihrer Liste der verfügbaren Sprachen definieren und eventuell Fehler behandeln, falls die Sprache nicht vorhanden ist.

Wenn Sie nur wenige Sprachen haben, können Sie sie stattdessen wie folgt definieren:

def fr
  I18n.locale = :fr
  set_session_and_redirect
end

def en
  I18n.locale = :en
  set_session_and_redirect
end

private

  def set_session_and_redirect
    session[:locale] = I18n.locale
    redirect_to :back
  end

  def set_preferred_locale
    if user_signed_in?
      current_user.preferred_locale = I18n.locale.to_s
      current_user.save if current_user.changed?
    end
  end
end

Hinweis: Vergessen Sie nicht, Ihren change_language Aktionen einige Routen change_language

Standardgebietsschema

Denken Sie daran, dass Sie das Standardgebietsschema der Anwendung festlegen müssen. Sie können dies tun, indem Sie es entweder in config/application.rb einstellen:

config.i18n.default_locale = :de

oder durch Erstellen eines Initialisierers im Ordner config/initializers :

# config/initializers/locale.rb
I18n.default_locale = :it

Holen Sie sich das Gebietsschema von der HTTP-Anforderung

Manchmal kann es nützlich sein, das Anwendungsgebietsschema basierend auf der Anforderungs-IP festzulegen. Sie können dies leicht mit Geocoder . Geocoder kann unter anderem die location einer request Geocoder .

Geocoder Sie Gemfile Geocoder zu Ihrem Gemfile

# Gemfile
gem 'geocoder'

Geocoder fügt dem standardmäßigen Rack::Request Objekt location und safe_location Methoden hinzu, sodass Sie den Speicherort jeder HTTP-Anfrage nach IP-Adresse ermitteln können. Sie können diese Methoden in einer before_action in Ihrem ApplicationController :

class ApplicationController < ActionController::Base
  before_action :set_locale_from_request

  def set_locale_from_request
    country_code = request.location.data["country_code"] #=> "US"
    country_sym = country_code.underscore.to_sym #=> :us

    # If request locale is available use it, otherwise use I18n default locale
    if I18n.available_locales.include? country_sym
      I18n.locale = country_sym
    end
end

Beachten Sie, dass dies in development und test nicht funktioniert, da Dinge wie 0.0.0.0 und localhost gültige Internet-IP-Adressen sind.


Einschränkungen und Alternativen

Geocoder ist sehr leistungsfähig und flexibel, muss jedoch für die Arbeit mit einem Geokodierungsdienst konfiguriert werden ( weitere Informationen ). viele davon setzen der Nutzung Grenzen. Beachten Sie auch, dass das Anrufen eines externen Dienstes bei jeder Anforderung die Leistung beeinträchtigen kann.

Um diese anzusprechen, kann es auch eine Überlegung wert sein:

1. Eine Offline-Lösung

Bei Verwendung eines GeoIP wie GeoIP (siehe hier ) können Lookups anhand einer lokalen Datei durchgeführt werden. In Bezug auf die Genauigkeit kann es zu einem Kompromiss kommen, da diese Dateien aktuell gehalten werden müssen.

2. Verwenden Sie CloudFlare

Über CloudFlare HTTP_CF_IPCOUNTRY Seiten können transparent geokodiert werden, wobei der Ländercode zum Header hinzugefügt wird ( HTTP_CF_IPCOUNTRY ). Weitere Details finden Sie hier .

Attribute des ActiveRecord-Modells übersetzen

globalize gem ist eine großartige Lösung, um Ihren ActiveRecord Modellen Übersetzungen hinzuzufügen. Sie können es installieren, indem Sie dies Ihrem Gemfile :

gem 'globalize', '~> 5.0.0'

Wenn Sie Rails 5 Sie auch activemodel-serializers-xml hinzufügen

gem 'activemodel-serializers-xml'

Mit Modellübersetzungen können Sie die Attributwerte Ihrer Modelle übersetzen, zum Beispiel:

class Post < ActiveRecord::Base
  translates :title, :text
end

I18n.locale = :en
post.title # => Globalize rocks!

I18n.locale = :he
post.title # => גלובאלייז2 שולט!

Nachdem Sie Ihre Modellattribute definiert haben, die übersetzt werden müssen, müssen Sie über eine Migration eine Übersetzungstabelle erstellen. globalize bietet create_translation_table! und drop_translation_table! .

Für diese Migration müssen Sie up und down und nicht change . Damit diese Migration erfolgreich ausgeführt werden kann, müssen Sie zunächst die übersetzten Attribute in Ihrem Modell definieren, wie oben gezeigt. Eine korrekte Migration für das vorherige Post Modell lautet:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string, text: :text
  end

  def down
    Post.drop_translation_table!
  end
end

Sie können auch Optionen für bestimmte Optionen übergeben, z.

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string,
      text: { type: :text, null: false, default: "Default text" }
  end

  def down
    Post.drop_translation_table!
  end
end

Falls Sie bereits über vorhandene Daten in den benötigten Übersetzungsspalten verfügen, können Sie diese leicht in die Übersetzungstabelle migrieren, indem Sie Ihre Migration anpassen:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

Stellen Sie sicher, dass Sie die übersetzten Spalten aus der übergeordneten Tabelle löschen, nachdem alle Ihre Daten sicher migriert wurden. Um die übersetzten Spalten nach der Datenmigration automatisch aus der übergeordneten Tabelle zu entfernen, fügen remove_source_columns der Migration die Option remove_source_columns :

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true,
      remove_source_columns: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

Sie können auch neue Felder zu einer zuvor erstellten Übersetzungstabelle hinzufügen:

class Post < ActiveRecord::Base
  # Remember to add your attribute here too.
  translates :title, :text, :author
end

class AddAuthorToPost < ActiveRecord::Migration
  def up
    Post.add_translation_fields! author: :text
  end

  def down
    remove_column :post_translations, :author
  end
end

Verwenden Sie I18n mit HTML-Tags und -Symbolen

# config/locales/en.yml
en:
  stackoverflow:
    header:
      title_html: "Use <strong>I18n</strong> with Tags &amp; Symbols"

Beachten Sie den Zusatz von zusätzlicher _html nach dem Namen des title .

Und in Ansichten,

# ERB
<h2><%= t(:title_html, scope: [:stackoverflow, :header]) %></h2>


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow