动态数据驱动的网站本地化

时间:2013-02-28 09:40:48

标签: asp.net localization data-driven

我有一个网站从数据库中读取一些内容,我需要这个网站有两种语言,英语和阿拉伯语。

所需内容在两种语言的数据库中都是重复的。假设我的数据库中有一个En_Name和Ar_Name列。

例如,对于阿拉伯语版本的网站,链接将显示来自Ar_Name的文本,而使用英语版本的链接将显示来自En_Name的文本。

对于我网站中的静态内容,我认为使用(.resx文件)使用ASP.NET默认本地化是个好主意。但我不知道的是如何为网站的动态部分进行本地化。

那么,如何从Ar_Name字段中读取相同的超链接一次,然后根据用户选择(本地化)从En_Name读取?

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一目标。您没有提到您正在使用哪种数据库技术,因此我的示例是使用Entity Framework。您可能需要根据自己的情况进行自定义。

LinqToSql或其他ORM可能有类似的东西。如果你正在完全使用其他东西,那么关键是要有一个中心类,你传递一致的东西(因此是界面)进行翻译。

例如,如果我使用的是Entity Framework,那么数据库中包含这两个字段的每个表都会添加一个公开这些字段的接口。然后我会有一个帮助类,其中包含一个带有该接口的任何实体的方法,并检查当前的本地化并返回正确的文本版本。

public interface IBilingualEntity
{
    // Defines a consistent interface that indicates which language version
    // each thing is in.
    string Ar_Name { get; }
    string En_Name { get; }
}

public partial MyEntity : IBilingualEntity
{
    // This is a class generate by Entity Framework. But it could
    // be anything really if you are using some other framework.
    //
    // Nothing to do here as the other side of the partial
    // should already implement the interface with the code
    // generated from Entity Framework. If not, implement the
    // interface and return the correct language version in
    // the property.
}

// This is the helper that works out which language version to use.
public class BilingualHelper
{
    public string GetName(IBilingualEntity entity)
    {
        // NOTE: You may have to strip away the region part of the name
        // but off the top of my head I can't remember the format.
        // If you are using something else to store the culture you'll 
        // have to reference that instead.
        var cultureName = Thread.CurrentThread.CurrentUICulture.Name;
        if (cultureName == "ar")
            return entity.Ar_Name;
        return entity.En_Name;
    }
}