3

我正在建立一个需要同时支持英语和波斯语的网站。该站点使用 ASP.NET MVC 3 和 .NET 4 (C#) 构建。我所有的控制器都继承自 BaseController,它将文化设置为“fa-IR”(在测试期间):

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”作为第一语言。也没有帮助。

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

最好的问候,
埃里克

4

4 回答 4

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">

'dir' 属性采用“rtl”(从右到左)或“ltr”(从左到右)。

希望这对某人有帮助!

于 2011-02-25T09:33:45.390 回答
1

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

您可以为您的页面提供字体,但我认为这仅适用于现代浏览器并且在旧浏览器中失败。你可以检查一下。
希望有帮助。

于 2011-02-23T19:57:02.457 回答
0

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

此外,为了获得最大的可移植性,您可能应该使用 UTF8 作为编码。

于 2011-02-23T20:01:46.170 回答
0

首先,您应该使用支持波斯数字的字体。我使用这种技术,我可以在我的网站上显示波斯数字。字体如:BNazanin。

于 2016-12-27T06:30:14.397 回答