Получить значение из файла ресурсов для конкретного языка без изменения языка сайта

У меня есть несколько файлов ресурсов, например

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;
    }
}
Другие вопросы по тегам