2016-12-02 55 views
12

...如果是這樣,如何?使用區域設置強制Android使用不支持的語言的特定strings.xml文件

我們製造專用於Android設備的工業環境。它基本上是一款平板電腦,但只有一個應用程序在運行。用戶不需要訪問設備的任何其他功能,甚至系統設置(如WiFi和時間設置)也可以通過我們的應用程序執行,而不是通過Android設置小部件執行。 所以基本上他們看到的每個按鈕和消息都使用我們的strings.xml文件

目前我們所有的客戶都滿意地使用默認的美國英語設置,但我們很快會有一些客戶想要當地語言並向我們提供翻譯文件。目前,其中一個是羅馬尼亞語,它不是在該設備上具有任何本機支持的語言(Samsung Galaxy tab 4);另一個是捷克。

因此,我們希望將strings.xml文件添加到適當的res文件夾中,非英文語言和我們的應用程序中的下拉列表中選擇我們正在使用的語言。以編程方式,我們認爲我們可以用Locale設置哪個strings.xml文件,它使用,因此,例如,如果羅馬尼亞已經從下拉列表中選擇的,我們會用Locale到平板電腦上設置成羅馬尼亞所以我們所有的應用程序的用戶界面將採用羅馬尼亞strings.xml文件。

我們的設置(包括新下拉列表)無法由客戶訪問 - 它們由現場服務工程師在客戶現場設置。

問題:

  1. 將這項工作?即,即使設備沒有對該語言的本機支持,我們是否可以通過Locale來控制它使用哪個strings.xml文件?
  2. 由於羅馬尼亞是不是與此設備,我們假定系統消息仍然會拿出在英語中本身支持的語言。這是真的? (這不是問題 - 系統消息對於我們的應用程序來說並不常見,我們的產品用戶會接受支持,如果發生這種情況,我只想確保如果我們將Locale設置爲羅馬尼亞語或捷克語或某些沒有本地支持的其他語言,如果它試圖發佈系統消息,它不會崩潰平板電腦)。
+0

您需要爲您的設備創建根目錄並添加您的語言標識符。可能是你需要自定義ROM。訪問https://source.android.com/ – Qamar

+0

我在我的Activity.onCreate()中使用了一些這樣的事情來定義使用witch strings.xml。 ?沒有U帶 「RO」, 「」 RO」 開關(VAR){ 殼體1試試: LOC =新區域設置( 「日」, 「CH」); 斷裂; 情況2: LOC = new Locale(「de」,「DE」); break; } Locale.setDefault(loc); – canisLupusLupus

回答

6

這項工作?即,即使設備沒有對該語言的本機支持,我們是否可以通過Locale來控制它使用哪個strings.xml文件?

是的,你可以通過更新內ConfigurationLocale見下文一個例子)。如果你試圖使用你的應用程序是針對那些還沒有相應的資源(無論是你的應用程序或系統內)的語言環境中,default string resourcesRES /價值/ strings.xml中)將被使用。

由於羅馬尼亞語不是本機支持的語言,因此我們假定系統消息仍然會以英文顯示。這是真的?

確實如果英文是系統區域設置。

我只想確保如果我們將語言環境設置爲羅馬尼亞語或捷克語或其他沒有本機支持的語言,它就不會在平板電腦嘗試發出系統消息時崩潰。

您的應用不會崩潰。在應用中進行的區域設置更改會影響應用的區域設置資源,而不是系統的資源。

舉例回答「如果是這樣,怎麼辦?」該方法可用於在Activity運行*時測試語言環境更改。

public static void changeLocale(Context context, String locale) { 
    Resources res = context.getResources(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = new Locale(locale); 
    res.updateConfiguration(conf, res.getDisplayMetrics()); 
} 

*您可能想爲recreate()看到字符串資源的變化 「對飛」。

1

這樣做的最好方法是實際設置設備區域設置。做到這一點的代碼是

Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative"); 
Object am = activityManagerNative.getMethod("getDefault").invoke(activityManagerNative); 
Object config = am.getClass().getMethod("getConfiguration").invoke(am); 
config.getClass().getDeclaredField("locale").set(config, item.getLocale()); 
config.getClass().getDeclaredField("userSetLocale").setBoolean(config, true); 
am.getClass().getMethod("updateConfiguration", android.content.res.Configuration.class).invoke(am, config); 

ActivityManagerNative.java

package android.app; 

public abstract class ActivityManagerNative implements IActivityManager { 

    public static IActivityManager getDefault(){ 
     return null; 
    } 

} 

IActivityManager

package android.app; 

import android.content.res.Configuration; 
import android.os.RemoteException; 

public interface IActivityManager { 
    public abstract Configuration getConfiguration() throws RemoteException; 
    public abstract void updateConfiguration (Configuration configuration) throws RemoteException; 
} 

這種方式,你會設置設備的語言環境,讓一切通過正常途徑改變。您需要清單中的android:name="android.permission.CHANGE_CONFIGURATION"權限。這是一個安全的權限,但將自己安裝爲系統應用程序不應該成爲您的問題。

0

在應用和BaseActivity

@Override 
    public Resources getResources() { 
     if(mRes == null) 
     mRes = new PowerfulResources(getAssets(),new DisplayMetrics(), null); 
     return mRes; 
    } 

    public static class PowerfulResources extends Resources{ 

     /** 
     * Create a new Resources object on top of an existing set of assets in an 
     * AssetManager. 
     * 
     * @param assets Previously created AssetManager. 
     * @param metrics Current display metrics to consider when 
     *    selecting/computing resource values. 
     * @param config Desired device configuration to consider when 
     */ 
     public PowerfulResources(AssetManager assets, DisplayMetrics metrics, Configuration config) { 
      super(assets, metrics, config); 
     } 

     @NonNull 
     @Override 
     public String getString(int id) throws NotFoundException { 
      //do your stuff here 
      return super.getString(id); 
     } 
    } 

覆蓋getResources也讀this

1

是的,你絕對可以切換單一的應用程序的語言環境。爲此,您必須從以下基本類中擴展每個活動:

public abstract class MyLangActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     Locale locale = // get the locale to use... 
     Configuration conf = getResources().getConfiguration(); 
     if (Build.VERSION.SDK_INT >= 17) { 
      conf.setLocale(locale); 
     } else { 
      conf.locale = locale; 
     } 

     DisplayMetrics metrics = getResources().getDisplayMetrics(); 
     getResources().updateConfiguration(conf, metrics); 
     super.onCreate(savedInstanceState); 
    } 
} 

現在討論設備不支持應用的語言的問題。正在使用的設備字體可能不支持自定義語言文件中的字符。你可以使用自己的字體文件來支持。

相關問題