2014-04-22 17 views
0

我正在工作一個Android應用程序,並希望將其翻譯成波斯語。 項目中的所有String值都保存到資源XML文件中。 一些String值用於佈局文件和一些類(R.String)。在Android中使用波斯語文本時,必須重新整形以正確顯示。android重塑所有資源文件字符串

我想重塑所有資源String值而不調用每個String值的重塑方法。

任何人都可以解釋我如何做到這一點?

一些想法:
覆蓋String類
覆蓋的getResource類

回答

1

Android已經提供的功能(well documented)有一個多語言的應用程序。與其替換您的文本併爲每種語言使用您的應用程序的整體版本,它更好地使用框架功能。在這種情況下,應用程序會根據設備區域設置從您提供的可用語言中選擇合適的語言。

所以基本上你將通過創建所需的目錄結構(上面的鏈接)開始:

MyProject/ 
    res/ 
     values/ 
      strings.xml 
     values-fa/ 
      strings.xml 

,然後你在String值填進文件,如:

英語(默認語言環境), /values/strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="title">My Application</string> 
    <string name="hello_world">Hello World!</string> 
</resources> 

波斯,/values-fa/strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="title">...</string> 
    <string name="hello_world">...</string> 
</resources> 

(報價,從上面的鏈接適配)

reshape farsi語言
的重塑函數具有用於每波斯語String值,因此設置字符串中的XML佈局是不可能(AFAIK),因此以下提議假設所有String值都以編程方式設置。

使用全局靜態包裝函數#1

public static final String getLocalizedString(int resId) { 
    if(Locale.getDefault().toString().equals("fa_IR")) { 
     return PersianReshape.reshape(getResources().getString(resId)); 
    }else{ 
     return getResources().getString(resId); 
} 

現在,您可以使用此功能加載String(你必須改變每種情況),或者重寫例如getRessource方法。我個人更喜歡使用靜態函數,而不是因爲關於其他類型的負載的資源比String,副作用等

創建具有壓倒一切的setText(定製類其他可能出現的問題壓倒一切)每個使用的UI組件#2
另一種可能性是創建自定義的ui小部件,在顯示時調用PersianReshape.reshape()。例如。爲EditText

class CustomTextField extends EditText { 
    @Override 
    public void setText(String text) { 
     super.setText(PersianReshape.reshape(text)); 
    } 
} 
[...] 
CustomTextField myTextBox = new CustomTextField(); 
myTextBox.setText("...."); 
+0

感謝的Alex,項目具有價值發資源目錄,但問題reshaping.reshape方法將調用每一個使用波斯串時間。 – Micle

+0

我不確定我是否理解你的問題。你使用類似String hello = getResources()。getString(R.string.hello_world); 得到一個字符串,它總是在所需的語言中,不是嗎? – alex

+0

是的,PersianReshape.reshape(getResources()。getString(R.string.hello_world)); PersianReshape.reshape每次以波斯語字符串調用。 – Micle