🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
5 messages
5 total messages Started by Robert Sadza Fri, 22 Feb 2013 07:04
UICulture i GetLocalResourceObject
#22469
Author: Robert Sadza
Date: Fri, 22 Feb 2013 07:04
15 lines
1575 bytes
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
Re: UICulture i GetLocalResourceObject
#22470
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 22 Feb 2013 17:09
46 lines
2594 bytes
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/
Re: UICulture i GetLocalResourceObject
#22471
Author: Robert Sadza
Date: Tue, 26 Feb 2013 11:40
16 lines
1829 bytes
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.
Re: UICulture i GetLocalResourceObject
#22472
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 26 Feb 2013 12:43
36 lines
2319 bytes
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>

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.pl/
Re: UICulture i GetLocalResourceObject
#22473
Author: Robert Sadza
Date: Wed, 27 Feb 2013 07:34
31 lines
2260 bytes
> 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.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads