2014-04-22 18 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