28、打造多语言Rails应用:国际化与部署指南

打造多语言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),监控应用性能 |

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值