打造多语言Rails应用:国际化与部署指南
1. Rails应用国际化之巴西葡萄牙语本地化
在Rails应用中实现国际化是一件相当简单的事情。以将博客应用本地化为巴西葡萄牙语为例,我们只需完成两个关键步骤:添加翻译文件和设置默认语言环境。
1.1 添加翻译文件
巴西葡萄牙语的语言符号是
pt-br
,我们需要修改
config/locales/pt-br.yml
文件。该文件使用与英文翻译文件相同的键,但将英文文本替换为巴西葡萄牙语。以下是一个示例:
pt-br:
general:
are_you_sure: Tem certeza?
back: Volta
cancel: Cancelar
create: Criar
delete: Apagar
edit: Editar
editing: Editando
footer: Um blog simples desenvolvido para o livro
email_a_friend: Avisar um amigo
search: Pesquisar
send_email: Mandar email
show: Mostrar
title: Blog
update: Atualizar
your_name: Seu nome
your_friend_email: O email do seu amigo
or: ou
application:
access_denied: "Por favor, efetue o login para continuar"
articles:
editing_article: Editando Artigo
listing_articles: Listando Artigos
new_article: Novo Artigo
article: artigo
create_success: Artigo foi criado com sucesso.
update_success: Artigo foi atualizado com sucesso.
articles: artigos
notify_friend_success: Seu amigo foi avisado a respeito desse artigo
users:
new_user: Novo Usuario
edit_password: Editar senha
editing_user: Editando usuario
create_success: Usuario editado com sucesso.
update_success: Usuario atualizado com sucesso.
sessions:
email: Email
password: Senha
login: Logar
logout: Desconectar
successful_login: Logado com sucesso
invalid_login: Senha ou Email invalidos
logout_success: Voce desconectou do sistem com sucesso
comments:
name: Nome
email: Email
body: Conteudo
comments: Comentarios
new_comment: Novo Comentario
create_success: Obrigado pelo comentario
create_failure: Nao foi possivel adicionar o comentario
destroy_success: Comentario deletado
add: Adicionar
errors:
not_published_yet: ainda nao foi publicado
activerecord:
errors:
models:
article:
attributes:
title:
blank: "não pode ficar em branco"
body:
blank: "não pode ficar em branco"
date:
formats:
default: "%d/%m/%Y"
short: "%d de %B"
long: "%d de %B de %Y"
day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
order: [:day, :month, :year]
这种将翻译文件与应用代码分离的方式非常实用,例如我们可以将翻译文件交给专业的翻译人员,翻译完成后再将其集成到应用中。
1.2 设置默认语言环境
接下来,我们需要告诉Rails使用
pt-br
作为默认语言环境。在
config/application.rb
文件中添加如下配置:
require File.expand_path('../boot', __FILE__)
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)
module Blog
class Application < Rails::Application
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
config.i18n.default_locale = 'pt-br'
end
end
完成上述两个步骤后,重启服务器,你就可以看到巴西葡萄牙语版本的博客应用了。
2. 打造双语博客
为了让用户能够自主选择语言,我们需要实现一个控制器过滤器,根据用户的输入设置语言环境,并为用户提供一个语言选择器。
2.1 创建语言选择器助手方法
在
app/helpers/application_helper.rb
文件中添加
language_selector
方法:
module ApplicationHelper
# Creates a submit button with the given name with a cancel link
# Accepts two arguments: Form object and the cancel link name
def submit_or_cancel(form, name=t('general.cancel'))
form.submit + " #{t('general.or')} " + link_to(name, 'javascript:history.go(-1);', :class => 'cancel')
end
def language_selector
if I18n.locale == :en
link_to "Pt", url_for(:locale => 'pt-br')
else
link_to "En", url_for(:locale => 'en')
end
end
end
该方法会根据当前的语言环境显示不同的语言链接。
2.2 在应用布局中使用语言选择器
在
app/views/layouts/application.html.erb
文件中调用
language_selector
方法:
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<%= stylesheet_link_tag :all %>
<%= javascript_include_tag 'jquery-1.4.2.min', 'rails', 'application' %>
<%= csrf_meta_tag %>
</head>
<body>
<div id="header">
<h1><%= link_to t('general.title'), root_path %></h1>
<%= language_selector %>
<div id="user_bar">
<% if logged_in? %>
<%= link_to t('articles.new_article'), new_article_path %> |
<%= link_to t('users.edit_password'), edit_user_path(current_user) %> |
<%= link_to t('sessions.logout'), logout_path %>
<% else %>
<%= link_to t('sessions.login'), login_path %>
<% end %>
</div>
</div>
<div id="main">
<%= content_tag(:p, notice, :class => 'notice') if notice.present? %>
<%= content_tag(:p, alert, :class => 'alert') if alert.present? %>
<%= yield %>
</div>
<div id="footer">
<%= t('general.footer') %> <a href="http://beginningrails.com">Beginning Rails 4</a>
</div>
</body>
</html>
2.3 设置语言环境的前置过滤器
在
app/controllers/application_controller.rb
文件中添加
set_locale
方法:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :set_locale
protected
# Set the locale from parameters
def set_locale
I18n.locale = params[:locale] unless params[:locale].blank?
end
# Returns the currently logged in user or nil if there isn't one
def current_user
return unless session[:user_id]
@current_user ||= User.find_by_id(session[:user_id])
end
# Make current_user available in templates as a helper
helper_method :current_user
# Filter method to enforce a login requirement
# Apply as a before_filter on any controller you want to protect
def authenticate
logged_in? || access_denied
end
# Predicate method to test for a logged in user
def logged_in?
current_user.is_a? User
end
# Make logged_in? available in templates as a helper
helper_method :logged_in?
def access_denied
redirect_to login_path,
:notice => t('application.access_denied') and return false
end
end
最后,将
config/application.rb
文件中的
config.i18n.default_locale
行删除,将应用的语言环境配置改回英文,这样用户就可以自主选择语言了。重启服务器后,你会看到应用默认以英文加载,点击
Pt
链接,应用将切换为巴西葡萄牙语。
3. Rails应用部署到Heroku
与PHP和Java的部署方式不同,Rails应用的部署有多种方式。这里我们选择使用Heroku这个平台即服务(PAAS)来部署应用,它可以帮助我们处理服务器和数据库,让我们专注于构建优秀的应用。
3.1 创建Heroku账户
访问
www.heroku.com
,点击注册链接,输入电子邮件地址。Heroku会发送一封带有确认链接的电子邮件,点击该链接后,设置密码和确认密码,即可成功创建账户。同时,我们还需要安装Heroku Toolbelt(https://toolbelt.heroku.com/),根据不同的操作系统按照相应的说明进行安装。
3.2 准备Git仓库
在终端中进入项目所在目录,执行以下命令初始化Git仓库:
$ git init
然后将所有文件添加到Git仓库并进行初始提交:
$ git add .
$ git commit -m 'Initial Commit'
3.3 在Heroku上创建应用
使用命令行界面在Heroku上创建应用:
$ heroku login
$ heroku create
如果需要指定应用名称,可以在
heroku create
后面加上名称,例如:
$ heroku create chunky-bacon
3.4 修改Gemfile文件
打开
Gemfile
文件,将
gem 'sqlite3'
修改为:
gem 'sqlite3', group: [:development, :test]
并在其下方添加以下两行:
gem 'rails_12factor', group: :production
gem 'pg', group: :production
保存
Gemfile
后,执行以下命令让bundler安装所需的gems:
bundle --without production
然后将
Gemfile
和
Gemfile.lock
的更改提交到Git仓库:
$ git add Gemfile
$ git add Gemfile.lock
$ git commit -m "Added gems to support heroku deployment"
3.5 部署应用
执行以下命令将应用部署到Heroku:
$ git push heroku master
部署完成后,执行数据库迁移:
$ heroku run rake db:migrate
最后,在浏览器中访问应用的URL(如
http://floating-shore-4610.herokuapp.com/
),即可看到部署好的应用。
如果需要在Heroku上使用控制台,可以执行以下命令:
$ heroku run console
通过以上步骤,我们不仅实现了Rails应用的国际化,还将其成功部署到了Heroku平台,让更多人能够访问和使用我们的应用。
总结
通过上述步骤,我们完成了Rails应用的国际化和部署。首先,我们将博客应用本地化为巴西葡萄牙语,通过添加翻译文件和设置默认语言环境实现了单语言的本地化。接着,我们打造了一个双语博客,让用户可以自主选择语言。最后,我们使用Heroku平台将应用部署到线上,让更多人能够访问我们的应用。整个过程并不复杂,希望这些步骤能够帮助你打造出优秀的多语言Rails应用。
以下是整个过程的流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(国际化配置):::process
B --> B1(添加巴西葡萄牙语翻译文件):::process
B --> B2(设置默认语言为pt - br):::process
B1 --> B3(重启服务器查看效果):::process
B2 --> B3
B3 --> C(实现双语博客):::process
C --> C1(创建语言选择器助手方法):::process
C --> C2(在布局中使用语言选择器):::process
C --> C3(设置语言环境前置过滤器):::process
C1 --> C4(修改默认语言配置让用户自主选择):::process
C2 --> C4
C3 --> C4
C4 --> D(部署应用到Heroku):::process
D --> D1(创建Heroku账户):::process
D --> D2(准备Git仓库):::process
D --> D3(在Heroku上创建应用):::process
D --> D4(修改Gemfile文件):::process
D1 --> D5(部署应用到Heroku):::process
D2 --> D5
D3 --> D5
D4 --> D5
D5 --> D6(执行数据库迁移):::process
D6 --> D7(访问应用URL查看效果):::process
D7 --> E([结束]):::startend
以下是步骤总结表格:
| 步骤 | 操作内容 |
| — | — |
| 国际化配置 | 添加巴西葡萄牙语翻译文件,设置默认语言为pt - br,重启服务器 |
| 双语博客实现 | 创建语言选择器助手方法,在布局中使用语言选择器,设置语言环境前置过滤器,修改默认语言配置 |
| 应用部署 | 创建Heroku账户,准备Git仓库,在Heroku上创建应用,修改Gemfile文件,部署应用到Heroku,执行数据库迁移,访问应用URL |
打造多语言Rails应用:国际化与部署指南
4. 国际化与部署的优势分析
在前面的内容中,我们已经完成了Rails应用的国际化和部署到Heroku的操作。下面来分析一下这两个操作分别带来的优势。
4.1 国际化的优势
- 扩大用户群体 :通过将应用本地化为不同的语言,能够吸引来自不同语言背景的用户。例如,将博客应用本地化为巴西葡萄牙语后,巴西的用户可以更方便地使用该应用,从而扩大了应用的用户范围。
- 提升用户体验 :当用户能够以自己熟悉的语言使用应用时,他们会感到更加舒适和便捷。这有助于提高用户对应用的满意度和忠诚度。
- 便于维护和更新 :将翻译文件与应用代码分离,使得维护和更新翻译内容变得更加容易。可以将翻译文件交给专业的翻译人员进行处理,而不会影响到应用的代码结构。
4.2 部署到Heroku的优势
- 简单快捷 :相比于PHP和Java的部署方式,Heroku的部署过程更加简单快捷。只需要通过几个命令就可以将应用部署到线上,大大节省了时间和精力。
- 无需管理服务器和数据库 :Heroku作为一个平台即服务(PAAS),会帮助我们处理服务器和数据库的管理工作。我们可以将更多的精力放在应用的开发和优化上。
- 支持免费使用 :对于开发者的小型应用,Heroku提供免费的使用套餐。这使得开发者可以在不花费太多成本的情况下,将应用部署到线上进行测试和使用。
5. 可能遇到的问题及解决方案
在进行国际化和部署的过程中,可能会遇到一些问题。下面列举一些常见的问题及相应的解决方案。
5.1 国际化问题
- 翻译文件格式错误 :如果翻译文件的格式不正确,可能会导致应用无法正确显示翻译内容。在编写翻译文件时,要确保格式的正确性,例如YAML文件的缩进和语法要符合规范。
- 部分文本未翻译 :在提取硬编码文本和字符串时,可能会遗漏一些文本。在完成翻译文件后,要仔细检查应用的各个页面,确保所有的文本都已经被正确翻译。
5.2 部署问题
-
Gem依赖问题
:在修改
Gemfile文件后,如果没有正确处理Gem的依赖关系,可能会导致部署失败。在执行bundle --without production命令时,要确保所有的依赖都已经正确安装。 -
数据库迁移失败
:在执行
heroku run rake db:migrate命令时,可能会遇到数据库迁移失败的情况。这可能是由于数据库配置不正确或者迁移脚本存在问题。要检查数据库的配置信息,并确保迁移脚本的正确性。
6. 进一步优化建议
为了让应用更加完善,我们可以对国际化和部署进行进一步的优化。
6.1 国际化优化
- 添加更多语言支持 :除了巴西葡萄牙语,还可以考虑添加更多的语言支持,如中文、法语、德语等。只需要按照前面的步骤添加相应的翻译文件,并进行配置即可。
- 动态加载翻译文件 :对于一些大型应用,翻译文件可能会比较大。可以考虑采用动态加载翻译文件的方式,只在需要的时候加载相应的翻译内容,以提高应用的性能。
6.2 部署优化
- 使用持续集成和持续部署(CI/CD) :通过使用CI/CD工具,如Jenkins、GitLab CI/CD等,可以实现自动化的部署流程。每次代码更新后,自动进行测试和部署,提高部署的效率和准确性。
- 监控应用性能 :在应用部署到Heroku后,要对应用的性能进行监控。可以使用Heroku提供的监控工具,或者第三方的监控工具,如New Relic等,及时发现和解决性能问题。
总结回顾
通过本文,我们详细介绍了如何实现Rails应用的国际化和部署到Heroku平台。具体步骤如下:
1.
国际化
- 单语言本地化:添加巴西葡萄牙语翻译文件,设置默认语言环境。
- 双语博客实现:创建语言选择器,设置语言环境前置过滤器,让用户自主选择语言。
2.
部署到Heroku
- 创建Heroku账户,安装Heroku Toolbelt。
- 准备Git仓库,进行初始提交。
- 在Heroku上创建应用,可指定应用名称。
- 修改Gemfile文件,处理Gem依赖。
- 部署应用到Heroku,执行数据库迁移。
同时,我们还分析了国际化和部署的优势,列举了可能遇到的问题及解决方案,并给出了进一步的优化建议。希望这些内容能够帮助你打造出更加优秀的多语言Rails应用。
以下是一个简单的mermaid流程图,展示了整个优化过程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(国际化优化):::process
B --> B1(添加更多语言支持):::process
B --> B2(动态加载翻译文件):::process
B1 --> C(部署优化):::process
B2 --> C
C --> C1(使用CI/CD):::process
C --> C2(监控应用性能):::process
C1 --> D([结束]):::startend
C2 --> D
以下是优化建议的总结表格:
| 优化方向 | 具体建议 |
| — | — |
| 国际化优化 | 添加更多语言支持,动态加载翻译文件 |
| 部署优化 | 使用持续集成和持续部署(CI/CD),监控应用性能 |
超级会员免费看
16

被折叠的 条评论
为什么被折叠?



