标签: multilingual

多语言数据库的模式

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

但是,定义多语言数据库模式的最佳方法是什么?假设我们有很多表(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万
查看次数

你如何实现一个良好的亵渎过滤器?

我们中的许多人需要处理用户输入,搜索查询以及输入文本可能包含亵渎语言或不良语言的情况.通常需要将其过滤掉.

哪里可以找到各种语言和方言的咒骂词?

是否有可用于包含良好列表的源的API?或者也许一个API只是简单地说"是的这是干净的"或"没有这是脏的"一些参数?

有什么好方法可以让人们试图欺骗系统,比如$$,azz或a55?

如果您提供PHP解决方案,则可获得奖励积分.:)

编辑:响应答案,只是避免程序问题:

例如,我认为这种过滤器有一个位置,例如,用户可以使用公共图像搜索来查找添加到敏感社区池的图片.如果他们可以搜索"阴茎",那么他们很可能会得到许多照片,是的.如果我们不想要那些图片,那么防止这个词作为搜索词是一个很好的看门人,尽管不可否认这不是一个万无一失的方法.首先获取单词列表是真正的问题.

所以我真的指的是一种方法来弄清楚单个令牌是否脏,然后简单地禁止它.我不打算像完全搞笑的"长颈长颈鹿"参考那样阻止一种情绪.你无能为力.:)

php regex multilingual user-input

200
推荐指数
11
解决办法
10万
查看次数

要三元还是不三元?

我个人是三元运算符的拥护者:()?:; 我确实意识到它有它的位置,但我遇到了许多完全反对使用它的程序员,而且有些人经常使用它.

你有什么感受?你看到了什么有趣的代码?

multilingual ternary-operator conditional-operator

180
推荐指数
17
解决办法
4万
查看次数

最佳实践多语言网站

我已经在这个问题上苦苦挣扎了好几个月,但我还没有遇到过需要探索所有可能的选择的情况.现在,我觉得是时候了解可能性并创建我自己的个人偏好,以便在我即将开展的项目中使用.

让我先描绘一下我正在寻找的情况

我即将升级/重新开发我已经使用了很长一段时间的内容管理系统.但是,我觉得多语言是对这个系统的一个很大的改进.在我没有使用任何框架之前,我将使用Laraval4进行即将到来的项目.Laravel似乎是更简洁的PHP编码方式的最佳选择.Sidenote: Laraval4 should be no factor in your answer.我正在寻找独立于平台/框架的一般翻译方式.

应该翻译什么

由于我正在寻找的系统需要尽可能用户友好,管理翻译的方法应该在CMS内部.应该没有必要启动FTP连接来修改翻译文件或任何html/php解析模板.

此外,我正在寻找最简单的方法来翻译多个数据库表,而不需要创建额外的表.

我自己想出了什么

正如我一直在寻找,阅读和尝试自己.我有几个选择.但我仍然觉得我没有达到我真正寻求的最佳实践方法.现在,这是我想出来的,但这种方法也有它的副作用.

  1. PHP Parsed Templates:模板系统应该由PHP解析.这样我就可以将翻译过的参数插入到HTML中,而无需打开模板并进行修改.除此之外,PHP解析模板使我能够为完整的网站提供1个模板,而不是每个语言都有一个子文件夹(我以前有过).达到此目标的方法可以是Smarty,TemplatePower,Laravel的Blade或任何其他模板解析器.正如我所说,这应该独立于书面解决方案.
  2. 数据库驱动:也许我不需要再提这个.但解决方案应该是数据库驱动的.CMS旨在面向对象和MVC,因此我需要考虑字符串的逻辑数据结构.因为我的模板是结构化的:templates/Controller/View.php也许这个结构最有意义:Controller.View.parameter.数据库表将使用字段将这些字段设置为long value.在模板内部,我们可以使用类似的排序方法echo __('Controller.View.welcome', array('name', 'Joshua')),参数包含Welcome, :name.因此结果是Welcome, Joshua.这似乎是一个很好的方法,因为参数如:name很容易被编辑器理解.
  3. 低数据库负载:当然,如果在运行中加载这些字符串,上述系统将导致数据库负载的负载.因此,我需要一个缓存系统,一旦在管理环境中编辑/保存语言文件,就会重新呈现语言文件.由于生成了文件,因此还需要良好的文件系统布局.我想我们可以使用languages/en_EN/Controller/View.php或.ini,最适合你的.也许.ini甚至可以在最后解析得更快.这个应该包含的数据format parameter=value; .我想这是执行此操作的最佳方式,因为呈现的每个View都可以包含它自己的语言文件(如果存在).然后,语言参数应加载到特定视图而不是全局范围,以防止参数相互覆盖.
  4. 数据库表翻译:这实际上是我最担心的事情.我正在寻找一种方法来创建新闻/页面/等的翻译.尽快.每个模块有两个表(例如NewsNews_translations)是一个选项,但是为了获得一个好的系统感觉很多.我想出的一件事是基于data versioning我写的一个系统:有一个数据库表名Translations,这个表有一个独特的组合language,tablenameprimarykey.例如:en_En/News/1(参考ID = 1的新闻项目的英文版本).但是这个方法存在两个巨大的缺点:首先,这个表在数据库中有大量数据需要很长时间,其次使用这个设置搜索表是一件很麻烦的工作.例如,搜索项目的SEO slug将是一个全文搜索,这是相当愚蠢的.但另一方面:它是一种快速的方式,可以非常快速地在每个表格中创建可翻译内容,但我不相信这个专业人士会超过这个内容.
  5. 前端工作:前端也需要一些思考.当然,我们会将可用语言存储在数据库中,并(de)激活我们需要的语言.通过这种方式,脚本可以生成下拉列表以选择语言,后端可以自动决定使用CMS可以进行哪些翻译.然后,在获取视图的语言文件或获取网站上内容项的正确翻译时,将使用所选语言(例如en_EN).

所以,他们就是.我的想法到目前为止.他们甚至不包括日期等的本地化选项,但是因为我的服务器支持PHP5.3.2 +,最好的选择是使用intl扩展,如下所述:http://devzone.zend.com/1500/internationalization-in -php-53 / - 但这将在任何后期的开发体育场中使用.目前,主要问题是如何在网站上获得最佳的内容翻译实践.

除了我在这里解释的一切,我还有另一件我尚未决定的事情,它看起来像一个简单的问题,但事实上它让我头痛:

网址翻译?我们应该这样做吗?以什么方式?

所以..如果我有这个网址:http://www.domain.com/about-us …

php mysql multilingual localization internationalization

166
推荐指数
7
解决办法
13万
查看次数

使codeigniter网站成为多语言的最佳方式.从lang数组调用取决于lang会话?

我正在研究时间和工作时间,但我找不到任何明确,有效的方法来制作它:/

我有一个英文的codeigniter基础网站,我现在必须添加波兰语.根据访客选择,以2种语言制作我的网站的最佳方法是什么?

有没有办法为每种语言创建数组文件,并在视图文件中调用它们取决于来自lang选择的会话?我不想使用数据库.

感谢帮助!我已经没过截止日期了:/谢谢!!

arrays session multilingual codeigniter

81
推荐指数
3
解决办法
12万
查看次数

Laravel验证属性"好名字"

我正在尝试使用"language> {language}> validation.php"中的验证属性来替换正确读取名称的:属性名称(输入名称)(例如:first_name>名字).使用起来似乎很简单,但验证器没有显示"好名字".

我有这个:

'attributes' => array(
    'first_name' => 'voornaam'
  , 'first name' => 'voornaam'
  , 'firstname'  => 'voornaam'
);
Run Code Online (Sandbox Code Playgroud)

用于显示错误:

@if($errors->has())
  <ul>
  @foreach ($errors->all() as $error)
    <li class="help-inline errorColor">{{ $error }}</li>
  @endforeach
  </ul>
@endif
Run Code Online (Sandbox Code Playgroud)

并在控制器中进行验证:

$validation = Validator::make($input, $rules, $messages);
Run Code Online (Sandbox Code Playgroud)

$ messages数组:

$messages = array(
    'required' => ':attribute is verplicht.'
  , 'email'    => ':attribute is geen geldig e-mail adres.'
  , 'min'      => ':attribute moet minimaal :min karakters bevatten.'
  , 'numeric'  => ':attribute mag alleen cijfers bevatten.'
  , 'url'      => …
Run Code Online (Sandbox Code Playgroud)

php multilingual laravel laravel-3

79
推荐指数
5
解决办法
7万
查看次数

在大型.NET项目中实现多语言/全球化的最佳方式

我将很快开始研究一个大型的c#项目,并希望从一开始就构建多语言支持.我有一个游戏,可以使用每种语言的单独资源文件,然后使用资源管理器加载字符串.

我还有其他可以研究的好方法吗?

.net c# multilingual localization

74
推荐指数
3
解决办法
8万
查看次数

ASP.NET MVC应用程序中的多种语言?

在ASP.NET MVC应用程序中为接口支持多种语言的最佳方法是什么?我见过人们将资源文件用于其他应用程序.这仍然是最好的方式吗?

asp.net-mvc multilingual internationalization

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

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

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

这是一个例子:

[ 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万
查看次数

UITextView在iOS 7中错误地呈现自定义字体

我的应用程序使用UITextView输入Syriac文本(Estrangelo字体),但是UITextView会像这样错误地呈现一些字母:

在此输入图像描述

我用UILabel和UITextView测试了它.UILabel正确显示它,但UITextView错误地显示顶部点并将它们移动到底部(参见上面的结果).

此问题仅发生在iOS 7中,并且不会发生在iOS 6中.请告诉我是否有任何方法可以解决问题.

这是我的测试代码

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
label.center = CGPointMake(self.view.center.x, self.view.center.y-40);
label.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
label.text = @"?? ?? ?? ??";
[self.view addSubview:label];

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
textView.center = CGPointMake(self.view.center.x, self.view.center.y+40);
textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
textView.text = @"?? ?? ?? ??";
[self.view addSubview:textView];
Run Code Online (Sandbox Code Playgroud)

multilingual uitextview custom-font right-to-left ios7

48
推荐指数
1
解决办法
1876
查看次数