No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Soporte de varios idiomas para tu aplicación

16/36
Recursos

Aportes 13

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Soporte para varios idiomas

_
Internacionalización
El sistema de internacionalización o I18N nos ayuda a interactuar con una libreria de Rails para insertar de forma automatizada ciertas keys para enlazar traducciones a diferentes idiomas.

_

Cómo usarlo

  • En los labels de los atributos del modelo User escribiremor t(‘model.atribute’). Esto, de forma automática accederá al atributo del modelo.
  • Buscamos el archivo config/locales/en.yml Este archivo contendrá “etiquetas”. Colocamos el nombre del modelo y sus atributos. Dentro de estas etiquetas colocaremos su traducción.
en:
  hello: Hello world
  users:
    first_name: First name
  • El archivo “en” funciona como diccionario del idioma ingles. Para crear uno del idioma español podemos duplicarlo y llamarlo “en”. En el archivo en colocaremos los términos en español.
  • Para ahorrarnos el proceso de escribir cada atributo de forma manual podemos usar el comando i18n-asks add-missing. Esto requiere una unstalacion (gem install i18n-tasks).

_

Establecer lenguaje por acciones

  • Vamos al controlador que queremos internacionalizar podemos añadir la clase I18n y el método locale, para establecer el lenguaje de la acción. ‘es’.
def new
	I18n.locale = 'es'
	@user = User.new
end

_
Establecer lenguaje por controlador

  • Si queremos que esta internacionalización afecte a todas las acciones tendríamos que ir a su controlador base. Dentro de este colocaremos dentro de la clase:
before_Action :set_locale

def set_locale
	I18n.locale = 'es'
end

¿Cómo se haria para manejar los locales segun la ruta. Por ejemplo es/… or en/…?

Hola así quedó mi código tanto en users como en books:

Users:

 .form-inputs
    = f.input :first_name, label: t('users.first_name')
    = f.input :last_name, label: t('.last_name')
    = f.input :about_me, label: t('.about_me')
    = f.input :phone, label: t('.phone')

Books:

.form-inputs
    = f.input :title, label: t('.title')
    = f.input :author, label: t('.author')
    = f.input :description, label: t('.description')
    = f.input :isbn, label: t('.isbn')
    = f.input :pages_count,label: t('.pages_count')

‘es’ file:

es:
  books:
    form:
      author: Autor
      description: Descripción
      isbn: Isbn
      pages_count: Número de páginas
      submit: Registrar
      title: Titulo
  hello: Hello world
  users:
    first_name: Nombres
    form:
      about_me: Sobre mi
      last_name: Apellidos
      phone: Telefono
      submit: Registrar

PD: los submit no cambian pero lo dejo asi para referencia 😄

El profesor menciona algo que hacer que completamente no entiedo, yo : panico, menciona que lo abordaremos luego luego, ufff que alivio jajaj

Así quedo mi archivo es.yml 👀

---
es:
  hello: Hola mundo
  users:
    edit:
      back: Regresar
      show: Mostrar
    first_name: Nombres
    form:
      about_me: Un poco sobre mi persona
      address: Direccion
      last_name: Apellidos
      phone: Telefono
    index:
      about_me: Un poco sobre mi
      address: Direccion
      are_you_sure?: ¿Estas seguro?
      destroy: Destruir
      edit: Editar
      first_name: Nombres
      last_name: Apellidos
      listing_users: Lista de usuarios
      new_user: Nuevo usuario
      phone: Telefono
      show: Mostrar
    new:
      back: Regresar
    show:
      about_me: Sobre mi persona
      address: Direccion
      back: Regresar
      edit: Editar
      first_name: Nombres
      last_name: Apellidos
      phone: Telefono```
Tuve un problema con la librería `i18n-tasks` relacionado a una llave reservada de nombre `:default`, el asunto es que en las versiones [1.14.4](https://rubygems.org/gems/i18n/versions/1.14.4) y [1.14.3](https://rubygems.org/gems/i18n/versions/1.14.3) de la gema `i18n` tienen una llave con ese nombre y como `i18n-tasks` también lo utiliza, pues se crea un error. Tras correr este comando: `bundle exec i18n-tasks add-missing --verbose` Me salió este error: `"warning: parser/current is loading parser/ruby31, which recognizes 3.1.4-compliant syntax, but you are running 3.1.2.Please see `[`https://github.com/whitequark/parser#compatibility-with-ruby-mri.bundler:`](https://github.com/whitequark/parser#compatibility-with-ruby-mri.bundler:)`` failed to load command: i18n-tasks (/Users/your_computer_namea/.rbenv/versions/3.1.2/bin/i18n-tasks)/Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n/backend/base.rb:65:in `translate': reserved key :default used in "Value. Interpolates: %{value}, %{human_key}, %{key}, %{default}, %{value_or_human_key}, %{value_or_default_or_human_key}" (I18n::ReservedInterpolationKey) from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n.rb:363:in `block in translate_key' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n.rb:362:in `catch' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n.rb:362:in `translate_key' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n.rb:222:in `translate' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/command/dsl.rb:46:in `block in t' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:188:in `try_call' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:155:in `block in optparse_args' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:155:in `map!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:155:in `optparse_args' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:92:in `block (2 levels) in optparse_command!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:91:in `each' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:91:in `block in optparse_command!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/3.1.0/optparse.rb:1102:in `initialize' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:90:in `new' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:90:in `optparse_command!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:80:in `optparse!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:73:in `parse!' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:50:in `block in run' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-1.14.4/lib/i18n.rb:322:in `with_locale' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:49:in `run' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:18:in `block in start' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:211:in `auto_output_coloring' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:17:in `start' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/lib/i18n/tasks/cli.rb:11:in `start' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/i18n-tasks-1.0.13/bin/i18n-tasks:15:in `<top (required)>' from /Users/your_computer_namea/.rbenv/versions/3.1.2/bin/i18n-tasks:25:in `load' from /Users/your_computer_namea/.rbenv/versions/3.1.2/bin/i18n-tasks:25:in `<top (required)>' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli/exec.rb:58:in `load' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli/exec.rb:58:in `kernel_load' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli/exec.rb:23:in `run' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli.rb:451:in `exec' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli.rb:34:in `dispatch' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/cli.rb:28:in `start' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/exe/bundle:28:in `block in <top (required)>' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors' from /Users/your_computer_namea/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/bundler-2.5.9/exe/bundle:20:in `<top (required)>' from /Users/your_computer_namea/.rbenv/versions/3.1.2/bin/bundle:25:in `load' from /Users/your_computer_namea/.rbenv/versions/3.1.2/bin/bundle:25:in `<main>'"`` Lo logré solucionar haciendo varias cosas. \* Haciendo un downgrade de la gema `i18n` a al versión [1.14.1](https://rubygems.org/gems/i18n/versions/1.14.1), pero esta la hice desde el gemfile \* Instalando `i18n-tasks` desde el gemfile Para los dos puntos anteriores solo agregué estas líneas en el archivo gemfile `gem 'i18n', '1.14.1'` `gem 'i18n-tasks'` y luego corrí el comando `bundle install` en la terminal \* Verifiqué que el path de i18n-tasks fuera el correcto: debemos buscar el path de i18n-tasks con el siguiente comando en la terminal `bundle show i18n-tasks` Después debemos agregar este path a nuestro archivo de configuración shell (`~/.bashrc`, `~/.bash_profile`, `~/.zshrc`, etc.) `export PATH="$PATH:$(bundle show i18n-tasks)/bin"` Una vez que guardes el archivo, debes correr el siguiente comando en la terminal (dependiendo de tu archivo de config. de shell) para que los cambios en este archivo tengan efecto en la terminal sin que la cierres y abras: `source ~/.zshrc` Y listo, eso debería solucionar el problema, toma en cuenta que como instalamos todo con bundler, en el gemfile, deberas poner `bundle exec` antes de cualquier comando referente a `i18n-tasks` como `bundle exec i18n-tasks add-missing`

Tambien puedes configurar una unica vez en el config/application.rb pones:

config.i18n.default_locale = :es

.form-inputs
= f.input :nombre , label: t(’.nombre’), as: : text
= f.input :apellido , label: t(’.apellido’)
= f.input :apellido , label: t(’.direccion’)
= f.input :apellido , label: t(’.notas’)
= f.input :apellido , label: t(’.telefono’)

Un compañero explico que no acepta tabulaciones, pero me siguio dando error hasta instalar el i18n-tasks, que creo automaticamente los archivos, y con ello ya funciono.

Que brutal ese feature

Importante
Los archivos YML no soportan el tab para indentar, se tiene que hacer con espacios, si no les lanzará un error

En mi archivo: _form.html.haml:

  .form-inputs
    = f.input :first_name, label: t('users.first_name'), as: :text
    = f.input :last_name, label: t('.last_name')
    = f.input :address, label: t('.address')
    = f.input :about_me, label: t('.about_me')

Hay algo que no me agrada mucho de la gema i18n-tasks . Por cada vista hay que agregar una key disitinta al diccionario incluso si es para el mismo atributo del mismo modelo. Por ejemplo tenemos la key users.form.last_name pero también tenemos la key users.index.users.last_name y ambas tienen el mismo valor. Será que en este caso simplemente la creamos como la key de users.first_name que no le especificamos si era de index o form etc? de manera que sea por asi decirlo global? o hay otra forma más eficiente de hacerlo ?

Genial 💪🏽