使用strings.xml和翻译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用strings.xml和翻译相关的知识,希望对你有一定的参考价值。

我正在开发一个应用程序,现在默认语言是意大利语,我已将所有文本放在strings.xml文件中。

在这个应用程序中有一个关于某些人的部分,我创建了自己的数据库表并存储了文本。

如何保存字符串ID以根据手机区域设置获取翻译的内容?

现在在启动时我填充数据库并保存所有文本,我只想保存R.string.something

就像是:

String resource = mydb.get("description"); // This shoul be the R.string
textview.setText(resource); // Teanslated content

这可能吗? 这有标准吗?

答案

您可以将资源ID作为整数存储在数据库中,并可以从数据库中获取整数类型,并可以将该int设置为textview

    textView.setText(integerResourceIdFromDatabase);

我创建了我的数据库类,如下所示:

package com.demo.sqlitedemo.databasehelper;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbHelper extends SQLiteOpenHelper {


private static String DATABASE_NAME = "Demo_db";
private static int VERSION = 1;

private static final String TABLE_STRING_IDS = "string_ids";
private static final String STRING_ID = "string_id";

private static final String STRING_TABLE_CREATE = "create table "
        + TABLE_STRING_IDS + "( " + STRING_ID
        + " integer primary key );";


public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(STRING_TABLE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_STRING_IDS);
    onCreate(db);
}


public void insertId(int stringId) {

    SQLiteDatabase database = getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(STRING_ID, stringId);

    database.insert(TABLE_STRING_IDS, "", values);

    database.close();

}

public int getStringId() {
    SQLiteDatabase database = getReadableDatabase();

    Cursor cursor = database.query(TABLE_STRING_IDS, new String[]{STRING_ID}
            , null, null, null, null, null);

    cursor.moveToFirst();
    int id = cursor.getInt(cursor.getColumnIndex(STRING_ID));

    database.close();
    return id;
}

}

并在像这样的主要活动中使用它

dbHelper.insertId(R.string.my_string);

获取数据

textView.setText(dbHelper.getStringId()); 

这对我来说非常好

另一答案

如果将所有字符串存储在string.xml上并从那里显示文本,然后为values文件夹上的每种语言创建xml并且名称如此,则不需要将其存储在数据库中

values-pt,values-es,values-br,以及你想要的东西。现在只需将受尊重的字符串放在每个文件中。然后当用户更改其语言应用程序时,还将从受尊重的语言文件中获取值(如果存在)。

另一答案

Ypu必须在/ res下创建多语言资源目录。在你的琴弦上使用限定词我认为fr是法国人。因此,如果您有一个名为values-fr的资源文件夹,那么手机上有法语的任何人都将获得位于该文件夹中的法语字符串文件,其他人将获得values文件夹中的字符串文件。

资源结构如下所示

Project/
    res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

这是法国语言的字符串:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">application</string>
    <string name="hello_world">ask le monde !</string>
</resources>

现在,每当您更改设备语言时,项目将根据设备语言获取字符串。

另一答案

请参考以下链接

您可以根据区域设置创建几个strings.xml资源文件的翻译文本。

假设您的应用程序的默认语言是英语。假设您还希望将应用程序中的所有文本本地化为法语,并将应用程序中的大部分文本(除应用程序标题之外的所有内容)本地化为日语。在这种情况下,您可以创建三个备用strings.xml文件,每个文件都存储在特定于语言环境的资源目录中:

  • res / values / strings.xml包含应用程序使用的所有字符串的英文文本,包括名为title的字符串的文本。
  • res / values-fr / strings.xml包含所有字符串的法语文本,包括标题。
  • res / values-ja / strings.xml包含除title之外的所有字符串的日语文本。

如果基于Java的代码引用R.string.title,那么运行时会发生以下情况:

  • 如果设备设置为法语以外的任何语言,Android将从res / values / strings.xml文件加载标题。
  • 如果设备设置为法语,Android将从res / values-fr / strings.xml文件加载标题。
  • 请注意,如果设备设置为日语,Android会在res / values-ja / strings.xml文件中查找标题。但是因为该文件中不包含这样的字符串,Android会回退到默认值,并从res / values / strings.xml文件加载英文标题。

以上是关于使用strings.xml和翻译的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从片段/活动传递到 xml?

Android strings.xml 最佳实践? [关闭]

片段中 ListView 的 setOnItemClickListener

片段中ListView的setOnItemClickListener

如何将此 JavaScript 代码片段翻译成 Parenscript?

Proguard 不会混淆 android 中的 strings.xml