CurrentThread.CurrentUICulture установлен правильно, но, похоже, игнорируется asp.net - PullRequest
0 голосов
/ 28 апреля 2011

Я борюсь с получением значений из правильного strings.txt в моих файлах ресурсов в моей папке \ bin при переключении языков.

У меня есть domain.com (для английского) и domain.nl (для голландского). Однако, кажется, не имеет значения, какой домен я использую и как я устанавливаю currentUICulture, язык, показанный пользователю, всегда один и тот же!

[default.aspx.vb]

Partial Class _Default
    Inherits System.Web.UI.Page

    Shared rm As ResourceManager = HttpContext.Current.Application("RM")

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Label.Text = rm.GetString("homewelcome")
    End Sub

    Protected Overrides Sub InitializeCulture()
        SetLanguage(Request.Url.ToString)
    End Sub

    Public Shared Sub SetLanguage(ByVal URL As String)
        Dim lang As String = ""
        If URL.Contains("www.domain.nl") Then
            lang = "nl"
        ElseIf URL.Contains("www.domain.com") Then
            lang = "en"
        End If
        System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(lang)
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang)
    End Sub
End Class

[global.asax]

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    Application("RM") = New ResourceManager("strings", Assembly.Load("strings"))
End Sub

В моей папке bin есть:

бен \ Strings.txt бен \ п \ strings.nl.txt бен \ ан \ strings.en.txt

Я генерирую dll примерно так:

resgen strings.txt strings.resources
al /embed:strings.resources,strings.resources /out:strings.dll
resgen nl\strings.nl.resources
al /embed:nl\strings.nl.resources,strings.nl.resources /out:nl\strings.resources.dll /c:nl
resgen en\strings.en.resources
al /embed:en\strings.en.resources,strings.en.resources /out:en\strings.resources.dll /c:en

Теперь все файлы, похоже, созданы правильно.

Однако, когда я захожу на www.domain.com, используются значения из bin \ strings.txt, а НЕ (как я и ожидал) значения из bin \ en \ strings.en.txt

Я работаю в Windows 7 с IIS7.5 Когда я отладил, я обнаружил, что в моем методе InitializeCulture:

Protected Overrides Sub InitializeCulture()
    SetLanguage(Request.Url.ToString)
End Sub

когда я проверяю текущее значение System.Threading.Thread.CurrentThread.CurrentUICulture.ToString, равное «en», поэтому кажется, что культура настроена правильно, единственное, что используется неправильный strings.dll.

Но происходят более странные вещи: у меня это есть в default.aspx <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:lookingfor%>" />

  1. Когда я подхожу к www.domain.nl (голландский домен!), Элементы управления Literal1 отображают значение из «App_LocalResources \ default.aspx.en.resx», а rm.getstring показывает мне значение из bin \ Strings.txt И когда я проверяю текущий System.Threading.Thread.CurrentThread.CurrentUICulture.ToString, он равен "nl"

  2. Когда я подхожу к www.domain.com (английский домен!), Элементы управления Literal1 отображают значение из «App_LocalResources \ default.aspx.en.resx», а rm.getstring показывает мне значение из bin \ Strings.txt И когда я проверяю ток System.Threading.Thread.CurrentThread.CurrentUICulture.ToString, он равен "en"

Что здесь происходит?

Таким образом, при использовании www.domain.nl используется неверный файл strings.dll, но ПРАВИЛЬНО .resx

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Вы можете использовать перегрузку ResourceManager GetString(string, CultureInfo) для получения строк на правильном языке.

Кстати.global.asax, вероятно, является лучшим местом для установки CurrentCulture и CurrentUICulture.

EDIT Предоставление образца кода для запроса Питера

Globabal.asax

Для начала, Я бы обнаружил и сохранил культуру:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    ' Fires at the beginning of each request '
    Dim culture As CultureInfo
    Dim uri As Uri = Request.Url
    If uri.ToString().Contains("nederlands") Then
        culture = New CultureInfo("nl-NL")
    ElseIf uri.ToString().Contains("polski") Then
        culture = New CultureInfo("pl-PL")
    Else
        culture = New CultureInfo("en-US")
    End If

    Thread.CurrentThread.CurrentCulture = culture
    Thread.CurrentThread.CurrentUICulture = culture
End Sub

В зависимости от того, что вы хотите сделать, функция перегрузки может оказаться не самой лучшей, в вашем случае я считаю, что Session_Start лучше (то есть, если выхочу предоставить пользователям возможность переключать язык).
Другое дело, я не проверял это с доменными именами, я использовал параметры запроса и не проверял их должным образом, но это было только для примера.

Создать App_LocalResources

Вместо того, чтобы создавать экземпляр ResourceManager и компилировать ваши ресурсы вручную, я могу только предложить вам использовать App_LocalResources.Вам просто нужно щелкнуть правой кнопкой мыши свой проект в обозревателе решений, выбрать «Добавить» -> «Добавить папку Asp.Net» -> App_LocalResources.

Создать файлы ресурсов

Создать файлы ресурсов с соответствующими именами: по умолчанию.aspx.resx, Default.aspx.nl.resx и добавьте к ним содержимое, которое вы хотите локализовать.В моем случае это было:

Default.aspx.resx (нейтральный файл ресурсов резервной культуры)
label1  Some label
label2  Some other label
Default.aspx.nl.resx (извините за мой бедный голландский)
label1  Dit is een etiket
label2  Dit is ander etiket
Default.aspx.pl.resx
label1  Jakaś tam labelka
label2  Jakaś inna labelka

Default.aspx.vb (код позади)

В коде позади вы можете программно изменять содержимое вашей веб-страницы следующим образом:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Label2.Text = Me.GetLocalResourceObject("label2")
End Sub 

По многим причинам яне рекомендовал бы этот метод (особенно его не следует использовать в обработчике загрузки страницы), однако иногда он необходим.

Default.aspx

Наконец-то мы на высоте (и очень полезны)веб-страница:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>

    <form id="form1" runat="server">
    <div>
      <asp:Label ID="Label1" runat="server" Text="<%$ Resources:label1 %>"></asp:Label>
      <br />
      <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>    
    </div>
    </form>
</body>
</html>

Как видите, вы можете получить доступ к ресурсам с помощью следующего выражения: <%$ Resources:label1 %>.Это даст вам строку, связанную с ключом ресурса label1.Важно отметить: runat = "server" не является обязательным.

HTH.Возможно, вы захотите прочитать руководство по локализации Asp.Net .

0 голосов
/ 28 апреля 2011

Использовать свойства страницы «Культура и культура»:

VB:

    UICulture = "en-US"
    Culture = "en-US"

    Dim cultureInfo As Globalization.CultureInfo = Globalization.CultureInfo.CreateSpecificCulture("en-US")

    Threading.Thread.CurrentThread.CurrentCulture = cultureInfo
    Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo

C #:

        UICulture = "en-US";
        Culture = "en-US";    
        Globalization.CultureInfo  cultureInfo =  Globalization.CultureInfo.CreateSpecificCulture("en-US");

        Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
        Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;


Protected Overrides Sub InitializeCulture()
Dim ui As String = String.Empty

If String.IsNullOrWhiteSpace(Request.QueryString("UI")) Then
    'ui = "en-US"
    If Not Session("UI") Is Nothing Then
        ui = Session("UI")
    Else
        ui = "en-US"
    End If
Else
    ui = Request.QueryString("UI")
End If

UICulture = ui
Culture = ui

Dim cultureInfo As Globalization.CultureInfo = Globalization.CultureInfo.CreateSpecificCulture(ui)

Threading.Thread.CurrentThread.CurrentCulture = cultureInfo
Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo

MyBase.InitializeCulture()
End Sub

Я передаю значение пользовательского интерфейса через Session и QueryString, если пользовательский интерфейс не имеет значения, я устанавливаю его в «en-US»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...