---
title: i18n筆記
description: i18n
robots: noindex, nofollow
lang: zh-tw
dir: ltr
breaks: true
tags: i18n
disqus: hackmd
---
# i18n筆記
參考連結:
[Rails I18n 實作技巧 by 王信凱](https://hackmd.io/@Y7-oRV7UQKumWqYe3e0tOQ/HJarJWGd?print-pdf)
[使用env['rack.locale']要先裝這個gem](https://github.com/rack/rack-contrib)
## Rack::Locale Setting
`app/middlewares/rack/locale_without_setting.rb`
這邊設定`env['rack.locale']`
**不知這檔案是自動產生還是自己寫**
```ruby
require 'i18n'
class Rack::LocaleWithoutSetting < Rack::Locale
def call(env)
locale = accept_locale(env) || I18n.default_locale
locale = env['rack.locale'] = locale.to_s
status, headers, body = @app.call(env)
headers['Content-Language'] = locale unless headers['Content-Language']
[status, headers, body]
end
end
```
有看到專案在這邊有設定middleware
`config/initializers/middlewares.rb`
```ruby=
require Rails.root.join('app', 'middlewares', 'theme_cacheable')
require Rails.root.join('app', 'middlewares', 'secure_cookie')
require Rails.root.join('app', 'middlewares', 'action_logger')
Cyberbiz::Application.configure do
config.middleware.insert_after ActionDispatch::Session::CookieStore, ThemeCacheable
config.middleware.insert_before ActionDispatch::Cookies, SecureCookie
config.middleware.insert_before Rails::Rack::Logger, ActionLogger
unless ENV['RACK_ATTACK_DISABLE'] == '1'
config.middleware.insert_after Rack::Attack, Rack::LocaleWithoutSetting
else
config.middleware.insert_after Warden::Manager, Rack::LocaleWithoutSetting
end
end
```
可以在 `app_controller.rb`寫
```ruby=
before_action :set_locale unless Rails.env.production?
private
def set_locale
I18n.locale = request.env['rack.locale']
end
```
應該就可以偵測瀏覽器語言來轉換i18n語系?
## 當翻譯內含有html
參考連結:
https://stackoverflow.com/questions/3626038/use-html-inside-a-rails-translation-file
https://guides.rubyonrails.org/i18n.html#using-safe-html-translations
```ruby=
en:
welcome: <b>welcome!</b>
hello_html: <b>hello!</b>
title:
html: <b>title!</b>
```
在 key 上加上 `_html` 就可以進行轉義如果沒有加上在檢查safe html時就會被擋然後直接渲染 原始碼文字出現
```ruby
<div><%= t('welcome') %></div>
<div><%= raw t('welcome') %></div>
<div><%== t('welcome') %></div> // raw 跟 == 是一樣的
<div><%= t('hello_html') %></div>
<div><%= t('title.html') %></div>
```

## 換行
可以使用`>` or `|` 兩個差別只有後者遇到空白就給換行符號`\n`前者在最後才有

## i18n in PORO
擴充 Module
`extend ActivedModel::Translation`
```ruby
class MyClass
extend ActivedModel::Translation
end
MyClass.model_name.human
# => "MyClass"
MyClass.human_attribute_name(:my_attribute)
# => "My attribute"
```