如何为多语言列表应用程序制作数据库?

How to make database for Multilanguage list app?

例如该应用程序支持 3 种语言(英语、法语、德语)。 我有两个列表。如果我更改应用程序语言,我想显示具有正确翻译的值。

我有一个设备清单:

EQ_LIST

eq_id | group_id | title | lang
1, 1, tv | en
2, 1, la télé, fr
3, 1, Fernseher, de

QTY_LIST 我有另一个列表,我想在其中“记录”数量的任何变化

qty_id | groupd_id, qty
1, 1, 3
2, 1, 6
3, 1, 8

group_id指“电视”设备,不知道lang。 嵌入这两个表并按lang过滤,是个好办法吗?

我建议数据库如下:

EQ_LIST

eq_id | group_id | title_en | title_fr | title_de 
  1,       1,         tv ,    la télé,   Fernseher 

并将用户选择的语言或默认语言存储在共享首选项或其他 table 中,并根据用户选择的语言相应地获取

我会建议

  • 1 为语言添加 table 和
  • 2 也扩展了 eq table。将映射合并到语言以及映射到 "base" 条目。

所以也许有一种 语言 table 例如 :-

DDL 将是:-

CREATE TABLE language (languageid INTEGER PRIMARY KEY, languagename TEXT UNIQUE, languageshortname TEXT UNIQUE);

一个eq_listtable如:-

  • 即titleenglishmap 指向特定的“基础”(这将​​允许从 le tele 转换为 television,因为它链接了所有翻译)。

DDL 将是:-

CREATE TABLE eq_list (eqid INTEGER PRIMARY KEY, title TEXT, groupid INTEGER, titleenglishmap INTEGER, languageidmap INTEGER REFERENCES language(languageid));

qty_listtable可以原样:-

使用上面的方法你可以有这样的查询:-

SELECT qty_listid,title,qty_list,languagename  FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'french'
;

SELECT qty_listid,title,qty_list,languagename FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'German'

分别会产生结果:-

法语:-

对于德语:-

SQLite 演示(包括添加西班牙语和意大利语)

首先 Table 创建 DDL 的 :-

CREATE TABLE IF NOT EXISTS language (languageid INTEGER PRIMARY KEY, languagename TEXT UNIQUE, languageshortname TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS eq_list (eqid INTEGER PRIMARY KEY, title TEXT, groupid INTEGER, titleenglishmap INTEGER, languageidmap INTEGER REFERENCES language(languageid));
CREATE TRIGGER IF NOT EXISTS AFTER INSERT ON eq_list WHEN new.languageidmap = -9999 BEGIN UPDATE eq_list SET titleenglishmap = new.eqid WHERE new.titleenglishmap = -9999; END;
CREATE TABLE IF NOT EXISTS qty_list (qty_listid INTEGER PRIMARY KEY, qty_listgroupid INTEGER, qty_list INTEGER);
  • 注意 TRIGGER 不是必需的 @Query 运行 UPDATE 可以做它需要的。
  • 当您插入新的 "Base" eq_list(例如 English Television)时,您可能不知道 eqid titleenglishmap 应该指向 TRIGGER(或 UPDATE)根据值 -9999 协调它,即将 titleennglishmap 值设置为eqid 值。
  • 房间不支持通过注释触发触发器,这可以通过 onOpen Callback.
  • 添加

插入语言

要插入英语、法语和德语 3 种语言:-

INSERT INTO language (languagename,languageshortname) VALUES ('English','en'),('French','fr'),('German','de');
  • 请注意,语言 ID 很可能是 1,2 和 3。但是,以下内容不依赖于此假设。

添加基础(英文)eq_list

/* Add the main (English equipment note the -9999 so UPDATE (could be a TRIGGER))*/
INSERT INTO eq_list (title,groupid,languageidmap,titleenglishmap) VALUES('television',1 /* the groupid */,1,-9999);
/* make english / base title point to itself (not needed for TRIGGER)*/
UPDATE eq_list SET titleenglishmap = eqid WHERE titleenglishmap = -9999;
  • 可以看出 UPDATE 协调了 titleenglishmap 值(尽管触发器已经这样做了)
  • 多个基本 eq_list 行(例如电话....)只需要一次更新

添加翻译(法语和德语)

INSERT INTO eq_list (title,groupid,languageidmap,titleenglishmap) VALUES
    ('le tele',(SELECT groupid FROM eq_list WHERE title LIKE 'television'),(SELECT languageid FROM language WHERE languagename LIKE 'French'),(SELECT eqid FROM eq_list WHERE title LIKE 'television' )),
    ('fernsehen',(SELECT groupid FROM eq_list WHERE title LIKE 'television'),(SELECT languageid FROM language WHERE languagename LIKE 'German'),(SELECT eqid FROM eq_list WHERE title LIKE 'television' )),
    ('tv',(SELECT groupid FROM eq_list WHERE title LIKE 'television'),(SELECT languageid FROM language WHERE languagename LIKE 'English'),(SELECT eqid FROM eq_list WHERE title LIKE 'television' ))
;
  • 请注意,tv 实际上是 television 的别名(但是尚未涵盖它的潜在用途,因此对于所有意图和目的,tv 都可以忽略)。
  • groupid取自base(电视)根据title
  • languageidmap 由语言
  • name 确定
  • titleenglishmap根据baseeqid根据标题
  • 请注意,使用 LIKE 名称(标题和语言)不区分大小写,因此 french 将得到 French* 等

添加 qty_list 行

INSERT OR IGNORE INTO qty_list VALUES (1,1,3),(2,1,6),(3,1,8);
  • 上面显示的结果是由上面的代码驱动的

模型适应table。假设您想添加西班牙语和意大利语。

然后:-

添加新语言 :-

INSERT INTO language (languagename,languageshortname) VALUES ('Spanish','es'),('Italian','it');

添加翻译

/* And the new equipment transalations */
INSERT INTO eq_list (title,groupid,languageidmap,titleenglishmap) VALUES
/* Spanish */
    ('televisión'/* ARG1 1 name in the language*/,(SELECT groupid FROM eq_list WHERE title LIKE 'television'),(SELECT languageid FROM language WHERE languagename LIKE 'Spanish' /* ARG 2 language */),(SELECT eqid FROM eq_list WHERE title LIKE 'television' /* ARG3 The english translation */ )),
/* Italian */
    ('television',(SELECT groupid FROM eq_list WHERE title LIKE 'television'),(SELECT languageid FROM language WHERE languagename LIKE 'Italian' /* ARG 2 language */),(SELECT eqid FROM eq_list WHERE title LIKE 'television' /* ARG3 The english translation */ ))
;

完成就是这样。

现在可以使用以下查询(即与上面的语言更改名称没有区别):-

SELECT qty_listid,title,qty_list,languagename  FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'Spanish'
;

SELECT qty_listid,title,qty_list,languagename  FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'Italian'
;

和:-

添加额外的 eq_list 行,例如电话

INSERT INTO eq_list (title,groupid,languageidmap,titleenglishmap) VALUES('telephone',1 /* the groupid */,1,-9999);
/* make english / base title point to itself (not needed for TRIGGER)*/
UPDATE eq_list SET titleenglishmap = eqid WHERE titleenglishmap = -9999;
/* Add the euipment title translations  (note that groupid is irrelevant for)*/
INSERT INTO eq_list (title,groupid,languageidmap,titleenglishmap) VALUES
    ('téléphone',(SELECT groupid FROM eq_list WHERE title LIKE 'telephone'),(SELECT languageid FROM language WHERE languagename LIKE 'French'),(SELECT eqid FROM eq_list WHERE title LIKE 'telephone' )),
    ('telefon',(SELECT groupid FROM eq_list WHERE title LIKE 'telephone'),(SELECT languageid FROM language WHERE languagename LIKE 'German'),(SELECT eqid FROM eq_list WHERE title LIKE 'telephone' )),
    ('teléfono',(SELECT groupid FROM eq_list WHERE title LIKE 'telephone'),(SELECT languageid FROM language WHERE languagename LIKE 'spanish'),(SELECT eqid FROM eq_list WHERE title LIKE 'telephone' )),
    ('telefono',(SELECT groupid FROM eq_list WHERE title LIKE 'telephone'),(SELECT languageid FROM language WHERE languagename LIKE 'italian'),(SELECT eqid FROM eq_list WHERE title LIKE 'telephone' ))
;

SELECT qty_listid,title,qty_list,languagename  FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'Spanish'
;

SELECT qty_listid,title,qty_list,languagename  FROM qty_list 
    JOIN eq_list  ON qty_list.qty_listgroupid = eq_list.groupid
    JOIN language ON eq_list.languageidmap = language.languageid
WHERE languagename LIKE 'Italian'
  • 使用 groupid 1 所以结果是:-

扩展上一个答案 - 通过 Room 应用解决方案

根据建议合并语言的问题 table 并更改为 eq_list table。这通过房间实施解决方案。

@Entity 注释的 3 个 classes(即 3 个 tables):-

语言

const val LANGUAGE_TABLE_NAME = "language"
const val LANGUAGE_ID_COLUMN = "languageid"
const val LANGUAGE_NAME_COLUMN = "languagename"
const val LANGUAGE_SHORTNAME_COLUMN = "languageshortname"
//CREATE TABLE IF NOT EXISTS language (languageid INTEGER PRIMARY KEY, languagename TEXT UNIQUE, languageshortname TEXT UNIQUE);
@Entity(tableName = LANGUAGE_TABLE_NAME,
    indices = [
        Index(LANGUAGE_NAME_COLUMN, unique = true),
        Index(value = [LANGUAGE_SHORTNAME_COLUMN], unique = true)
    ]
)
data class Language(
    @ColumnInfo(name = LANGUAGE_ID_COLUMN)
    @PrimaryKey
    val id: Long? = null,
    @ColumnInfo(name = LANGUAGE_NAME_COLUMN)
    val languageName: String,
    @ColumnInfo(name = LANGUAGE_SHORTNAME_COLUMN)
    val languageShortName: String
)
  • 推荐使用常量,因为它们可以减少编码错误的可能性。
  • 假设语言名称和代码必须是唯一的(因此如果需要,可能使用 UK(AUS)、UK(US) 进行语言派生)

QT_List

//CREATE TABLE IF NOT EXISTS qty_list (qty_listid INTEGER PRIMARY KEY, qty_listgroupid INTEGER, qty_list INTEGER)
const val QTY_TABLE_NAME = "qty_list"
const val QTY_ID_COLUMN = "qty_listid"
const val QTY_GROUP_ID_COLUMN = "qty_listgroupid"
const val QTY_COLUMN = "qty"
@Entity(tableName = QTY_TABLE_NAME)
data class QT_List(
    @PrimaryKey
    @ColumnInfo(name = QTY_ID_COLUMN)
    val id: Long? = null,
    @ColumnInfo(name = QTY_GROUP_ID_COLUMN, index = true)
    val valgroupId: Long,
    @ColumnInfo(name = QTY_COLUMN)
    val qty: Long
)

EQ_List

//CREATE TABLE IF NOT EXISTS eq_list (eqid INTEGER PRIMARY KEY, title TEXT, groupid INTEGER, titleenglishmap INTEGER, languageidmap INTEGER REFERENCES language(languageid));
const val EQ_TABLE_NAME = "eq_list"
const val EQID_COLUMN = "eqid"
const val TITLE_COLUMN = "title"
const val GROUPID_COLUMN = "groupid"
const val TITLE_ENGLISH_MAP_COLUMN = "titleenglishmap"
const val LANGUAGE_ID_MAP_COLUMN = "languageidmap"
const val BASE_EQ_VALUE = -9999
//CREATE TRIGGER IF NOT EXISTS AFTER INSERT ON eq_list WHEN new.languageidmap = -9999 BEGIN UPDATE eq_list SET titleenglishmap = new.eqid WHERE new.titleenglishmap = -9999; END;
const val TRIGGER_SQL = "CREATE TRIGGER IF NOT EXISTS AFTER INSERT ON ${EQ_TABLE_NAME} " +
        "/* WHEN CAST(new.${LANGUAGE_ID_MAP_COLUMN} AS INTEGER) < CAST(1 AS INTEGER) */ " + //<<<<<<<<< Commented WHEN clause out as it may be version sensitive */
        "BEGIN UPDATE ${EQ_TABLE_NAME} SET $TITLE_ENGLISH_MAP_COLUMN = $EQID_COLUMN WHERE $TITLE_ENGLISH_MAP_COLUMN = ${BASE_EQ_VALUE} ;" +
        "END;"
@Entity(
    tableName = EQ_TABLE_NAME,
    indices = [
        Index(value = [GROUPID_COLUMN]),
        Index(TITLE_ENGLISH_MAP_COLUMN),
        Index(LANGUAGE_ID_MAP_COLUMN)
    ],
    foreignKeys = [
        ForeignKey(
            entity = Language::class,
            parentColumns = [LANGUAGE_ID_COLUMN],
            childColumns = [LANGUAGE_ID_MAP_COLUMN],
            onDelete = CASCADE,
            onUpdate = CASCADE
        )
    ]
)
data class EQ_List(
    @PrimaryKey
    @ColumnInfo(name = EQID_COLUMN)
    val id: Long? = null,
    @ColumnInfo(name = TITLE_COLUMN)
    val title: String,
    @ColumnInfo(name = GROUPID_COLUMN)
    val groupId: Long,
    @ColumnInfo(name = TITLE_ENGLISH_MAP_COLUMN)
    val titleEnglishMap: Long,
    @ColumnInfo(name = LANGUAGE_ID_MAP_COLUMN)
    val languageIdMap: Long
)
  • TRIGGER_SQL 是使用 const 可以简化编码的主要示例。
  • 请注意,请参阅 TheDatabase 以了解如何实施 TRIGGER

QTTranslated 是一个 POJO class 用于提取翻译后的标题(示例用法请参见 AllDao 和 MainActivity)

const val EXPECTED_QTYLISTID_COLUMN = "qtyListId"
const val EXPECTED_TRANSLATEDTITLE_COLUMN = "translatedTitle"
const val EXPECTED_QUANTITY_COLUMN = "qty"
const val EXPECTED_LANGUAGENAME_COLUMN = "languageName"
const val EXPECTED_LANGUAGESHORTNAME_COLUMN = "languageNameShort"
data class QTTranslated(
    val qtyListId: Long,
    val translatedTitle: String,
    val qty: Long,
    val languageName: String,
    val languageNameShort: String
)
  • 注意预期的必须匹配 val/var 名称

用@Dao注释的AllDaoclass(注意抽象调用而不是接口):-

@Dao
abstract class AllDao {
    @Insert(onConflict = IGNORE)
    abstract fun insert(language: Language): Long
    @Insert(onConflict = IGNORE)
    abstract fun insert(qtList: QT_List): Long

    /* SHOULDN'T BE USED */
    @Insert(onConflict = IGNORE)
    abstract fun insert(eqList: EQ_List): Long

    /* For insert Base EQ_List rows (the English title) */
    @Query("INSERT INTO $EQ_TABLE_NAME (" +
            "$TITLE_COLUMN," +
            "$GROUPID_COLUMN," +
            "$LANGUAGE_ID_MAP_COLUMN," +
            "$TITLE_ENGLISH_MAP_COLUMN" +
            ") " +
            "VALUES(" +
            ":title," +
            ":groupId," +
            "(SELECT $LANGUAGE_ID_COLUMN FROM $LANGUAGE_TABLE_NAME WHERE $LANGUAGE_NAME_COLUMN = :languageName)," +
            "$BASE_EQ_VALUE" +
            ")")

    abstract fun insertBaseEQ_List(title: String, groupId: Long,languageName: String = "English"): Long

    /* For inserting the other language versions of the base title */
    @Query("INSERT INTO $EQ_TABLE_NAME (" +
            "$TITLE_COLUMN," +
            "$GROUPID_COLUMN," +
            "$LANGUAGE_ID_MAP_COLUMN," +
            "$TITLE_ENGLISH_MAP_COLUMN" +
            ") " +
            "VALUES(" +
            ":title," +
            "(SELECT $GROUPID_COLUMN FROM $EQ_TABLE_NAME WHERE $TITLE_COLUMN LIKE :baseTitle)," +
            "(SELECT $LANGUAGE_ID_COLUMN FROM $LANGUAGE_TABLE_NAME WHERE $LANGUAGE_NAME_COLUMN LIKE :languageName)," +
            "(SELECT $EQID_COLUMN FROM ${EQ_TABLE_NAME} WHERE ${TITLE_COLUMN} LIKE :baseTitle))")
    abstract fun insertOtherLanguageEQ_List(title: String, baseTitle: String, languageName: String)

    /* TRIGGER alternative (not demonstrated) */
    @Query("UPDATE $EQ_TABLE_NAME SET $TITLE_ENGLISH_MAP_COLUMN = $EQID_COLUMN WHERE $TITLE_ENGLISH_MAP_COLUMN = $BASE_EQ_VALUE")
    abstract fun reconcileBaseEQ_List(): Int

/* The query that gets translated version according to the languagename passed */
    @Query("SELECT " +
            "$QTY_ID_COLUMN AS $EXPECTED_QTYLISTID_COLUMN," +
            "${TITLE_COLUMN} AS $EXPECTED_TRANSLATEDTITLE_COLUMN," +
            "${QTY_COLUMN} AS $EXPECTED_QUANTITY_COLUMN," +
            "${LANGUAGE_NAME_COLUMN} AS $EXPECTED_LANGUAGENAME_COLUMN," +
            "${LANGUAGE_SHORTNAME_COLUMN} AS $EXPECTED_LANGUAGESHORTNAME_COLUMN " +
            "FROM ${QTY_TABLE_NAME} " +
            "JOIN ${EQ_TABLE_NAME} ON ${QTY_TABLE_NAME}.${QTY_GROUP_ID_COLUMN} = ${EQ_TABLE_NAME}.${GROUPID_COLUMN} " +
            "JOIN ${LANGUAGE_TABLE_NAME} ON ${EQ_TABLE_NAME}.${LANGUAGE_ID_MAP_COLUMN} = ${LANGUAGE_TABLE_NAME}.${LANGUAGE_ID_COLUMN} " +
            "WHERE ${LANGUAGE_NAME_COLUMN} LIKE :languageName")
    abstract fun getQTTranslatedList(languageName: String): List<QTTranslated>
}

@Database注解class TheDatabase suitable 用于Room实现的演示:-

const val DATABASE_NAME = "the_database.db"
@Database(entities = [Language::class,EQ_List::class,QT_List::class], version = 1, exportSchema = false)
abstract class TheDatabase: RoomDatabase() {
    abstract fun getAllDao(): AllDao

    companion object {
        private var instance: TheDatabase? = null
        fun getInstance(context: Context): TheDatabase {
            if (instance == null) {
                instance = Room.databaseBuilder(context,TheDatabase::class.java, DATABASE_NAME)
                    .addCallback(cb)
                    .allowMainThreadQueries()
                    .build()
            }
            return instance as TheDatabase
        }
    }

    /* Want to add the Trigger */

    object cb : RoomDatabase.Callback() {
        /* onOpen will try to add the trigger every time the database is opened
            although perhaps overkill it will ensure that the trigger always exists
            so is more forgiving of room not knowing about the trigger
        * */

        override fun onOpen(db: SupportSQLiteDatabase) {
            super.onOpen(db)
            db.execSQL(TRIGGER_SQL)
        }
        /* onCreate will only add the trigger when the database is created
            this would be the typical way BUT BEWARE Room doesn't know about the trigger
            if the table is deleted the trigger will be deleted
        * */
        override fun onCreate(db: SupportSQLiteDatabase) {
            super.onCreate(db)
            db.execSQL(TRIGGER_SQL)
        }
    }

}

最后一个 activity、MainActivity 来复制一些原始答案(旨在 运行 一次):-

const val TAG = "DBINFO"
class MainActivity : AppCompatActivity() {
    lateinit var dbInstance: TheDatabase
    lateinit var dao: AllDao
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        dbInstance = TheDatabase.getInstance(this)
        dao = dbInstance.getAllDao()

        dao.insert(Language(languageName = "English", languageShortName = "en"))
        dao.insert(Language(languageName = "French", languageShortName = "fr"))
        dao.insert(Language(languageName = "German", languageShortName = "de"))

        dao.insertBaseEQ_List(title = "Television",1)
        dao.insertOtherLanguageEQ_List(title = "Le Tele", baseTitle = "Television","French")
        dao.insertOtherLanguageEQ_List("Fernsehen","Television","German")

        dao.insert(QT_List(valgroupId = 1, qty = 3))
        dao.insert(QT_List(valgroupId = 1, qty = 6))
        dao.insert(QT_List(valgroupId = 1, qty = 8))

        for(q: QTTranslated in dao.getQTTranslatedList("French")) {
            Log.d(TAG,"QT_List id = ${q.qtyListId} Translated Title = ${q.translatedTitle} Quantity = ${q.qty} Language is ${q.languageName}/${q.copy()}")
        }
        for(q: QTTranslated in dao.getQTTranslatedList("English")) {
            Log.d(TAG,"QT_List id = ${q.qtyListId} Translated Title = ${q.translatedTitle} Quantity = ${q.qty} Language is ${q.languageName}/${q.copy()}")
        }
        for(q: QTTranslated in dao.getQTTranslatedList("German")) {
            Log.d(TAG,"QT_List id = ${q.qtyListId} Translated Title = ${q.translatedTitle} Quantity = ${q.qty} Language is ${q.languageName}/${q.copy()}")
        }

        dao.insert(Language(languageName = "Spanish", languageShortName = "es"))
        dao.insert(Language(languageName = "Italian", languageShortName = "it"))

        dao.insertOtherLanguageEQ_List(title = "Televisión", baseTitle = "Television", languageName = "Spanish")
        dao.insertOtherLanguageEQ_List(title = "Television", baseTitle = "Television", languageName = "iTaLiAn")

        for(q: QTTranslated in dao.getQTTranslatedList("sPANISH")) {
            Log.d(TAG,"QT_List id = ${q.qtyListId} Translated Title = ${q.translatedTitle} Quantity = ${q.qty} Language is ${q.languageName}/${q.copy()}")
        }
        for(q: QTTranslated in dao.getQTTranslatedList("ItAlIaN")) {
            Log.d(TAG,"QT_List id = ${q.qtyListId} Translated Title = ${q.translatedTitle} Quantity = ${q.qty} Language is ${q.languageName}/${q.copy()}")
        }
    }
}

日志中的结果

2022-01-17 21:26:48.638 D/DBINFO: QT_List id = 1 Translated Title = Le Tele Quantity = 3 Language is French/QTTranslated(qtyListId=1, translatedTitle=Le Tele, qty=3, languageName=French, languageNameShort=fr)
2022-01-17 21:26:48.638 D/DBINFO: QT_List id = 2 Translated Title = Le Tele Quantity = 6 Language is French/QTTranslated(qtyListId=2, translatedTitle=Le Tele, qty=6, languageName=French, languageNameShort=fr)
2022-01-17 21:26:48.638 D/DBINFO: QT_List id = 3 Translated Title = Le Tele Quantity = 8 Language is French/QTTranslated(qtyListId=3, translatedTitle=Le Tele, qty=8, languageName=French, languageNameShort=fr)
2022-01-17 21:26:48.639 D/DBINFO: QT_List id = 1 Translated Title = Television Quantity = 3 Language is English/QTTranslated(qtyListId=1, translatedTitle=Television, qty=3, languageName=English, languageNameShort=en)
2022-01-17 21:26:48.639 D/DBINFO: QT_List id = 2 Translated Title = Television Quantity = 6 Language is English/QTTranslated(qtyListId=2, translatedTitle=Television, qty=6, languageName=English, languageNameShort=en)
2022-01-17 21:26:48.639 D/DBINFO: QT_List id = 3 Translated Title = Television Quantity = 8 Language is English/QTTranslated(qtyListId=3, translatedTitle=Television, qty=8, languageName=English, languageNameShort=en)
2022-01-17 21:26:48.640 D/DBINFO: QT_List id = 1 Translated Title = Fernsehen Quantity = 3 Language is German/QTTranslated(qtyListId=1, translatedTitle=Fernsehen, qty=3, languageName=German, languageNameShort=de)
2022-01-17 21:26:48.640 D/DBINFO: QT_List id = 2 Translated Title = Fernsehen Quantity = 6 Language is German/QTTranslated(qtyListId=2, translatedTitle=Fernsehen, qty=6, languageName=German, languageNameShort=de)
2022-01-17 21:26:48.640 D/DBINFO: QT_List id = 3 Translated Title = Fernsehen Quantity = 8 Language is German/QTTranslated(qtyListId=3, translatedTitle=Fernsehen, qty=8, languageName=German, languageNameShort=de)
2022-01-17 21:26:48.649 D/DBINFO: QT_List id = 1 Translated Title = Televisión Quantity = 3 Language is Spanish/QTTranslated(qtyListId=1, translatedTitle=Televisión, qty=3, languageName=Spanish, languageNameShort=es)
2022-01-17 21:26:48.649 D/DBINFO: QT_List id = 2 Translated Title = Televisión Quantity = 6 Language is Spanish/QTTranslated(qtyListId=2, translatedTitle=Televisión, qty=6, languageName=Spanish, languageNameShort=es)
2022-01-17 21:26:48.649 D/DBINFO: QT_List id = 3 Translated Title = Televisión Quantity = 8 Language is Spanish/QTTranslated(qtyListId=3, translatedTitle=Televisión, qty=8, languageName=Spanish, languageNameShort=es)
2022-01-17 21:26:48.650 D/DBINFO: QT_List id = 1 Translated Title = Television Quantity = 3 Language is Italian/QTTranslated(qtyListId=1, translatedTitle=Television, qty=3, languageName=Italian, languageNameShort=it)
2022-01-17 21:26:48.650 D/DBINFO: QT_List id = 2 Translated Title = Television Quantity = 6 Language is Italian/QTTranslated(qtyListId=2, translatedTitle=Television, qty=6, languageName=Italian, languageNameShort=it)
2022-01-17 21:26:48.650 D/DBINFO: QT_List id = 3 Translated Title = Television Quantity = 8 Language is Italian/QTTranslated(qtyListId=3, translatedTitle=Television, qty=8, languageName=Italian, languageNameShort=it)