2009-12-03 29 views
7

làm ví dụ, tôi có một tập tin mặc định locale tiếng anh "en.yml" với nội dung:ray - làm thế nào để tự động thêm/override từ ngữ để i18n yaml

en: 
    messages: messages 
    users: users 

bây giờ, có một khách hàng mà muốn thông điệp được đặt tên cho các cuộc thảo luận trong sản phẩm của mình, nhưng người dùng vẫn nên là người dùng. vì vậy những gì tôi muốn làm là để tạo ra "customer.en.yml" tập tin

en: 
messages: discussions 

đó sẽ ghi đè mặc định "thông điệp" dịch thuật, nhưng sẽ giữ tất cả các từ khác tương tự. làm thế nào tôi có thể đạt được nó?

vì nếu tôi tải en.yml với:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 

và sau đó tải customer.en.yml (APP_CONFIG [ 'customer_name'] được định nghĩa trước đó) với

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales', APP_CONFIG['customer_name']+'.{rb|yml}')] 

nó sẽ chỉ ghi đè ngôn ngữ "en" của tôi và bản dịch "người dùng" sẽ biến mất, phải không?

Trả lời

3

Không nên ghi đè ngôn ngữ "en" của bạn. Bản dịch được hợp nhất. store_translations trong backend i18n đơn giản gọi merge_translations, trông như thế này:

# Deep merges the given translations hash with the existing translations 
# for the given locale 
def merge_translations(locale, data) 
    locale = locale.to_sym 
    translations[locale] ||= {} 
    data = deep_symbolize_keys(data) 

    # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } 
    translations[locale].merge!(data, &merger) 
end 

Như bạn có thể thấy, chỉ có các phím bạn nhập vào các tập tin yml dịch sau này sẽ được ghi đè.

1

Tôi muốn một cái gì đó tương tự khi chúng tôi đã viết một bản dịch pirate.yml, nhưng tôi muốn bất cứ điều gì không được định nghĩa trong pirate.yml để mặc định những gì chúng tôi đã có trong en.yml.

Những gì tôi đã viết có thể được tìm thấy trên Github.

+0

Liên kết Github không hợp lệ nữa! –

+0

Không hợp lệ? Trong khi nó là một dự án rất cũ, liên kết vẫn hoạt động cho tôi. Bạn đang nhận được một 404? –

+0

Chính xác một 'trang không tìm thấy' là những gì tôi nhận được! –

-1

Tôi nghĩ bạn có thể đang trộn lẫn hai thứ khác nhau.

Tệp i18n dành cho bản dịch.

Nếu bạn có một khách hàng cần một tên cụ thể cho một số trường, đó không phải là vấn đề dịch thuật, mà là chức năng.

Nói cách khác, tôi nghĩ rằng bạn cần một cái gì đó như thế này:

en: 
    messages: messages 
    users: users 
    discussions: discussions 

Và sau đó thêm các chức năng cụ thể ở một nơi khác, ví dụ theo quan điểm của bạn:

if(customer.needs_discussions?) 
<%= t(:discussions) %> 
else 
<%= t(:messages) %> 
end 

Ngoài ra, bạn có thể thêm một thuộc tính chuỗi cho khách hàng của bạn, mặc định là 'thư'. Sau đó xem bạn sẽ trông như thế này:

<%= t(customer.messages_field_name) %> 
+2

tốt, sau đó nếu anh ta cần 200 thay đổi trong từ ngữ, tôi phải viết 200 ifs và thêm 200 cài đặt khách hàng, và giống nhau cho mỗi khách hàng khác sử dụng sản phẩm theo cách riêng của mình. điều này sẽ làm tăng đáng kể số lượng mã. và, nếu khách hàng cụ thể rời đi, tất cả những người đó sẽ ở lại trong mã, trong khi ngược lại tôi chỉ xóa ghi đè dịch. –

+0

Mã chỉ là một ví dụ - điều tôi muốn nói là bạn không nên sử dụng i18n cho điều đó. Tôi đã chỉnh sửa bình luận của mình với các giải pháp khác. Nếu bạn tiếp tục suy nghĩ về việc sử dụng i18n, hãy suy nghĩ về những gì sẽ xảy ra khi bạn phải dịch ứng dụng của bạn sang tiếng Pháp, chẳng hạn. – kikito

+1

tôi đã có i18n tiếng Pháp và tiếng Anh, và trên đầu trang của họ tôi tải trọng ghi đè của khách hàng. Tôi có miền địa phương/en.yml, locale/fr.yml và trên đầu trang của chúng tôi tải miền địa phương/customer.en.yml và miền địa phương/customer.fr.yml, nếu cần. tôi xin lỗi, nhưng tôi thực sự nghĩ rằng cách này là tốt hơn cho các tùy chỉnh từ ngữ đơn giản –

5

Sử dụng i18n.fallbacks

Tôi không chắc chắn khi điều này đã được thêm vào Rails, nhưng trong 4.2.2 bạn có thể làm:

# application.rb 
# If key is not found in a locale, we look in fallback 
config.i18n.fallbacks = { 
    "locale_1" => "en", 
    "locale_2" => "en", 
    "locale_3" => "de", 
} 

Nếu bạn cũng đặt config.action_view.raise_on_missing_translations = true (mà tôi làm trong phát triển và thử nghiệm), nó sẽ tăng chỉ khi một phím không tìm thấy trong miền địa phương hay dự phòng.

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