2017-08-04 60 views
1

我正在爲英國的本地化字符串應用程序工作,在res/values-en-rGB/strings.xml中指定。我的默認字符串實現,爲美國,在res/values/strings.xml加拿大本地化默認爲英國;應該默認爲US

現在,我在res/values-en-rCA/strings.xml中爲加拿大添加了其他本地化版本。我會應用程序的行爲如下:如果用戶的設備本地化爲加拿大(或其語言設置爲English(Canada)French(Canada)),檢查我們是否有一個字符串en-rCA,如果不是,退回到字符串中我的默認strings.xml文件。 但是,當設備設置爲加拿大語言環境並且在en-rCA中找不到該字符串時,我的應用程序當前回退到en-rGB的字符串。因此,我有兩個問題:

  1. 如何配置我的應用程序,使得具有在en-rCA字符串加拿大區域的搜索,然後一個裝置,如果找不到的話,默認爲我的默認字符串values文件夾en-rGB

  2. 如何確保語言設置爲French (Canada)的設備的默認設置爲en-rCA而不是我默認的values,因爲它目前的功能是?

我很樂意提供一個例子,如果它會有所幫助。謝謝!

+0

我遇到了同樣的問題。也許有一個在Android N https://developer.android中進行更改的錯誤。COM /培訓/基礎/​​支持的設備/ languages.html。在較老的API上它工作正常,但新的像7.1.1一樣,它的行爲與上面提到的相同。也許我們應該打開一個錯誤報告? –

+0

檢查[Android 7.0牛軋糖在設備語言爲en_US時選取默認字符串](https://stackoverflow.com/q/40906548/1306419)問題引發了與其他英語語言環境相似的問題。 –

+0

我在這裏創建了一個錯誤報告:https://issuetracker.google.com/issues/64429534。隨意建議進行更改以改進它或評論/明星,以便可以查看它。謝謝。 –

回答

1

壓軸更新之前的事情發生了:

打開一個錯誤後谷歌Incorrect resource resolution strategy above Android N, defaulting to en_GB and not default strings.xml報道,他們提到,這在Android N上面的預期行爲中。en_UK被認爲是「國際英語的代表」。字符串將返回到「國際英語」字符串或其代表之前,默認en字符串。我在這裏引用他們的答覆:

的N起,所有英語語言環境(除美國和美國領土像波多黎各和美國薩摩亞)回落到一些國際英語變種,如果這樣的語言環境是可用的。如果沒有更好的國際英語語言環境,那麼在回退en-GB(如果沒有更好的國際英語語言環境,則認爲它是國際英語的代表)之前,我們會首先嚐試這些語言環境:en-rCA(加拿大英語) ,b + en + 001(國際英語),en(英語)。 如果您不希望爲en-CA提取en-GB字符串,則應該將資源置於這三個目錄之一中,因爲它們會被視爲與en-CA更好匹配。


更新1:

看來這並不僅僅侷限於en_CA。對於其他英語區域還有另一個類似的問題:Android 7.0 Nougat picks up default strings when device language is en_US。在這個階段看起來像一個平臺錯誤。


原來的答案:

不知道它的錯誤或功能。從API級別24(Android 7.0)開始,他們已經更新了Android如何解析字符串,如Improvements to Resource-Resolution Strategy 所述。以一個例子從下面的文檔:

的Android 7.0之前:

比方說,如果用戶有fr_CH設置,下面是在應用程序即de_DEes_ESfr_FRit_IT可用的資源。對於Android 7.0之前的舊API,Android試圖找到完全匹配,並且如果未找到完全匹配,則默認爲values/strings.xml,即en。因此,對於en_CA的情況,如果在res/values-en-rCA/strings.xml中找不到字符串,我們可以預計它默認爲enTable 1. Resource resolution without an exact locale match.

的Android 7.0

但是現在的Android 7.0及更高版本之後,對於fr_CH的情況下,它會回落到最接近父方言即fr_FRTable 2. An improved resolution strategy for when there is no exact locale match.

應用相同的邏輯來的en_CAen_GB存在於應用程序的情況下,我在想,Android的認爲en_GB最接近方言en_CA,並回落到它,而不是默認的en的第一。我在我的應用程序中遇到了這個問題,這是唯一可能的解釋,我可以想出爲什麼這個問題只發生在較新的API版本上,而不是在Android N之前發生。

0
  1. 應該自動發生,沒有你做任何事情。如果您的values/strings.xml,values-en-rGB/strings.xmlvalues-en-rCA/strings.xml的GB和CA版本僅包含與基線不同的字符串(values/strings.xml),並且用戶的地區設置爲en-CA,則系統將從values-en-rCA/strings.xml加載字符串(如果未找到),它將將退回到values/strings.xml,GB版本不會出現在圖片中。

  2. 爲此,您必須在本地更改您的應用語言環境。基本上你當前的語言環境,如果是FR-CA,您手動區域設置爲EN-CA

    Locale enCALocale = new Locale("en", "CA"); 
    Locale.setDefault(enCALocale); 
    Configuration config = new Configuration(); 
    config.locale = enCALocale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
    

更新

正如Shobhit提到的,開始的Android N,你現在可以在設置中選擇的區域設置列表,您可以決定它們的優先級:

enter image description here

在上述情況下,系統會嘗試着尋找en-rCA/strings,如果沒有找到,它會考慮en-rGB/strings,而不是基準,東西N.

+1

您對#2的回答非常有幫助 - 謝謝!至於#1,我知道這是預期的行爲,而這的確是我的應用程序設置的方式。不過,我發現帶有加拿大語言環境的設備可以從'values-en-rGB'退回到字符串,並且想知道是否有人知道這是爲什麼發生。如果我將設備設置爲「英語(加拿大)」以外的任何語言,則會按預期回退到我的默認設置。似乎加拿大英語有些奇怪。思考? – user5194377

+0

感謝您的更新答案。我的語言偏好中只有英語(加拿大)和英語(美國)。即使這樣,問題也會發生。 –

+0

同樣在這裏,@Shobhit。很難說它是一個錯誤還是故意的功能。如果這是一項功能,似乎應該有一種手動覆蓋的方式,並堅持認爲它可以回落到美國而不是英國。也許我們應該提交一份錯誤報告。 – user5194377