2010-12-30 34 views
10

Tôi đang làm việc trên một dự án đa ngôn ngữ với Zend Framework (tiếng Đức và tiếng Anh), nơi tôi có một biểu mẫu nhỏ để đặt hàng một sản phẩm. Người dùng sẽ có thể:Thực tiễn tốt nhất để xử lý ngôn ngữ bằng các công cụ chuyển tiền và ngôn ngữ

  • đổi tiền tệ ưa thích của mình cho giá sản phẩm
  • Thay đổi ngôn ngữ ưa thích của mình cho toàn bộ trang web

Tại thời điểm này tôi sử dụng Zend_Locale :: findLocale() để lấy ngôn ngữ của người dùng. Với cài đặt trình duyệt của tôi, tôi nhận được 'de_CH' và hoạt động tốt. Nhưng có một số vấn đề càng sớm càng:

  • Người dùng đã cấu hình trình duyệt của mình để chỉ cho tôi mã ngôn ngữ ('de' thay vì 'de_CH')
  • Người dùng thích một ngôn ngữ mà không được hỗ trợ bởi trang web của tôi
  • người dùng là từ một đất nước mà họ nhận được một đồng tiền mà không được hỗ trợ bởi mẫu đơn đặt hàng sản phẩm của tôi

Chỉ cần mã ngôn ngữ mã ngôn ngữ là đủ để xử lý Zend_Translate, b ut Zend_Currency cần thêm thông tin. Tôi nghĩ rằng không có giải pháp nào để có được ngôn ngữ đầy đủ với mã quốc gia từ mọi người dùng có thể. Câu hỏi của tôi là: làm thế nào để bạn xử lý các tình huống này? Bạn có kiểm tra trong bootstrap của bạn _initLocale() nếu một mã quốc gia bị thiếu và sử dụng một mã quốc gia mặc định? Có bất kỳ phương pháp Zend Framework nào để làm điều đó không?

Ngôn ngữ không được hỗ trợ Nếu ngôn ngữ người dùng là 'fr', tôi muốn sử dụng ngôn ngữ mặc định vì trang web của chúng tôi không hỗ trợ tiếng Pháp. Có một khả năng tốt hơn để thêm một mảng danh sách trắng trong bootstrap? Ví dụ một phương thức từ Zend_Translate?

Đơn vị tiền tệ không được hỗ trợ Điều gì sẽ xảy ra nếu ngôn ngữ của người dùng được hỗ trợ chứ không phải tiền tệ của người đó? Tôi có nên thay đổi ngôn ngữ trong bootstrap hay tôi nên tạo một bản sao của miền địa phương và thay đổi nó cho Zend_Currency?

Vấn đề chính Tôi nghĩ vấn đề chính của tôi là tôi không chắc chắn cách xử lý tất cả các vấn đề địa phương khác nhau này. Cách tiếp cận ưa thích của tôi là xác minh miền địa phương được đặt trong bootstrap's _initLocale(), vì vậy tôi có thể chắc chắn rằng tôi có thể hỗ trợ ngôn ngữ và tiền tệ của nó.

Cảm ơn lời khuyên của bạn.

Trân trọng, Nico

Editing 1 Tôi đã thực hiện bản thân mình một vài suy nghĩ thêm về một cách để xử lý những vấn đề này. Bạn nghĩ gì về phương pháp này?

  1. Zend_Locale(): lọc tất cả ngôn ngữ ngắn (không có mã quốc gia) và sử dụng danh sách trắng với ngôn ngữ mà ứng dụng của bạn hỗ trợ (chỉ mã ngôn ngữ). Nếu không có kết quả phù hợp, hãy sử dụng ứng dụng mặc định của bạn.
  2. Zend_Translate: bắt đầu bằng mã ngôn ngữ từ ngôn ngữ.Nhưng nếu người dùng thay đổi ngôn ngữ ưa thích, hãy để lại ngôn ngữ như vậy (có lẽ không có ngôn ngữ phù hợp dựa trên mã ngôn ngữ mới và mã quốc gia cũ) và chỉ thay đổi mã ngôn ngữ trong Zend_Translate.
  3. Zend_Currency: Sử dụng ngôn ngữ làm mặc định. Nếu người dùng thay đổi đơn vị tiền tệ ưa thích, chỉ cần thay đổi đơn vị tiền tệ chứ không thay đổi ngôn ngữ. Vì vậy, định dạng sẽ vẫn dựa trên ngôn ngữ cũ vì thay đổi đơn vị tiền tệ không có nghĩa là người dùng cũng muốn thay đổi ngôn ngữ của mình.

Cách tiếp cận này có thể chấp nhận được không? Có một vấn đề với bước 1 nếu trình duyệt miền địa phương được thiết lập như thế này:

  • de
  • en_US

Có lẽ ứng dụng không hỗ trợ tiếng Đức, nhưng vì nó là một miền địa phương ngắn, ứng dụng sẽ sử dụng en_US để thay thế. Nhưng tôi không biết giải pháp nào sẽ khắc phục vấn đề này, bởi vì tôi không thể 'nâng cấp' một ngôn ngữ ngắn thành một miền địa phương đầy đủ.

+2

Tôi không chắc chắn nếu điều này sẽ giúp, nhưng là một người sử dụng tôi ghét cay ghét đắng các ứng dụng và các trang web mà cố gắng để tìm ra ngôn ngữ của tôi cho tôi. Tôi nghĩ tốt hơn hết là nên có một nút ngôn ngữ hoặc thả xuống trên trang web của bạn. Lợi ích cho bạn là bạn không phải lo lắng về việc phát hiện các kết hợp ngôn ngữ kỳ lạ. – Matt

+0

+1 về đề xuất của Matt. Tôi bối rối là tại sao bạn muốn hỗ trợ mọi ngôn ngữ và tiền tệ. Bạn có thể sẽ dịch trang web của mình chỉ còn tối đa 5 đến 10 ngôn ngữ. Vì vậy, cố gắng để 'phát hiện' một miền địa phương và làm bất cứ điều gì kỳ diệu là cần thiết để tìm đúng ngôn ngữ có thể là không cần thiết. Điều gì về những người đến từ Amsterdam, những người thích tiếng Anh hoặc tiếng Pháp, nhưng trang web của bạn phát hiện họ sẽ hiểu tiếng Hà Lan nhiều khả năng nhất? Tôi bỏ phiếu cho một bộ chọn ngôn ngữ/tiền tệ. HÔN. –

+0

OK, nhưng để có thể tạo ra ngôn ngữ đầy đủ, người dùng cũng phải chọn quốc gia của mình. Hoặc người nào khác tôi sẽ sản xuất tiền tệ được chọn một cách sai lầm (12.000 EUR - thay vì 12'000 EUR chẳng hạn). Nhưng có, có lẽ K.I.S.S. là đường bên phải ở đây ;-). Cảm ơn bạn đã gợi ý. – Nico

Trả lời

1

Sự cố bạn đánh dấu là phổ biến và tôi tưởng tượng một lượng nhỏ công việc sẽ được yêu cầu để đặt ngôn ngữ cho người dùng của bạn.

de to de_DE yêu cầu bạn biết liệu chúng có nằm ở Đức hay không nhưng điều này có thể mặc định là de_CH là địa phương của bạn, nếu bạn không biết địa phương của người dùng.

* The user has configured his browser to just give me the language code ('de' instead of 'de_CH') 

Lập bản đồ này trong ứng dụng của bạn. Bản đồ của bạn có thể chuyển đổi thành de_DE cho người dân ở Đức nói tiếng Đức. Hoặc de_CH cho người dân ở Thụy Sĩ nói tiếng Đức. Hoặc fr_CH cho cư dân của Thụy Sĩ nói tiếng Pháp và vv cho người nói tiếng Anh, nó sẽ là en_CH hoặc en_DE. Vì vậy, điều này giải quyết 2 vấn đề.

Ngôn ngữ người dùng và vị trí là cần thiết để xác định ngôn ngữ cho người dùng một cách chính xác.

Nếu bạn không biết vị trí bạn nên mặc định theo ngôn ngữ và địa phương mặc định của riêng bạn.

Link: Unicode - locality and language mapping

* The user prefers a language which is not supported by my website 

Bạn nên có một ngôn ngữ mặc định và tiền tệ, nếu bạn đang ở châu Âu sau đó lựa chọn sẽ là bất cứ điều gì là địa phương mặc định của bạn và ngôn ngữ, nếu bạn là Thụy Sĩ sau đó de_CH có ý nghĩa.

* The user is from a country where they got a currency which isn't supported by my product order form 

Trong trường hợp này, bạn nên hoàn nguyên về mặc định của mình.

Zend có nhiều ví dụ về cách sử dụng Locales trên wiki của họ. Nơi phổ biến nhất để thiết lập địa phương trong Zend là tệp bootstrap.

Tôi đã sử dụng liên kết này để tham khảo hỗ trợ cho phản hồi này trên Zend Framework wiki. Đoạn mã dưới đây cung cấp một ví dụ nhỏ về cách lớp Zend_Locale ném ra các ngoại lệ nếu ngôn ngữ không hợp lệ. Bạn có thể kiểm tra vị trí và ngôn ngữ tại thời điểm này và sử dụng kết hợp với thông tin bạn nhận được từ trình duyệt để đặt ngôn ngữ chính xác cho người dùng.

Link: Zend Locale Introduction

// within the bootstrap file 
    try { 
     $locale = new Zend_Locale('auto'); 
    } catch (Zend_Locale_Exception $e) { 
     $locale = new Zend_Locale('de'); 
    } 
    // within your model/controller 
    $date = new Zend_Date($locale); 
    $currency = new Zend_Currency($locale) 
+0

Cảm ơn bạn rất nhiều. – Nico

+0

Không có vấn đề, chúc may mắn với dự án của bạn. –

0

Đây là một bài viết tôi đã viết về bản địa hóa mà tôi nghĩ bạn có thể thấy hữu ích khi trả lời một số câu hỏi của bạn.

http://phpadvent.org/2010/localization-by-anthony-gentile

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng cách tiếp cận này sẽ vẫn gây ra một số vấn đề ở các quốc gia với các ngôn ngữ khác nhau. Ngoài ra tôi không thể sử dụng en_US cho mọi quốc gia nói tiếng Anh. – Nico

0

Trong trường hợp của tôi, tôi muốn hỏi người dùng chọn ngôn ngữ và tiền tệ của họ khi họ lần đầu tiên ghé thăm trang web của tôi. trong ngôn ngữ chọn giao diện tôi đã lấy mã ngôn ngữ từ trình duyệt của người dùng như là một tham chiếu của ngôn ngữ mặc định. và tôi cũng cung cấp nút chuyển đổi ngôn ngữ nhanh trong trang web của tôi.

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