2011-02-23 39 views
3

我正在构建一个需要同时支持英语和波斯语的网站。该网站使用ASP.NET MVC 3和.NET 4(C#)构建。我的所有控制器从BaseController,它设置为“FA-IR”(测试期间)文化继承:如何在ASP.NET MVC页面上显示波斯文数字?

Thread.CurrentThread.CurrentCulture = new CultureInfo("fa-IR"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fa-IR"); 

在我的意见,我使用的是静态辅助类转换成正确的时区和日期格式。像:

DateFormatter.ToLocalDateAndTime(model.CreatedOnUtc) 

我做的钱一样用MoneyFormatter。对于金钱来说,货币在波斯语中是正确打印的(或者至少我认为是这样,因为我不知道波斯语,但我们的翻译人员稍后会对其进行验证)。日期也是如此,其中月份打印正确。这是它显示为当前:

为了钱:

قیمت: ريال 1,000 

对于日期:

21:01 ديسمبر 3 

在这些例子中,我想这些数字同时打印波斯语。你怎么做到的?

我也尝试添加:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1256" /> 
HEAD标记

,在一些论坛的建议。不改变任何东西,但(从我能看到的)。我还在浏览器语言(包括IE和Firefox)中添加了“fa-IR”作为第一语言。也没有帮助。

任何人有任何想法如何解决这个问题?如果可能的话,我宁愿避免在英文数字和波斯文数字之间建立翻译表。

最好的问候,
埃里克

回答

1

也许你要更改字体。 如果你知道你的客户端支持特定的字体,比如说Badr或Nazanin,那么你可以改变这些数字的字体系列,我认为这对你有用。

您可以提供的字体为您的网页,但我认为在现代浏览器这只能与失败,在旧的。你可以check这个。
希望有所帮助。

+0

好主意,但如果可能的话,我宁愿使用预装在大多数机器上的常用字体。 – Eric 2011-02-23 20:33:32

+0

我明白你的意思。我们一直在波斯遇到问题。我们实现了我们自己的DatePicker,Calendar类和其他东西。而方向是另一个问题。 :( – 2011-02-23 22:46:59

0

你如何将数字输出到输出?我对本地化没有多少经验,但您可能必须使用适当的NumberFormatInfo或类似的东西来格式化数字。

也为最大的可移植性,你也许应该使用UTF-8作为编码。

+0

我使用“{0:0,0。##}”模式格式化货币,分别使用System.Globalization.NumberFormatInfo.CurrencyNegativePattern和CurrencyPositivePattern。我使用的NumberFormat是从CultureInfo对象返回的内容在我使用CultureInfo culture = new CultureInfo(“fa-IR”)实例化它之后;它不会“翻译”数字,但只是货币符号。顺便提一下,感谢utf8上的提示! – Eric 2011-02-23 20:21:07

3

经过进一步研究,我找到了答案,从微软的一名员工指出,他们不翻译的数字,虽然这是完全有可能使用的数字阵列特定的文化自己做,这是由NativeDigits酒店所提供(见http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.nativedigits.aspx)。

要了解如果在表单提交的文本是阿拉伯语或拉丁现在我做:

public bool IsContentArabic(string content) 
{ 
    string pattern = @"\p{IsArabic}"; 
    return Regex.IsMatch(
     content, 
     pattern, 
     RegexOptions.RightToLeft | RegexOptions.IgnoreCase | RegexOptions.Multiline); 
} 

public bool IsContentLatin1(string content) 
{ 
    string pattern = @"\p{IsBasicLatin}"; 
    return Regex.IsMatch(
     content, 
     pattern, 
     RegexOptions.IgnoreCase | RegexOptions.Multiline); 
} 

而波斯的数字转换成自己的“拉丁”等价物,我写了这个帮手:

public static class NumberHelper 
{ 
    private static readonly CultureInfo arabic = new CultureInfo("fa-IR"); 
    private static readonly CultureInfo latin = new CultureInfo("en-US"); 

    public static string ToArabic(string input) 
    { 
     var arabicDigits = arabic.NumberFormat.NativeDigits; 
     for (int i = 0; i < arabicDigits.Length; i++) 
     { 
      input = input.Replace(i.ToString(), arabicDigits[i]); 
     } 
     return input; 
    } 

    public static string ToLatin(string input) 
    { 
     var latinDigits = latin.NumberFormat.NativeDigits; 
     var arabicDigits = arabic.NumberFormat.NativeDigits; 
     for (int i = 0; i < latinDigits.Length; i++) 
     { 
      input = input.Replace(arabicDigits[i], latinDigits[i]); 
     } 
     return input; 
    } 
} 

我也在模型绑定发生之前就迷上了,并且在那里我将表单中只有数字的输入转换成拉丁数字(如果适用)。

Ako,为了什么方向,我们在我们的网页的html标签上使用'dir'属性(dir => direction)解决了很多问题。就像这样:

<html dir="rtl"> 

的“目录”属性或者取“RTL”(从右到左)或“升”(左到右)。

希望这可以帮助别人!

0

冷杉所有你应该使用字体支持波斯人编号。 我使用这种技术,我可以在我的网站上显示波斯语编号。 字体:BNazanin。

相关问题