2014-06-07 48 views
7

我的國家(西班牙)有幾種語言(es-ES,ca-ES,gl-ES,eu-ES)。我們現在不會添加所有語言,因此我們希望在西班牙使用主要語言,即西班牙語。我們希望在用戶選擇該國其他語言之一時顯示/values-es/strings.xml。我們怎麼做到這一點?Android。如何爲一個國家的所有語言使用相同的本地化消息?

哦,我們想用英語作爲默認語言(/values/strings.xml)。

這將是偉大的東西像/values-ES/strings.xml,但我認爲不能這樣做,因爲第一個代碼應該是語言代碼。

現在,我們正在複製/values-es/strings.xml文件到其他文件夾(values-cavalues-glvalues-eu),但我們希望避免這種情況。

+1

你的問題不清楚。不同語言的strings.xml文件之間是否存在差異? – greywolf82

+0

最簡單的解決方案是使西班牙語成爲默認語言,即在res/values /中使用的語言。然後,任何無法識別的用戶語言將默認爲西班牙語,這將包括您所需的所有場景。 – CommonsWare

+0

我已經澄清了這個問題。謝謝你的幫助。 –

回答

0

我會說你想要做這樣的事情。

if (Locale.getDefault().getISO3Country().equals("ESP")) 
{ 
    Locale[] locales = Locale.getAvailableLocales(); 
    for (Locale loc : locales) 
     if (loc.getISO3Language().equals("SPA")) 
     { 
      Locale.setDefault(loc); 
      break; 
     } 
} 

注意:我不確定是否正確獲得了ISO3語言和國家/地區代碼。而且你還必須爲ES-ES語言環境不可用的(罕見的)情況做些事情。

+0

你仍然需要手工複製一些由第三方加載的字符串,例如清單中引用的字符串。我對於「動態改變應用程序的區域設置」方法感到不安,但似乎有足夠的開發人員使用它,它大概運行良好。 – CommonsWare

+0

感謝popovitsj。我應該在哪裏編碼?在MyApplication.onCreate或MyBaseActivity.onCreate中? –

+0

我認爲把這個放在最安全的地方應該是Activity的onResume()。 – wvdz

0

如果您試圖用西班牙語覆蓋加泰羅尼亞語,那麼您應該在values-ca/strings.xml文件中擁有該文件。

執行問題的方法是在適當的移動國家/地區代碼資源文件夾中提供資源,該文件夾優先於語言區域資源。

假設你有以下情況:

應用程序代碼要求R.string.text_a 兩個相關資源文件可用: res/values-mcc404/strings.xml,其中包括text_a在應用程序的默認語言,在此情況下,英語。 res/values-hi/strings.xml,其中包括text_a in Hindi。 應用程序在具有以下配置的設備上運行: SIM卡已連接到印度的移動網絡(MCC 404)。 該語言設置爲印地文(嗨)。 即使設備配置爲印地語,Android也會加載text_ares/values-mcc404/strings.xml(英文)。這是因爲在資源選擇過程中,Android會選擇MCC匹配而不是語言匹配。

的MCC西班牙是214

(見Localization

+0

謝謝Eran。我想,通過MCC,西班牙的一位英文用戶可以使用西班牙語查看我們的應用,而不管她在設備中設置的語言(很可能是英語)。 –

+1

是的,那是真的。我仍然認爲四次複製資源文件是最好的解決方案,因爲它完全符合你的需求,並且不會隱藏你正在做的事情,而是用西班牙文字符串覆蓋其他三種語言。 –

+0

另一種可能性是檢測當前語言環境,如果它與要覆蓋的西班牙語語言環境中的任何語言環境相匹配,則將默認語言環境更改爲您想要使用的語言環境。 (這是我看到popovitsj在下面說明) –

0

我發現了另一個棘手的解決方案:硬鏈接。儘管它不能完全消除整個問題,但至少它可以保護您免受跨多個目錄複製文件的日常任務,或者對所有存在的文件進行相同的更改,從而可能會漏掉某些東西。

但我必須承認,有一些注意事項:

1)有些IDE不支持由默認的硬鏈接工作。Intellij IDEAAndroid Studio如果您不禁用設置中的「安全寫入」選項,將會破壞您的硬鏈接。

2)大多數版本控制系統默認不支持硬鏈接。例如,我們以git爲例。它會在還原或合併更改後破壞現有硬鏈接。

目前,我正在使用批處理文件恢復被git破壞後的硬鏈接。

-1

您可以按照這些鏈接。

http://www.androidhive.info/2014/07/android-building-multi-language-supported-app/


https://www.tutorialspoint.com/android/android_localization.htm


https://www.icanlocalize.com/site/tutorials/android-application-localization-tutorial/


例如,如果代碼加載一個名爲 'R.string.title' 字符串,Android將選擇正確的值通過從匹配的「res/values」目錄加載適當的strings.xml文件,在運行時輸入該字符串。

爲了擁有一個多語言的Android應用程序,您需要爲Android提供本地化的資源文件。

如果語言環境爲'en-US',則Android會查找「R.string.title」的值 - 當它設法在資源文件中查找字符串時,它會使用該值並停止搜索。這意味着默認語言可作爲後備選項,並且在存在翻譯時,它將用於替代。這也意味着你應該將所有內容本地化或者沒有任何內容,因爲看到一半翻譯的應用程序通常比根本不翻譯的應用程序更糟糕。

1

我認爲你應該只有2 1周的strings.xml文件夾對方:

  1. RES /價值/ strings.xml中這個資源將包含英文文本;
  2. res/values-es/strings.xml此資源將包含您的文字西班牙語

當你的應用程序安裝,其配置與意大利語言的設備上,它將使用文件資源的情況下,1

安裝時,其配置與設備上您的應用程序一個西班牙語語言(並且有很多西班牙語語言那裏,想想南美國家),它將使用情況2的文件資源。

您可以通過Android Studio中輕鬆地做到這一點:

  1. 右鍵單擊資源文件夾
  2. 去新建> Android的資源目錄
  3. 一個窗口會告訴你一些選項;挑區域設置,然後點擊這些符號按鈕「>>」
  4. 那麼語言名單上,挑ES:西班牙語,然後單擊確定,如下面的圖片中顯示(注意,默認情況在特定區域只有任何區域選擇)經驗

Add locale image guide

:我從來沒有遇到了一個布列塔尼,科西嘉島普羅旺斯用戶聲稱以其語言完整翻譯應用程序(默認情況下該應用程序具有默認的英文和法文)。

0

在一個通用術語中,值文件夾下只應包含一個包含相關數據的strings.xml文件。 如果我們明確地指定不同值的文件夾像values-ca,values-es,那麼無論何時在android設備中進行設置更改,它都會查找特定的文件夾並獲取相應的字符串值。 如果要求保持一致,文本意味着更好的只有值 - >strings.xml文件與所需的數據。 但是使用這種方法,多語言apk是不可能的,即對於其他國家預期不同的語言,將會有變化。因此,只要我們需要統一的語言,就讓我們單獨使用單個文件夾,並在首選多語言的地方,我們可以擁有多個值 - es,values-ca文件夾。 希望有幫助

0

如何嘗試在java中設置它,而不是使用strings.xml。 這樣做在編程上給你在運行時更大的靈活性。

Configuration config = new Configuration(getResources().getConfiguration()); 

    Locale locale = Locale.getDefault(); 
    String country = locale.getCountry(); 
    String language = locale.getLanguage(); 
    if (country.equalsIgnoreCase("ES") && (language.equalsIgnoreCase("ca") || language.equalsIgnoreCase("gl") || language.equalsIgnoreCase("eu"))) { 
     locale = new Locale("es"); 
    } 
    config.setLocale(locale); 

然後你就可以簡單地有一個/values-es/strings.xml所有ES國語言。

相關問題