相关疑难解决方法(0)

多语言数据库的模式

我正在开发一种多语言软件.就应用程序代码而言,可本地化不是问题.我们可以使用特定于语言的资源,并拥有适合他们的各种工具.

但是,定义多语言数据库模式的最佳方法是什么?假设我们有很多表(100或更多),每个表可以有多个可以本地化的列(大多数nvarchar列应该是可本地化的).例如,其中一个表可能包含产品信息:

CREATE TABLE T_PRODUCT (
  NAME        NVARCHAR(50),
  DESCRIPTION NTEXT,
  PRICE       NUMBER(18, 2)
)
Run Code Online (Sandbox Code Playgroud)

我可以想到三种方法来支持NAME和DESCRIPTION列中的多语言文本:

  1. 每种语言的单独列

    当我们向系统添加新语言时,我们必须创建其他列来存储翻译后的文本,如下所示:

    CREATE TABLE T_PRODUCT (
      NAME_EN        NVARCHAR(50),
      NAME_DE        NVARCHAR(50),
      NAME_SP        NVARCHAR(50),
      DESCRIPTION_EN NTEXT,
      DESCRIPTION_DE NTEXT,
      DESCRIPTION_SP NTEXT,
      PRICE          NUMBER(18,2)
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 翻译表与每种语言的列

    不存储翻译的文本,而是仅存储翻译表的外键.转换表包含每种语言的列.

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION (
      TRANSLATION_ID,
      TEXT_EN NTEXT,
      TEXT_DE NTEXT,
      TEXT_SP NTEXT
    )
    
    Run Code Online (Sandbox Code Playgroud)
  3. 用于每种语言的行的转换表

    不存储翻译的文本,而是仅存储翻译表的外键.转换表仅包含一个键,而一个单独的表包含每个语言转换的行.

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION ( …
    Run Code Online (Sandbox Code Playgroud)

multilingual database-design localization

222
推荐指数
5
解决办法
9万
查看次数

保留多语言数据的最佳数据库结构是什么?

可能重复:
多语言数据库的模式

这是一个例子:

[ products ]
id (INT)
name-en_us (VARCHAR)
name-es_es (VARCHAR)
name-pt_br (VARCHAR)
description-en_us (VARCHAR)
description-es_es (VARCHAR)
description-pt_br (VARCHAR)
price (DECIMAL)
Run Code Online (Sandbox Code Playgroud)

问题是:每种新语言都需要修改表结构.

这是另一个例子:

[ products-en_us ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)

[ products-es_es ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)
Run Code Online (Sandbox Code Playgroud)

问题是:每种新语言都需要创建新表,并且"价格"字段在每个表中都是重复的.

这是另一个例子:

[ languages ]
id (INT)
name (VARCHAR)

[ products ]
id (INT)
price (DECIMAL)

[ translation ]
id (INT, PK)
model (VARCHAR) // product
field (VARCHAR) // name
language_id (INT, …
Run Code Online (Sandbox Code Playgroud)

mysql database multilingual translation localization

53
推荐指数
3
解决办法
4万
查看次数

用于国际和多语言目的的数据库建模

我需要为一个多语言的Web应用程序创建一个大型数据库模型.

我每次想到如何做到这一点的一个疑问是我如何解决一个字段的多个翻译.一个案例.

管理员可以从后端编辑的语言级别表可以有多个项目,如:basic,advance,fluent,mattern ......在不久的将来,它可能会是另一种类型.管理员进入后端并添加一个新级别,它会将其排序在正确的位置..但我如何处理最终用户的所有翻译?

数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国再到DE ......在每个国家,他们都有自己的水平(可能它会相当于另一个但最终不同).计费怎么样?

你如何大规模地模拟这个?

mysql database multilingual database-design internationalization

34
推荐指数
2
解决办法
2万
查看次数

多语言数据库,具有默认回退功能

我有一个问题,我知道,已被广泛讨论过,但在我看来,还有一个方面需要澄清.

我正在创建一个带有多语言数据库的Web应用程序,我已经找到了一些好的练习文章(例如 这个),这里的答案就像这样堆栈溢出.

所以我决定使用一个带有我的项目ID的主表和另一个带有每个项目翻译的表格,比方说,例如

Content
ContentTranslation
Run Code Online (Sandbox Code Playgroud)

要么

Category
CategoryTranslation
Run Code Online (Sandbox Code Playgroud)

等等.

现在我在做什么?我只是从数据库中获取所有翻译的项目,然后我迭代每一个,以根据当前用户的本地查找正确的翻译,如果我找到正确的本地我设置到主要对象,该页面的翻译渲染,否则我只是得到标记为"默认"的翻译.

但是,对于大量对象和翻译,服务器响应时间可能会增长,即使用户可能没有注意到,我也不希望这样.

那么,这个用例有没有好的做法呢?例如,一些特定的查询说"选择带语言环境的翻译",但是如果你没有找到它只是设置了一个"默认"标志?

现在,我正在使用Spring MVC和Hibernate以及JPA(通过JPARepository).

我的对象都扩展了我用这种方式创建的基本可翻​​译类

@MappedSuperclass
public abstract class Translatable<T extends Translation> extends BaseDTO {

    private static final long serialVersionUID = 562001309781752460L;

    private String title;

    @OneToMany(fetch=FetchType.EAGER, orphanRemoval=true, cascade=CascadeType.ALL)
    private Set<T> translations = new HashSet<T>();

    @Transient private T currentLocale;

    public void addLocale(T translation, boolean edit) {
        if (!edit)
            getTranslations().add(translation);
    }

    public void remLocale(String locale) {
        T tr = null;
        for (T candidate: getTranslations()) {
            if (candidate.getLocale().equals(locale))
                tr …
Run Code Online (Sandbox Code Playgroud)

java database multilingual spring jpa

16
推荐指数
2
解决办法
2万
查看次数

如何在ORM中使用多语言数据库模式?

美好的一天!

我正在寻找实现多语言数据库模式的最佳方法,我使用的方法与此处相同:多语言数据库设计的最佳实践是什么?(一个表有语言中性数据,一个表用于所有翻译).它似乎很好,干净,并没有限制可能的语言数量.

但我想使用一个简单的ORM(如C#中的LINQ,PHP等出口),其中每个表都映射到实体类.这可以工作,但查询变得更加复杂.

可能有一些特殊技术可以使用这样的DB shema和ORM吗?或者我可以从支持更复杂映射的更复杂的ORM中受益?

提前致谢!

database orm multilingual

13
推荐指数
1
解决办法
9853
查看次数

如何为具有多语言支持的内容管理系统(cms)设计数据库模式?

我将构建一个具有多语言支持的站点,我需要能够控制文章,公司和产品的工作流程.全部具有多语言支持和多版本控制.有没有人已经有解决方案,或者我需要从头开始?

database-design multiple-languages content-management-system

6
推荐指数
2
解决办法
2万
查看次数

动态数据的本地化

我正在寻找有关本地化存储在数据库中的数据的最佳实践的建议.我正在开发一个Web应用程序,其中所有静态文本都使用文件进行本地化.管理员可以使用UI配置多个选项,这些选项存储在数据库中并需要对这些值进行本地化.

我们提出了几个可能的想法.您对这些解决方案有何看法?是否有更好的选择,甚至是标准的最佳实践?

每场专业本地化

这是针对多语言数据库设计的最佳实践提出的解决方案.我们将为每个本地化字段创建一个单独的表.例如,假设我们有台colorscolor_id,color_namecolor_description列,我们可以打破它为color与非本地化的数据和表格color_translationscolor_id,locale,color_namecolor_description领域.

但是,我们的客户经常将本地化文件发送给第三方进行翻译,这变得很棘手.

单表本地化

另一种选择是创建一个表来表示所有数据库本地化:

CREATE TABLE localized_text
(
    key          VARCHAR(256) NOT NULL,
    locale       CHAR(5) NOT NULL,
    value        VARCHAR(256),
    PRIMARY KEY (key, locale)
);
Run Code Online (Sandbox Code Playgroud)

这对于异地本地化而言更容易导出,但增加了一定程度的间接性.

database-design localization

5
推荐指数
1
解决办法
1915
查看次数

数据库支持PHP网站的i18n

我有一个用PHP编写的网站,有15-20页,他们有很多文字.我必须将它翻译成3种不同的语言.首先,我尝试使用strings($text_hello = "??";)但是这个选项变得非常繁琐且难以用50多个字符串来管理.我也发现了gettext选项,这很好.但我特别感兴趣的是(MySQL)数据库支持选项,其中所有翻译都将从数据库中获取.另外,我可能是错的,但是使用gettext,你必须拥有额外的index.php ?lang=en_US(?)我希望它在Twitter或Facebook上更改,就像URL不会改变一样.你能建议我怎么做或指导我这个主题的教程/文章/以前的问题吗?谢谢!

另外,我看到人们推荐Zend_Translate,但这是否需要我在Zend框架中重新编写我的网站?

在询问之前,我确实在搜索它,但我得到的结果并不是我想要的.

php database localization gettext internationalization

5
推荐指数
1
解决办法
862
查看次数

适用于i18n的FuelPHP ORM数据库架构,意见/建议

虽然这个问题可能 其他许多问题类似, 我想就FuelYP上针对i18n的最佳方法提出意见/建议.

所以,这是我到目前为止所得到的:

数据库架构#1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en)
Run Code Online (Sandbox Code Playgroud)

样本数据#1:

(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description')
Run Code Online (Sandbox Code Playgroud)

优点:

  • 直接而简单
  • 每个型号一张表
  • 无需使用JOIN
  • 使用魔术方法简化数据访问:

 

public function & __get($property)
{
    if (array_key_exists($property, array('name', 'description')))
    {
        $property = $property.'_'.Session::get('lang_code');
    }

    return parent::__get($property);
}
Run Code Online (Sandbox Code Playgroud)

这样,我就可以打电话了:

$model->name;
$model->description;
Run Code Online (Sandbox Code Playgroud)

代替:

$model->{'name_'.Session::get('lang_code')};
$model->{'description_'.Session::get('lang_code')};
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 拥有大量语言/翻译字段可能会变得混乱.
  • 添加新语言意味着向表中添加新字段
  • 魔术方法仅在我们已有ORM实例/对象时才有效.要通过由翻译字段排序的查询构建器来获取ORM实例,它仍然需要以下代码:

 

Model_Model::query()
    ->order_by('name_'.Session::get('lang_code'))
    ->get();
Run Code Online (Sandbox Code Playgroud)

数据库架构#2:

languages (id, code, name)
models (id)
i18n_models (id, …
Run Code Online (Sandbox Code Playgroud)

database orm internationalization fuelphp

5
推荐指数
1
解决办法
589
查看次数

使用strings.xml在数据库上存储多语言值的最佳方法?

这是我的第一个问题:)

我正在开发一个将动物物种存储在数据库中的应用程序.该应用程序必须是多语言,所以我应该利用strings.xml资源文件.

想法是在db上存储物种的英文名称,例如"cat","dog"等.然后根据像这样的xml(意大利语)向用户显示实际的翻译:

<string name="dog">Cane</string>
<string name="cat">Gatto</string>
Run Code Online (Sandbox Code Playgroud)

问题是R.string包含名称dog和cat,但它们实际上是int,所以我正在寻找一种方法来使用"dog"字符串来比较R.string.dog翻译的值.

我几乎可以肯定我的设计非常错误,但不知道做这种工作的正确方法是什么,因为应用程序现在处于开发的早期阶段.

谢谢

用例子编辑

这个例子说明了这个问题:

数据库数据:

row1:id ="1",value ="dog"

row2:id ="2",value ="cat"

字符串文件strings.xml:

<string name="dog">Dog</string>
<string name="cat">Cat</string>
Run Code Online (Sandbox Code Playgroud)

字符串文件strings-it.xml:

<string name="dog">Cane</string>
<string name="cat">Gatto</string>
Run Code Online (Sandbox Code Playgroud)

我的问题是:用户想要用他的母语插入一个物种(例如"Cane"),我想在插入之前在DB中搜索它的存在.

我应循环数据库中的每一行(其中值以英语存储),获取每行的翻译(例如:我找到了cat,然后我翻译为"Gatto")并与用户输入进行比较.

有可能吗?

android

3
推荐指数
1
解决办法
2001
查看次数