2011-10-26 39 views
11

Vấn đề:
Tôi sắp triển khai ngôn ngữ bản địa cho một ứng dụng ipad đã rất lớn được xây dựng bằng cách sử dụng sencha touch bọc trong thẻ điện thoại. Tôi có bản dịch tiếng Anh và tiếng Tây Ban Nha trong các tệp json.Phonegap/Sencha Ngôn ngữ bản địa hóa

Những gì tôi đang lập kế hoạch về Làm:
tôi có kế hoạch để tải các tập tin json vào một cửa hàng sencha touch, tạo ra một đối tượng toàn cầu. Sau đó, ở mỗi nơi mà tôi gọi văn bản được hiển thị, tôi sẽ thay thế văn bản bằng một cuộc gọi đến đối tượng chung.

Câu hỏi của tôi (s):

  1. Có một cách dễ dàng hơn để thực hiện nội địa hóa ngôn ngữ với việc thiết lập của tôi?

  2. Tôi có gặp phải vấn đề với công cụ sencha bản địa (như trình chỉnh sửa ngày) không?

  3. Khi tải/tải lại file ngôn ngữ json, tôi sẽ có hiệu suất vấn đề (đòi hỏi một webview reload ?, đối tượng sencha vấn đề thay đổi kích thước, vv)


chỉnh sửa 1: viết liên quan Thông tin:
Đối với những người đi xuống con đường này, nó nhanh chóng trở nên hữu ích để viết một plugin phonegap đơn giản để cài đặt ngôn ngữ của thiết bị ipad/iphone vào javascript của bạn. Điều này đòi hỏi một plugin, mà sẽ giống như thế này:
Javascript:
phần 1:

PhoneGap.exec("PixFileDownload.getSystemLanguage"); 

phần 2 (callback Function):

setLanguage(returnedLanguage) 
{ 
    GlobalVar.CurrentLanguage = returnedLanguage; //GloablVar.CurrentLanguage already defined 
} 

Mục tiêu C:

-(void)getSystemLanguage:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options 
{ 
    /*Plugin Details 
    PhoneGap.exec("PixFileDownload.getSystemLanguage"); 
    Returns Language Code 
    */ 

    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; 
    NSArray* languages = [defs objectForKey:@"AppleLanguages"]; 
    NSString *language = [languages objectAtIndex:0]; 
    NSLog(@"####### This is the language code%@",language); 
    NSString *jsCallBack; 
    jsCallBack = [NSString stringWithFormat:@"setLanguage('%@');",language];  
[self.webView stringByEvaluatingJavaScriptFromString:jsCallBack]; 

} 

chỉnh sửa 2: nhân vật mã hóa Khi thêm ký tự ngôn ngữ bổ sung cho một dự án sencha (hoặc bất kỳ dự án webview PhoneGap), đảm bảo rằng bạn có mã hóa đúng quy định trong tập tin chỉ mục. Đây là thẻ tôi cần.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+0

Hãy xem câu trả lời này về cách tải nội dung bản địa hóa làm ghi đè. Đây là cách Sencha làm điều đó để bản địa hóa các widget tích hợp. http://stackoverflow.com/questions/8226173/sencha-touch-localization-use-a-store-or-a-global-json-object/8227539#8227539 – Stuart

Trả lời

3

Tôi đã hoàn thành plugin bản địa hóa ngôn ngữ này. Nó không tuyệt vời, nhưng nó hoạt động tốt hơn tôi suy đoán ban đầu. Dưới đây là các câu trả lời ngắn cho mỗi câu hỏi.

1- Có cách nào dễ dàng hơn để triển khai bản địa hóa ngôn ngữ với thiết lập của tôi không?

Không phải là tôi biết. Nhận xét của Stuart cung cấp liên kết này Sencha-touch localization. Use a store or a global JSON object? có một số thông tin tốt về một cách mà bạn có thể sử dụng ghi đè lớp học. Tôi không thích cách tiếp cận này, bởi vì nó lan truyền các bản dịch ngôn ngữ của tôi sang các lớp khác nhau. Nhưng chắc chắn, nếu bạn đang làm một cái gì đó đơn giản, hoặc bạn muốn cái gì đó có thể mạnh hơn, có lẽ bạn nên điều tra điều đó.

2- Tôi có gặp phải vấn đề với công cụ sencha bản địa (như trình chỉnh sửa ngày) không?

Tôi đã kết thúc đặc biệt để lại "trình tạo ngày giờ" bằng tiếng Anh hiện tại. Nhưng mọi thứ khác thực sự tương đối dễ dàng để tùy chỉnh. Hầu như mọi phần tử giao diện đồ họa đều có thể thay đổi văn bản.

3- Khi tải/tải lại file json ngôn ngữ, sẽ tôi có hiệu suất vấn đề (đòi hỏi một vấn đề webview tải lại ?, đối tượng sencha thay đổi kích thước, vv).

Phương pháp tôi đã sử dụng (xem bên dưới) hoạt động rất tốt liên quan đến hiệu suất. Một vấn đề mà bạn có là đúng khi bạn chuyển đổi ngôn ngữ, bạn cần trang cụ thể đó để tải lại. Sencha xử lý thay đổi kích thước mà không có bất kỳ sai sót, ngoại trừ nơi tôi đã được kích thước thiết lập ngu ngốc và tĩnh.

Một số điều tôi đã làm được mô tả trong các chỉnh sửa đối với câu hỏi. Dưới đây là tổng quan chi tiết về giải pháp của tôi. (cảnh báo, đó không phải là giải pháp thanh lịch nhất.)

Thay vì sử dụng tệp JSON thuần túy, tôi đã kết thúc bằng cách sử dụng hàm javascript. Đây không phải là giải pháp lớn nhất bởi vì nó đòi hỏi một số bảo trì tối thiểu, nhưng phân tích cú pháp JSON với phonegap/sencha không phải là tốt nhất. (Tôi nhận được các tệp JSON từ dịch của người dịch và nhanh chóng dán vào tệp javascript. Mất khoảng 2 phút, xem thêm giải thích bên dưới).

Language.js

function setLanguage(language) 
{ 

    if(language == "en") 
    { 
     //console.log("inside if Language == en"); 
     GlobalLanguage.CurrentLanguage = language; 

     GlobalLanguage.ID = {"glossary": [ 
     { 
      //CONVERTED JSON 
      about : 'About', 
      checking_for_updates : 'Checking for updates...(This may take a few minutes.)' 
      //Any additional translations 

     } 
     ]}; 
    } 
    if (language == "es"){ 
     //console.log("inside language == es"); 
     GlobalLanguage.CurrentLanguage = language; 
     GlobalLanguage.ID = {"glossary": [ 
      { 
      //CONVERTED JSON 
      about : 'Acerca de ', 
      checking_for_updates : 'Verificando actualizaciones... (Capas que demore algunos minutos).' 
      //Any additional translations 

     }]}; 
    } 
     if (language == "pt"){ 
     //console.log("inside language == pt"); 
     GlobalLanguage.CurrentLanguage = language; 
     GlobalLanguage.ID = {"glossary": [ 
      { 
      //CONVERTED JSON 
       about : 'Sobre', 
       checking_for_updates : 'Verificando se há atualizações... (pode demorar alguns minutos.)' 
       //Any additional translations 

     }]}; 
    } 
} 

Như bạn thấy, tập tin này cho phép 3 ngôn ngữ (Bồ Đào Nha, tiếng Anh và tiếng Tây Ban Nha). Sau khi thiết lập ngôn ngữ, bạn có thể truy cập từng chuỗi được bản địa hóa ở bất kỳ đâu trong đối tượng của bạn. Ví dụ: nếu bạn cần truy cập từ "about", chỉ cần sử dụng:

GlobalLanguage.ID.glossary[0]["about"] 

Điều này sẽ truy cập đối tượng GlobalLanguage sẽ có bất kỳ ngôn ngữ nào được tải vào thuộc tính. Vì vậy, trong suốt dự án của bạn, bạn có thể có các cuộc gọi này. Tuy nhiên, tôi muốn khuyên bạn nên nó trở thành một bước xa hơn

function langSay(languageIdentifier){ 


    // console.log("inside langSay"); 

    if(!GlobalLanguage.ID.glossary[0][languageIdentifier]){ 
     return "[! LANGUAGE EXCEPTION !]"; 
    } 
    else{ 
     return GlobalLanguage.ID.glossary[0][languageIdentifier]; 
    } 
} 

này bảo vệ bạn khỏi phải ngoại lệ ngôn ngữ và có sụp đổ chương trình của bạn mà không biết ở đâu (bạn có thể có hàng trăm hoặc hàng ngàn bất động sản được thiết lập ở chỗ tập tin language.js). Vì vậy, bây giờ chỉ cần:

langSay("about") 

Một lưu ý bổ sung về định dạng từ JSON. Định dạng bạn muốn các tệp ngôn ngữ của mình là:

languageIdentifier : 'Translation', 
languageIdentifier : 'Translation', 
languageIdentifier : 'Translation' 

Tôi đã sử dụng Excel để định dạng. Ngoài ra, các trình biết ngôn ngữ là các mã định danh duy nhất không có dấu cách.Tôi khuyên bạn chỉ nên sử dụng Excel để định dạng từ 3 đến 4 từ word1_word2_word3_word4 của bản dịch tiếng Anh.

word1_word2_word3 : 'word1 word2 word3' 

Hy vọng điều này sẽ giúp bạn! Tôi rất sẵn lòng trả lời bất kỳ câu hỏi nào

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