Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

UICulture i GetLocalResourceObject

7 views
Skip to first unread message

Robert Sadza

unread,
Feb 22, 2013, 2:04:07 AM2/22/13
to
Witam,
mam aplikacje ASP.net 4.0 aplikacja ma działać dla języka polskiego i
angielskiego, przykładowo mam default.aspx i dla tego pliku wygenerowane
pliki lokalnych zasobów default.aspx.resx i default.aspx.en.resx przy
zmianie UICulture z polskiego na angielski wartości z plików zasobów są
prawidłowo pobierane, ale gdy chem pobrać wartość z pliku zasobu za
pomocą GetLocalResourceObject zawsze jest pobierana wartość z pliku
default.aspx.resx niezależnie jak jest w danym momencie ustawione
UICulture. Jak zmusić aplikacje aby w zależności od ustawionego języka
pobierała wartości za pomocą GetLocalResourceObject z pliku zasobu dla
określonego języka?

Z góry dziękuje za pomoc.
Pozdrawiam
RS

Łukasz 'Maly' Ostrowski

unread,
Feb 22, 2013, 12:09:33 PM2/22/13
to
On Fri, 22 Feb 2013 08:04:07 +0100, Robert Sadza wrote:
> Jak zmusić aplikacje aby w zależności od ustawionego języka
> pobierała wartości za pomocą GetLocalResourceObject z pliku zasobu dla
> określonego języka?

Machnąłem szybki proof-of-concept:
1. Minimalny projekt ASP.NET 4
2. Dodałem App_LocalResources
2.1. Dodałem tam Default.aspx.resx i Default.aspx.en.resx
2.2. W obu resx'ach wstawiłem klucz Foo z wartościami
- Bar Default (w culture neutral)
- Bar English (w en)
3. Utworzyłem Default.aspx z zawartością:

<%
Thread.CurrentThread.CurrentUICulture=CultureInfo.GetCultureInfo("pl-PL");
Response.Write(GetLocalResourceObject("Foo"));
Response.Write(" /// ");
Thread.CurrentThread.CurrentUICulture=CultureInfo.GetCultureInfo("en-US");
Response.Write(GetLocalResourceObject("Foo"));
%>

4. Odpaliłem i otrzymałem:
Bar Default /// Bar English

5. Na pierwszy rzut oka working as intended.

Także, za mało informacji ;-). Proponuję zaznaczyć debugowanie kodu
.NET Framework w Debugging Options i sobie "wejść" w framework. Upewnić
się że nie ma literówek i upewnić się że wartość
CurrentThread.CurrentUICulture jest poprawna. W ostateczności sprawdzić
czy poprawnie działa overload z dodatkowym argumentem:
(W Reflectorze widzę żę bezargumentowy GetLocal...
pobiera locale z CultureInfo.CurrentUICulture)

p.s. O który właściwie GetLocalResourceObject chodzi:
- HttpContextBase
- HttpContextWrapper
- HttpContext
- TemplateControl? (Niewielkie znaczenie, wszystkie i tak
są właściwie proxy do tego samej implementacji, przynajmniej tak
podpowiada Reflector - System.Web.Compilation.LocalResXResourceProvider)

--
Pozdrawiam,
Łukasz 'Maly' Ostrowski. http://l3v.pl/

Robert Sadza

unread,
Feb 26, 2013, 6:40:54 AM2/26/13
to
Dziękuje za odpowiedz.

> Także, za mało informacji ;-). Proponuję zaznaczyć debugowanie kodu
> .NET Framework w Debugging Options i sobie "wejść" w framework. Upewnić
> się że nie ma literówek i upewnić się że wartość
> CurrentThread.CurrentUICulture jest poprawna. W ostateczności sprawdzić
> czy poprawnie działa overload z dodatkowym argumentem:
> (W Reflectorze widzę żę bezargumentowy GetLocal...
> pobiera locale z CultureInfo.CurrentUICulture)
>
Sprawdziłem CurrentThread.CurrentUICulture jest ustawione prawidłowo.

Ogólnie to źle opisałem problem bo w moim projekcie dla stron aspx
również prawidłowo pobiera dane z plików zasobów, problem występuje gdy
używam GetLocalResourceObjest w User Control czyli wgląda jak by nie
było zmienione UICulture dla user control a jest ustawione na en-US.


Łukasz 'Maly' Ostrowski

unread,
Feb 26, 2013, 7:43:10 AM2/26/13
to
On Tue, 26 Feb 2013 12:40:54 +0100, Robert Sadza wrote:
> Sprawdziłem CurrentThread.CurrentUICulture jest ustawione prawidłowo.
>
> Ogólnie to źle opisałem problem bo w moim projekcie dla stron aspx
> również prawidłowo pobiera dane z plików zasobów, problem występuje gdy
> używam GetLocalResourceObjest w User Control czyli wgląda jak by nie
> było zmienione UICulture dla user control a jest ustawione na en-US.

UICulture jest ustawione per-thread, więc technicznie rzecz ujmując
nie może być źle ustawione dla User Control. Strzelałbym, że
problem jest tej natury:

http://stackoverflow.com/questions/2029315/resource-file-for-a-custom-asp-net-control-ascx-invalidoperationexception

<quote>
When you call GetLocalResourceObject from within a user control, you are
actually calling TemplateControl.GetLocalResourceObject, which will look in
the wrong place for the resource file.
<quote>

Tzn. zamiast wołać lokalny GLRO(czyli, implicit GLRO z TemplateControl),
zawołać:

<quote>
protected string HttpContextGetLocalResourceObjectAsString(string message)
{
string path = HttpContext.Current.Request.Path;
return (HttpContext.GetLocalResourceObject(path, message) as string);
}

label1.InnerText = HttpContextGetLocalResourceObjectAsString("default");
</quote>

Robert Sadza

unread,
Feb 27, 2013, 2:34:17 AM2/27/13
to

> UICulture jest ustawione per-thread, więc technicznie rzecz ujmując
> nie może być źle ustawione dla User Control. Strzelałbym, że
> problem jest tej natury:
>
> http://stackoverflow.com/questions/2029315/resource-file-for-a-custom-asp-net-control-ascx-invalidoperationexception
>
> <quote>
> When you call GetLocalResourceObject from within a user control, you are
> actually calling TemplateControl.GetLocalResourceObject, which will look in
> the wrong place for the resource file.
> <quote>
>
> Tzn. zamiast wołać lokalny GLRO(czyli, implicit GLRO z TemplateControl),
> zawołać:
>
> <quote>
> protected string HttpContextGetLocalResourceObjectAsString(string message)
> {
> string path = HttpContext.Current.Request.Path;
> return (HttpContext.GetLocalResourceObject(path, message) as string);
> }
>
> label1.InnerText = HttpContextGetLocalResourceObjectAsString("default");
> </quote>
>

to rozwiązanie również nie zadziałało. Na obecną chwile utworzyłem plik
globalnych zasobów dla języka polskiego i angielskiego i za pomocą
HttpContext.GetGlobalResourceObject pobiera prawidłowe wartości w
zależności od ustawionego języka.

0 new messages