Получить значение из файла ресурсов для конкретного языка без изменения языка сайта
У меня есть несколько файлов ресурсов, например
default.aspx.resx, default.aspx.nl.resx, default.aspx.en.resx
Теперь, когда я нахожусь на голландском домене, загружается default.aspx.nl.resx. Но теперь я хочу получить доступ к значению из default.aspx.en.resx и получить английское значение, относящееся к имени "title".
Теперь я могу добиться этого, изменив текущую культуру на стороне сервера, получив доступ к значению, а затем вернув его обратно, например так:
Dim culture As CultureInfo = New CultureInfo("en")
Threading.Thread.CurrentThread.CurrentCulture = culture
Threading.Thread.CurrentThread.CurrentUICulture = culture
Dim title as String = GetLocalResourceObject("title")
culture = New CultureInfo("nl")
Threading.Thread.CurrentThread.CurrentCulture = culture
Threading.Thread.CurrentThread.CurrentUICulture = culture
Но есть ли лучший / более быстрый способ? Желательно без необходимости менять культуру для текущего потока, чтобы я мог просто определить, к какому файлу ресурса я хочу получить доступ и на каком языке?
3 ответа
Вы можете добавить в параметре целевую культуру
GetLocalResourceObject("title","YourCulture");
ссылка: http://msdn.microsoft.com/fr-fr/library/ms149953.aspx
Изменить: (Извините, я не знал, что вы хотели другой метод, отличный от этого, но это был единственный способ, который мне удалось сделать:)
Мне удалось сделать это, выполнив:
var userLanguage = "en-US";
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(userLanguage);
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(userLanguage);
HttpContext.GetGlobalResourceObject("MyAppResource", "KeyThatIWantToGet");
Где MyAppResource - как называется ваш файл.resx, а KeyThatIWantToGet объясняет это сам.
Когда не используется HttpContext (общие приложения.NET), я использую следующий помощник:
/// <summary>
/// Disposable class that lets us assume a specific culture while executing
/// a certain block of code. You'd typically use it like this:
///
/// using (new CultureContext("de"))
/// {
/// // Will return the German translation of "Please click here"
/// string text = SharedResource.Please_click_here;
/// }
/// </summary>
public class CultureContext : IDisposable
{
private readonly CultureInfo _previousCulture;
private readonly CultureInfo _previousUiCulture;
public CultureContext(CultureInfo culture)
{
// Save off the previous culture (we'll restore this on disposal)
_previousCulture = Thread.CurrentThread.CurrentCulture;
_previousUiCulture = Thread.CurrentThread.CurrentUICulture;
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
public CultureContext(string cultureCode)
: this(new CultureInfo(cultureCode))
{
}
/// <summary>
/// Syntactic sugar so that we can switch to a culture context as follows:
///
/// using (CultureContext.For("de"))
/// {
/// // Will return the German translation of "Please click here"
/// string text = SharedResource.Please_click_here;
/// }
/// </summary>
public static CultureContext For(string cultureCode)
{
return new CultureContext(cultureCode);
}
public void Dispose()
{
// Restore the culture settings that were in place before switching
// to this context
Thread.CurrentThread.CurrentCulture = _previousCulture;
Thread.CurrentThread.CurrentUICulture = _previousUiCulture;
}
}