Android创建多语言支持app
来源:互联网 发布:js 数据结构 字符搜索 编辑:程序博客网 时间:2024/05/29 06:58
原文:http://www.androidhive.info/2014/07/android-building-multi-language-supported-app/
(注:
将原文的中印度语改成了中文,并以中文作为示例;原文使用的Eclipse ,我这里使用Android Studio。
学到或可继续了解的知识:
1、如何建立对应不同语言的values文件夹
2、规范化,资源全部放资源文件中,不要在布局页或后台代码中写死,便于维护
3、如何给一个activity更换渐变背景
4、drawable目录下除了放图,还可以放定义的xml文件
5、shape和gradient,其中又涉及到shape的形状,gradient的方式,及不同方式呈现的效果及注意点
6、沉浸式菜单
7、如果不显示actionbar
……
)
Android是最受欢迎的移动操作系统之一,在世界上超过190个国家和地区拥有成千上万的用户,并且用户数量在不断地增长。如果你想把你的app推向国际市场,让世界上更多的人使用它,那么最好的方法就是实现app的本地化。
本地化的时候,你需要根据某个国家或地区的实际情况来考虑使用合适的文字、语音、货币形式、数字和图片等。但是这篇教程只讲到本地化文本,支持多样化语言。想要了解除文本外更多的内容,请访问Localizing with Resources。
我们将在这篇文章里创建一个支持法语、德语、中文和日文的多语言支持app。
1. 文本本地化如何工作
Android默认使用英语,文本资源一般存放于res ⇒ values ⇒ strings.xml。如果想要让程序支持其它语言,你需要创建一个"values-ISO语言代码“文件夹,如中文,就建立叫”values-zh“的文件夹,在该文件夹里创建一个strings.xml,该xml中放入翻译好的中文文本。ISO语言代码在本文第四部分会有介绍。
简而言之,本地化工作如下:
1. 当用户通过”设置⇒ 语言和输入法“来改变设备的默认语言时,Android系统会自动匹配适合的语言资源。如果用户的设备上默认语言是简体中文,则系统会自动匹配”values-zh“中的strings.xml。
2. 如果app支持选择语言,Android系统将会搜索并使用用户选择的语言资源。
3. 如果用户选择的strings.xml 中没有某个文本的值,系统将会加载默认strings.xml中的值,如values/strings.xml。
所以默认的strings.xml文件中必须包含app中会用到的所有设置的文本值,否则将会报错。
建议:
最好只在strings.xml中声明文本资源,如:
<
string
name
=
"note_email"
>Enter your email address</
string
>
在 xml中使用 @strings标记,如:
<
TextView
...
android:text
=
"@string/note_email"
/>
在java代码中使用R.string的写法:
emailNote.setText(R.string.note_email);
不建议:
我不建议在xml或java代码中将文本写死,这样非常不利于维护,如:
<
TextView
...
android:text
=
"Enter your email address"
/>
emailNote.setText(
"Enter your email address"
);
讲到这里也差不多了,那我们开始通过一个例子来加深理解吧!
2. 创建新项目
1. 用Adnroid Studio创建一个新项目:File ⇒ New ⇒ New Project 。
2. 在colors.xml中加入以下代码,如果没有找到colors.xml,就在values目录下新建一个colors.xml并加入以下代码:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
color
name
=
"white"
>#ffffff</
color
>
<
color
name
=
"bg_gradient_start"
>#b21331</
color
>
<
color
name
=
"bg_gradient_end"
>#820d2a</
color
>
<
color
name
=
"bg_button_login"
>#380813</
color
>
</
resources
>
3. 在drawable文件夹下创建以下几件文件:bg_button_rounded.xml,bg_form_rounded.xml,bg_gradient.xml 文件内容分别如下:
(这些文件与语言支持无关,只是为了让app的外观更漂亮,有渐变的背景,圆角按钮,输入框等,就是样式。)
bg_button_rounded.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
shape
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:shape
=
"rectangle"
>
<!-- view background color -->
<
solid
android:color
=
"@color/bg_button_login"
>
</
solid
>
<!-- If you want to add some padding -->
<
padding
android:left
=
"5dp"
android:top
=
"5dp"
android:right
=
"5dp"
android:bottom
=
"5dp"
>
</
padding
>
<!-- Here is the corner radius -->
<
corners
android:radius
=
"6dp"
>
</
corners
>
</
shape
>
bg_form_rounded.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
shape
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:shape
=
"rectangle"
>
<!-- view background color -->
<
solid
android:color
=
"@color/white"
>
</
solid
>
<!-- If you want to add some padding -->
<
padding
android:left
=
"5dp"
android:top
=
"5dp"
android:right
=
"5dp"
android:bottom
=
"5dp"
>
</
padding
>
<!-- Here is the corner radius -->
<
corners
android:radius
=
"6dp"
>
</
corners
>
</
shape
>
bg_gradient.xml
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
shape
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:shape
=
"rectangle"
>
<
gradient
android:gradientRadius
=
"750"
android:endColor
=
"@color/bg_gradient_end"
android:startColor
=
"@color/bg_gradient_start"
android:type
=
"radial"
/>
</
shape
>
4. 打开values 目录下的strings.xml ,并添加以下代码:(这些是默认英文文本)
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"app_name"
>Multi Language App</
string
>
<
string
name
=
"action_settings"
>Settings</
string
>
<
string
name
=
"welcome"
>Welcome!</
string
>
<
string
name
=
"email"
>Email Address</
string
>
<
string
name
=
"password"
>Password</
string
>
<
string
name
=
"login"
>Login</
string
>
<
string
name
=
"signup"
>Don\'t have account? Sign Up</
string
>
</
resources
>
5. 好,现在到 res 目录下新建三个文件夹分别命名为: values-de, values-fr, values-zh, values-ja ,把默认的strings.xml 分别复制到这三个文件夹。
现在你的项目应该是这样的:
现在开始翻译!
德语 values-de/strings.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"welcome"
>Willkommen!</
string
>
<
string
name
=
"email"
>Email Addresse</
string
>
<
string
name
=
"password"
>passowrd</
string
>
<
string
name
=
"login"
>Login</
string
>
<
string
name
=
"signup"
>müssen nicht angemeldet? Anmeldung</
string
>
</
resources
>
法语 values-fr/strings.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"welcome"
>accueil</
string
>
<
string
name
=
"email"
>adresse e-mail</
string
>
<
string
name
=
"password"
>mot de passe</
string
>
<
string
name
=
"login"
>connexion</
string
>
<
string
name
=
"signup"
>Ne pas avoir un compte? signer</
string
>
</
resources
>
中文 values-zh/strings.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"welcome"
>欢迎</
string
>
<
string
name
=
"email"
>邮件地址</
string
>
<
string
name
=
"password"
>密码</
string
>
<
string
name
=
"login"
>登录</
string
>
<
string
name
=
"signup"
>还没有账户?赶紧注册!</
string
>
</
resources
>
日语 values-ja/strings.xml
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string
name
=
"welcome"
>歓迎</
string
>
<
string
name
=
"email"
>電子メールアドレス</
string
>
<
string
name
=
"password"
>パスワード</
string
>
<
string
name
=
"login"
>ログイン</
string
>
<
string
name
=
"signup"
>アカウントをお持ちでない場合は?サインアップ</
string
>
</
resources
>
6. 打开activity_main.xml并添加如下内容来创建一个简单的布局,这个布局包含一个标题和一个登录区域。
<
RelativeLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
xmlns:tools
=
"http://schemas.android.com/tools"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:background
=
"@drawable/bg_gradient"
android:paddingBottom
=
"@dimen/activity_vertical_margin"
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
android:paddingRight
=
"@dimen/activity_horizontal_margin"
android:paddingTop
=
"@dimen/activity_vertical_margin"
tools:context
=
".MainActivity"
>
<
LinearLayout
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_centerInParent
=
"true"
android:layout_marginLeft
=
"15dp"
android:layout_marginRight
=
"15dp"
android:gravity
=
"center"
android:orientation
=
"vertical"
>
<
TextView
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_marginBottom
=
"40dp"
android:text
=
"@string/welcome"
android:textColor
=
"@color/white"
android:textSize
=
"45dp"
android:textStyle
=
"bold"
/>
<
LinearLayout
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:background
=
"@drawable/bg_form_rounded"
android:orientation
=
"vertical"
>
<
EditText
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_marginBottom
=
"10dp"
android:background
=
"@null"
android:hint
=
"@string/email"
android:padding
=
"5dp"
android:singleLine
=
"true"
/>
<
EditText
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:background
=
"@null"
android:hint
=
"@string/password"
android:inputType
=
"textPassword"
android:padding
=
"5dp"
/>
</
LinearLayout
>
<
Button
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:layout_marginTop
=
"25dp"
android:background
=
"@drawable/bg_button_rounded"
android:text
=
"@string/login"
android:textColor
=
"@color/white"
/>
</
LinearLayout
>
<
TextView
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:text
=
"@string/signup"
android:layout_alignParentBottom
=
"true"
android:gravity
=
"center_horizontal"
android:layout_marginBottom
=
"25dp"
android:textColor
=
"@color/white"
/>
</
RelativeLayout
>
7. 打开 MainActivity.java 确保有如下代码:
package
info.androidhive.multilanguageapp;
import
android.os.Bundle;
import
android.app.Activity;
import
android.view.Menu;
public
class
MainActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().hide();
}
}
(其实我的代码中除了getActionBar().hide();没有,其它都有,我不显示ActionBar的方式如下,这是style.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="windowNoTitle">true</item> <item name="windowActionBar">false</item> </style>不显示ActionBar主要靠后两句,colorPrimaryDark就是实现我这里的沉浸式菜单的方法。
)
好,运行,来看看默认英语的版本:
3. 测试其他语言
打开自己的设备,设置-语言和输入法,设置成你要测试的语言,其实一般在国内,我们默认的会是简体中文,所以当你什么都不设置的时候应该看到的中文版本,改成英文后才会显示第二部分最后一张效果图,那么 不管怎样,看看中文显示效果吧:
4. Android 本地化语言 ISO 代码表
附:gradient渐变的三种形式
linear
0Linear gradient.(线性渐变,默认的渐变类型)radial
1Radial, or circular, gradient.(放射渐变,设置该项时,android:gradientRadius也必须设置)sweep
2Sweep, or angled or diamond, gradient.(扫描性渐变)示例代码,可供下载学习参考
- Android创建多语言支持app
- Android App支持多语言
- android设置app支持多语言
- Android多语言支持
- android多语言支持
- Android多语言支持
- Android支持多语言
- Android多语言支持
- Android 多语言支持
- iOS多语言,支持app内部设置
- Mac App名字支持多语言显示
- android的多语言支持
- Android多语言支持二
- Android 动态支持多语言
- Android多语言支持实现
- Android App 多语言切换
- Android App 多语言切换
- Android App 多语言切换
- elasticsearch 使用事项
- 有关Lucene的问题:用Lucene构建实时索引
- [leetcode] 269. Alien Dictionary 解题报告
- 动态插入窗口控件 句柄到cwnd转换
- java string
- Android创建多语言支持app
- java 对象池
- eclipse新建web项目运行时出现The requested resource is not available异常
- Lucene 4.x 之 IndexReader
- tar解压tar.bz2\tar.gz\tgz\;bzip2解压bz2;gzip解压gz
- Oracle 取随机数(转)
- java.lang.OutOfMemoryError:GC overhead limit exceeded
- 1.2.3
- STM32的知识点