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

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

default.aspx.resx, default.aspx.nl.resx, default.aspx.en.resx

Теперь, когда я нахожусь в голландском домене, загружается default.aspx.nl.resx. Но теперь я хочу получить доступ к значению из default.aspx.en.resx и получить английское значение, принадлежащее имени «название».

Теперь я могу добиться этого, изменив текущую культуру на стороне сервера, получить доступ к значению, а затем изменить его обратно, например:

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

Но есть ли способ лучше/быстрее? Желательно без необходимости менять культуру для текущего потока, чтобы я мог просто определить, к какому файлу ресурсов я хочу получить доступ и на каком языке?


person Flo    schedule 26.03.2013    source источник


Ответы (3)


Вы можете добавить в параметр свою целевую культуру

GetLocalResourceObject("title","YourCulture");

ссылка: http://msdn.microsoft.com/fr-fr/library/ms149953.aspx

person Aghilas Yakoub    schedule 26.03.2013
comment
Спасибо... не могли бы вы предоставить образец того, как его использовать? Я не вижу примеров на странице, которую вы предоставили. Еще раз спасибо! - person Flo; 26.03.2013
comment
И я попробовал ваше предложение: GetLocalResourceObject(title, en), но это не работает. Я использую ASP.NET 4.5 кстати - person Flo; 26.03.2013
comment
попробуйте с GetLocalResourceObject(title, en-EN) - person Aghilas Yakoub; 27.03.2013
comment
Проблема заключается в том, что я передаю только 2 параметра... Я получаю сообщение об ошибке: Разрешение перегрузки не удалось, поскольку ни один доступный "GetLocalResourceObject" не принимает такое количество аргументов. Но я не знаю, как еще это вызвать, а затем получить доступ к возвращаемому значению. - person Flo; 27.03.2013
comment
А, видимо, не я. Теперь я изменил его на: lblStatus.Text = HttpContext.GetLocalResourceObject(~/freemediadetails.aspx.nl.resx, backtosearchresults).ToString Но затем я получаю эту ошибку: Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что файл freemediadetails.aspx.nl.resx.resources был правильно внедрен или связан со сборкой App_LocalResources.root._j2bta_i во время компиляции или что все необходимые вспомогательные сборки загружаемы и полностью подписаны. Но этого файла действительно не существует: freemediadetails.aspx.nl.resx.resources - person Flo; 27.03.2013
comment
А, это работает: HttpContext.GetLocalResourceObject(~/freemediadetails.aspx, backtosearchresults, New CultureInfo(nl)).ToString - person Flo; 27.03.2013

Редактировать: (Извините, я не знал, что вам нужен другой метод, отличный от этого, но это был единственный способ, которым мне удалось это сделать :)

Мне удалось сделать это, выполнив:

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 объясняет сам себя.

person Lucian Sturião    schedule 30.04.2014

Когда я не использую 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;
    }
}
person James Crosswell    schedule 08.05.2015