如何在多语言Web应用程序中转换和存储可配置项?

时间:2015-07-03 11:06:34

标签: c# c#-4.0 web-applications multilingual

我有一个多语言Web应用程序。我正在使用资源文件转换所有控件,即标签,下拉列表,文本和消息

问题:

例如,注册页面下载Prefix-Mr,Mrs,Miss等。这个前缀数据来自一个表格,并且是可配置的,即我们有一个配置网页。

还有许多其他可配置的东西和相应的页面。

我的问题是如何将这些数据转换为其他语言,以及如何保存相同的资源文件无法完成。

任何有实际想法的人都可以指导我。

7 个答案:

答案 0 :(得分:2)

如果用户可以配置,那么使用资源文件是不切实际的,因为用户可以配置他们需要的任何内容。

因此,如果我理解正确,我认为唯一可行的解​​决方案是在表中为用户输入的每个值进行翻译。

由于用户可以使用任何语言输入值,因此可能会变得棘手。

我会选择默认的所需语言,比如英语,所以每当用户管理值(样本中的标题或前缀)时,他们必须成对管理它们,即他们的语言和英语。

因此,如果语言环境是法语,当他们检查标题索引时,会看到两列,一列是法语,一列是英语。

如果法国用户第一次进入视图,则没有法语值,因此用户必须为准备好的英语值添加法语翻译。

如果用户添加了新的[法语]值,那么她/他也必须输入英语翻译。

它看起来很麻烦,可能不太实用,但它是一种选择!

最佳,

PD:嘿,请到达时分享解决方案!

答案 1 :(得分:2)

Microsoft .NET支持使用System.Globalization命名空间中的CultureInfo类处理特定于文化的信息。文化信息既可以在页面级别也可以在应用程序级别设置。

# Retrieve computer names
$Computers = Get-Content C:\Users\araff\Desktop\FlashUpdater\Servers.txt

# Select only the name from the output
#$Computers = $Computers | Select-Object -ExpandProperty Name

#Sets command to execute if the version is not 18.0.0.203
$command = @'
cmd.exe /C uninstall_flash_player.exe -uninstall
'@

#Iterate through each computer and execute the command if the version is not 18.0.0.203
[Array]$Collection = foreach ($Computer in $Computers){

$AD = Get-ADComputer $computer -Properties LastLogonDate
$ping = Test-Connection -quiet -computername $computer -Count 2
$datetime = Get-Date

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $computer)
$RegKey= $Reg.OpenSubKey("SOFTWARE\Macromedia\FlashPlayerActiveX")
$version = $RegKey.GetValue("Version")

if ($version -eq '= 18.0.0.203') {
        $installed = "Flash is up to date!"
    }
    Else {
        $installed = "Removing old version..."
        Invoke-Expression -Command:$command
    }

    New-Object -TypeName PSObject -Property @{
    TimeStamp = $datetime
    ComputerName = $computer
    Installed = $installed
    OnlineStatus = $ping
    LastLogonDate = $AD.LastLogonDate
} | Select-Object TimeStamp, ComputerName, Installed, OnlineStatus, LastLogonDate

}

#Exports csv
$Collection | Export-Csv FlashUpdaterOutput.csv -NoTypeInformation

要在应用程序级别设置文化信息,请在web.config文件的“全球化”部分中使用以下内容。

<%@ Page language="C#" Culture="fr-FR"%>

试试这个,

<configuration>
 <system.web>
  <globalization
   culture="en-GB"
  />
 </system.web>
</configuration>

答案 2 :(得分:1)

  

例如,注册页面下载了Prefix-Mr,Mrs,Miss   这个前缀数据来自一个表,可以配置,即我们   有一个相同的配置网页。

由于下拉列表的值在数据库中,我认为翻译也应该在数据库中。

简单的方法是在titles表中为每种语言设置一个字段:

--------------------------
| Id | TitleEn | TitleFr |
--------------------------
|  1 |  Mr     | M       |
|  2 |  Mrs    | Mme     |
|  3 |  Miss   | Mlle    |
--------------------------

但是,如果你有更多的语言,或者你想在将来添加语言,这将无法很好地扩展。

我这样做的方法是添加一个localized_string表,如下所示:

--------------------------
| Id | Language | String |
--------------------------
|  7 |  FR      | M      |
|  8 |  FR      | Mme    |
|  9 |  FR      | Mlle   |
|  7 |  EN      | Mr     |
|  8 |  EN      | Mrs    |
|  9 |  EN      | Miss   |  
--------------------------

在titles表和任何其他需要localized_string的表中,存储字符串的Id:

----------------------------
| Id | localized_string_id |
----------------------------
|  1 |  7                  |
|  2 |  8                  |
|  3 |  9                  |
----------------------------

通过这种方式,您可以使用任何语言查询本地化字符串,并且可以根据需要添加任意数量的语言,而无需修改数据库架构。

答案 3 :(得分:0)

我目前在应用程序中实现多语言支持的方式是通过以下方法。

  • 创建一个名为Language的抽象类,所有语言都继承自。
  • 为需要翻译的每个文本字符串添加抽象字符串属性。
  • 从基类Language继承的每种语言都只返回字符串的本地化版本。
  • 创建一个全局属性来存储当前选择的语言类。
  • 获取需要从全局属性进行翻译而不是在本地设置的字符串值。

虽然添加翻译后的字符串很繁琐,但我发现这种方法可以确保翻译所有需要的部分,同时保持UI代码尽可能简单。

使用基类还允许重复使用可在所有语言中使用的任何方法或属性。

试着给出一个基本的轮廓,结构会像这样。

//基础语言课

public class en_gb : Language
{
    // Constructor simply provides base class with the language code.
    public en_gb() : base ("en_gb"){}

    // By inheriting from Language these properties must be overridden.
    // Visual Studio will add these properties for you, so you simply need to add the return value.
    public override string Hello {get {return "Hello";} }
    public override string Goodbye {get {return "Goodbye";} }
}

//示例英语语言课程

public class es_sp : Language
{
    // Constructor simply provides base class with the language code.
    public es_sp() : base ("es_sp"){}

    // By inheriting from Language these properties must be overridden.
    // Visual Studio will add these properties for you, so you simply need to add the return value.
    public override string Hello {get {return "Hola";} }
    public override string Goodbye {get {return "Adiós";} }
}

//示例西班牙语语言课程

public Language CurrrentLanguage {get; set;}

然后你就可以在某个地方拥有一个全局属性。

<TextBlock Text="{Binding Source={StaticResource GlobalValues}, Path=CurrrentLanguage.Hello}" />

然后,所有需要翻译的元素都可以引用CurrrentLanguage属性来返回所需的字符串。

XAML示例:

Textbox1.Text = GlobalValues.CurrentLanguage.Hello;

代码示例:

if ( ! function_exists( 'theme_special_nav' ) ) {
    function theme_special_nav() {
        //  Do something.
    }
}

答案 4 :(得分:0)

扩展资源提供程序很可能是您想要采取的方法。

查看以下内容:

https://msdn.microsoft.com/en-us/library/aa905797.aspx(本文的上下文是ASP.Net WebForms;请查看“构建数据库资源提供程序”部分。)

http://weblogs.asp.net/thangchung/extending-resource-provider-for-soring-resources-in-the-database(此博文实际上适用于上述MSDN文章中所涵盖的内容,但适用于ASP.Net MVC而非WebForms。)

我不确定您正在构建什么类型的ASP.Net应用程序,所以我认为包含WebForms和MVC的引用是很有价值的。

这两个参考文献中提到的内容应该为您提供实施自己解决方案的良好基础。

答案 5 :(得分:0)

要保存用户在资源中动态输入的配置内容,您可以使用XMLParser,如下所示:

IResourceWriter writer = new ResourceWriter("Resource.resx");
// Adds resources to the resource writer.
writer.AddResource("String 1", "First String");
writer.AddResource("String 2", "Second String");
// Writes the resources to the file or stream, and closes it.
writer.Close();

答案 6 :(得分:0)

尝试使用XML格式来区分您的语言

<Controls>
<Control>
<DropDown>
<English>Cities</English>
<Urdu>شھر</Urdu>
<Arabic>البد</Arabic>
</DropDown>
</Control>
</Controls>