Android 构建多语言支持的应用程序

Android 是少数流行的移动操作系统之一,拥有超过 190 个国家的数百万用户,并日益增长。所以当你想让你的应用在全球取得成功时,让应用本地化总是一个好主意。在进行本地化时,您应该考虑根据地区或国家使用适当的文本、音频、货币、数字和图形。但本教程只涉及本地化 Resource 支持多种语言。使用参考资料进行本地化说明在本地化应用程序时应该考虑其他事项。在本文中,我们将构建一个支持多语言的应用程序,它支持法语、德语、印地语和日语。

字符串本地化的工作原理

默认情况下,android 将英语作为主要语言,并从 res ⇒ values ⇒ strings.xml 加载字符串资源。当您想要添加对另一种语言的支持时,您需要通过添加连字符和 ISO 语言代码来创建一个 values 文件夹。例如,如果希望添加对法语的支持,应该创建一个名为 values-fr 的 values 文件夹,并在其中保存一个 strings.xml 文件,其中的所有字符串都翻译成法语。

简而言之,本地化工作如下:

  1. 当用户通过设置语言和输入改变设备语言时,android 操作系统会检查应用程序中是否有合适的语言资源(假设用户选择法语)。
  2. 如果应用支持所选的语言,则 android 在项目的 values-(ISO 语言代码)文件夹中查找其字符串资源。(对于法语,它从 values-fr/string.xml 加载字符串值)。
  3. 如果受支持的语言 strings.xml 缺少任何字符串值,则 android 始终会从默认的 strings.xml 文件(即 values/strings.xml)中加载缺少的字符串。

因此,默认的 stings.xml 文件必须包含应用程序使用的所有字符串值,否则应用程序将崩溃或强制关闭错误。

正确的做法

虽然您支持多种语言,但在定义字符串时,您应该考虑以下最佳实践。始终只在 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");   

让我们创建一个新项目并尝试一个示例。

创建一个新工程

第一步:创建一个 Android 工程(不再详细说明)。

第二步:在 colors.xml 中添加以下颜色。如果你看不到 colors.xml 创建一个新文件并添加以下颜色。

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>

第三步:在 drawable 文件夹下,创建三个文件 bg_button_rounded.xml,bg_form_rounded.xml,bg_gradient.xml,其内容如下。这些文件与语言支持无关,而只是为按钮和输入框提供漂亮的渐变背景和圆角。

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>

第四步:打开 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>

第五步:现在在 res 文件夹下,在每个文件夹中创建三个名为 values-de、values-fr、values-hi、values-ja 的文件夹和一个 strings.xml 文件。

文件目录结构示意图

现在将字符串翻译成受人尊敬的语言,并将它们放在适当的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-hi/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>

第六步:打开主 Activity 布局文件(在我的示例中是 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>

第七部:打开你的 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();
    }
}

现在,如果你运行这个项目,你应该会看到英文版的应用程序(假设你的设备设置为英文版)

测试其他语言

在 Android 系统中设置 Settings ⇒ Language & Input 选择相应的语言,例如印度语。

Android本地化语言ISO代码

下表给出了 android 支持的所有语言的 ISO 语言代码。

LanguageLocalevalues/strings.xml
Germandevalues-de/strings.xml
Chinesezhvalues-zh/strings.xml
Czechcsvalues-cs/strings.xml
Dutchnlvalues-nl/strings.xml
Frenchfrvalues-fr/strings.xml
Italianitvalues-it/strings.xml
Japanesejavalues-ja/strings.xml
Koreankovalues-ko/strings.xml
Polishplvalues-pl/strings.xml
Russianruvalues-ru/strings.xml
Spanishesvalues-es/strings.xml
Arabicarvalues-ar/strings.xml
Bulgarianbgvalues-bg/strings.xml
Catalancavalues-ca/strings.xml
Croatianhrvalues-hr/strings.xml
Danishdavalues-da/strings.xml
Finnishfivalues-fi/strings.xml
Greekelvalues-el/strings.xml
Hebrewiwvalues-iw/strings.xml
Hindihivalues-hi/strings.xml
Hungarianhuvalues-hu/strings.xml
Indonesianinvalues-in/strings.xml
Latvianlvvalues-lv/strings.xml
Lithuanianltvalues-lt/strings.xml
Norwegiannbvalues-nb/strings.xml
Portugueseptvalues-pt/strings.xml
Romanianrovalues-ro/strings.xml
Serbiansrvalues-sr/strings.xml
Slovakskvalues-sk/strings.xml
Slovenianslvalues-sl/strings.xml
Swedishsvvalues-sv/strings.xml
Tagalogtlvalues-tl/strings.xml
Thaithvalues-th/strings.xml
Turkishtrvalues-tr/strings.xml
Ukrainianukvalues-uk/strings.xml
Vietnamesevivalues-vi/strings.xml

翻译工具

现在我使用谷歌翻译服务将字符串翻译成其他语言。但如果你想要更准确、更有意义的翻译,一定要通过谷歌Play寻求专业的翻译服务,最后,本地化检查列表 为您提供了在考虑本地化时应用程序上线之前需要验证的内容。