面试题答案
一键面试国际化功能性能优化 - 缓存策略
- 视图层面缓存
- 原理:在 Rails 中,可以使用页面缓存或片段缓存。页面缓存将整个 HTML 页面缓存起来,适合不需要频繁更新且国际化内容相对固定的页面。片段缓存则缓存页面中的部分内容,对于国际化场景,可将包含国际化文本的片段进行缓存。
- 示例:
- 页面缓存:在
config/environments/production.rb
中配置
在控制器中,比如config.action_controller.perform_caching = true
HomeController
class HomeController < ApplicationController caches_page :index end
- 片段缓存:在视图文件
app/views/home/index.html.erb
中<% cache('internationalized_text') do %> <%= t('home.welcome_message') %> <% end %>
- 页面缓存:在
- 翻译文件缓存
- 原理:Rails 加载翻译文件通常是从磁盘读取。可以将翻译文件缓存到内存中,减少磁盘 I/O 操作。
- 示例:使用
I18n.cache_translations = true
开启缓存,默认情况下,Rails 会将翻译文件缓存到内存中。也可以自定义缓存存储,比如使用ActiveSupport::Cache::MemoryStore
。
i18n_store = ActiveSupport::Cache::MemoryStore.new I18n.backend = I18n::Backend::Simple.new(i18n_store)
动态切换语言及确保页面和操作响应新语言设置
- 底层原理
- Rails 使用
I18n
模块来处理国际化。I18n.locale
用于设置当前语言环境。当用户切换语言时,需要更新I18n.locale
,并且通知已加载页面和后续操作使用新的语言环境。
- Rails 使用
- 实现代码示例
- 控制器层面:在
ApplicationController
中添加语言切换逻辑class ApplicationController < ActionController::Base before_action :set_locale def set_locale I18n.locale = params[:locale] || I18n.default_locale end end
- 视图层面:在布局文件
app/views/layouts/application.html.erb
中添加语言切换链接<% I18n.available_locales.each do |locale| %> <%= link_to locale, {locale: locale} %> <% end %>
- JavaScript 层面:为了确保已加载页面上的动态内容(如通过 AJAX 加载的部分)也能正确切换语言,可以在前端使用 JavaScript 来更新相关内容。假设使用 jQuery,结合 Rails 的
data - attributes
- 在视图中,给需要动态更新语言的元素添加
data - attribute
,如<div data - i18n - key="home.welcome_message" class="i18n - element"><%= t('home.welcome_message') %></div>
- 在 JavaScript 文件(如
app/assets/javascripts/application.js
)中$(document).on('click', 'a[href*="locale="]', function (e) { e.preventDefault(); var newLocale = $(this).attr('href').split('=')[1]; $.ajax({ url: '/set_locale', method: 'GET', data: {locale: newLocale}, success: function () { $('.i18n - element').each(function () { var key = $(this).data('i18n - key'); $(this).text(I18n.t(key)); }); } }); });
- 在控制器中添加
set_locale
方法class ApplicationController < ActionController::Base def set_locale I18n.locale = params[:locale] head :ok end end
- 在视图中,给需要动态更新语言的元素添加
- 路由层面:在
config/routes.rb
中添加路由get '/set_locale', to: 'application#set_locale'
- 控制器层面:在