2015-09-25 24 views
6

Tôi nhận được một ngoại lệ I18n::InvalidLocale: "zh-CN" is not a valid locale mà tôi muốn tránh.Làm cách nào để tránh I18n :: InvalidLocale?

Để giải quyết nó, tôi đã nghe nói về hai hacks:

# meh 
config.i18n.enforce_available_locales = false 

# Ever heard of convention over configuration? 
config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"] 

Không ai trong số họ có vẻ sạch sẽ với tôi, bởi vì nếu không chạm vào các biến cấu hình, tôi đã có một loạt các miền địa phương có sẵn mà được automagically điền sẵn:

available_locales hiện tại của tôi là:

> I18n.available_locales 
=> [:en, :fr] (misses zh-CN and zh-TW) 

Trong thư mục config/locales tôi, tôi có:

en.yml 
fr.yml 
zh-CH.yml (newly added, and unavailable) 
zh-TW.yml (newly added, and unavailable) 

Trong tôi config/application.rb, tôi có:

config.i18n.default_locale = :fr 

Tôi không hiểu thế nào fr đã Automagically vào I18n.available_locales, khi zh-CNzh-TW có không .

Tuy nhiên, có fr nhập nó mà không tôi thiết config.i18n.available_locales nói với tôi rằng chạm vào cấu hình này biến không phải là cách sạch sẽ để đi.

Bạn có gợi ý tránh trường hợp ngoại lệ I18n::InvalidLocale ở mức đúng mức không?

+0

khởi động lại máy chủ? –

+0

Cảm ơn huan, nhưng nó không làm các trick. –

+0

José, 'config.i18n.fallbacks = true' làm gì? –

Trả lời

5

Thư viện i18n có cách tiếp cận thực dụng cho các phím địa phương, bao gồm chỉ phần địa phương ("ngôn ngữ"), như: vi,: pl, không phải là phần khu vực, như: en-US hoặc: en-GB, nếu bạn muốn loại kiểm tra này defination Vài đá quý như Globalize3 nó có thể giúp bạn.

Ngoài ra kiểm tra descussion này cũng trải qua với this

Và cũng loại bỏ các config.i18n.default_locale = :fr Bởi vì với người dân địa phương mặc định nó sẽ thông qua các lỗi tương tự mà bạn đề cập đến như vậy sau khi loại bỏ defaullt sử dụng này config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

+0

Đây không thực sự là câu hỏi, nhưng cảm ơn. Khi tôi sẽ gặp vấn đề với các bản dịch tiếng Trung, tôi sẽ nhớ kiểm tra liên kết của bạn. * Câu hỏi du jour * là: làm thế nào để nạp I18n với miền địa phương có sẵn mà không cần thiết lập global_locales toàn cầu? –

+0

@ GwendalRoué cập nhật câu trả lời kiểm tra xem nó – Arvind

+0

Tất cả các quyền Arv. Cảm ơn các liên kết! –

0

Don' t đặt ngôn ngữ thành giá trị không hợp lệ.

class ApplicationController < ActionController::Base 
    before_action :set_locale 

    def set_locale 
    [params[:locale], cookies[:locale], extract_locale, I18n.default_locale].each do |l| 
     if l && I18n.available_locales.index(l.to_sym) 
     I18n.locale = l 
     break 
     end 
    end 
    cookies[:locale] = params[:locale] if params[:locale] 
    end 

    def extract_locale 
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE'] 
    end 

Kiểm tra để đảm bảo miền địa phương tồn tại trước khi cài đặt.

Các vấn đề liên quan