Как использовать ResourceManager в режиме «веб-сайт»? - PullRequest
4 голосов
/ 28 января 2010

Я пытаюсь выполнить ручной перевод для приложения, с которым работаю.(Уже существует рабочий LocalizationModule, но он работает хитроумно, поэтому я не могу использовать <asp:Localize /> теги.

Обычно с ResourceManager вы должны использовать его как Namespace.Folder.Resourcename (в приложении). В настоящее время.Я перевожу существующий asp.net «веб-сайт» (не веб-приложение, поэтому здесь нет пространства имен ....).

Ресурсы расположены в папке с именем «Locales / resources», которая содержит «fr-ca»..resx "и" en-us.resx ".

Итак, я использовал код с чем-то вроде этого:

public static string T(string search)
 {
  System.Resources.ResourceManager resMan = new System.Resources.ResourceManager( "Locales", System.Reflection.Assembly.GetExecutingAssembly(), null );

  var text = resMan.GetString(search, System.Threading.Thread.CurrentThread.CurrentCulture);

  if (text == null)
   return "null";
  else if (text == string.Empty)
   return "empty";
  else
   return text;
 }

и внутри страницы у меня есть что-то вроде <%= Locale.T("T_HOME") %>

Когда я обновляюсь, у меня есть следующее:

Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что «Locales.resources» был правильно встроен или связан с сборкой."App_Code.9yopn1f7" во время компиляции или что все требуемые спутниковые сборки загружаемы и полностью подписаны. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Аренда просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Resources.MissingManifestResourceException: Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры.Убедитесь, что «Locales.resources» был правильно встроен или связан со сборкой «App_Code.9yopn1f7» во время компиляции или что все требуемые спутниковые сборки загружаются и полностью подписаны.

Ошибка источника:

Строка 14:
System.Resources.ResourceManager resMan = new System.Resources.ResourceManager ("Locales", System.Reflection.Assembly.GetExecutingAssembly (), null);Строка 15: Строка 16: var text = resMan.GetString (search, System.Threading.Thread.CurrentThread.CurrentCulture);Строка 17: Строка 18: if (text == null)

Исходный файл: c: \ inetpub \ vhosts \ galerieocarre.com \ subdomains \ dev \ httpdocs \ App_Code \ Locale.cs Строка: 16

Я даже пытался загрузить ресурс с помощью Locales.fr-ca или только fr-ca, здесь ничего не получалось.

Ответы [ 5 ]

2 голосов
/ 18 августа 2011

Решение Марвина Смита прекрасно, если у вас нет доступа к HTTPContext

const string ASSEMBLY_NAME = "App_GlobalResources";
const string RESOURCE_NAME = "Resources.MetaTagResource";
const string RESOURCE_MANAGER = "ResourceManager";

Assembly assembly = Assembly.Load(ASSEMBLY_NAME);
Type type = assembly.GetType(RESOURCE_NAME);
PropertyInfo propertyInfo = type.GetProperty(RESOURCE_MANAGER);
ResourceManager resourceManager = propertyInfo.GetValue(null, new object[] { }) as ResourceManager;
resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true);

Но если у вас есть доступ к HTTPContext, просто используйте HttpContext.GetGlobalResourceObject

string title = HttpContext.GetGlobalResourceObject("MetaTagResource", "Title").ToString();
string keywords = HttpContext.GetGlobalResourceObject("MetaTagResource", "keywords").ToString();
string description = HttpContext.GetGlobalResourceObject("MetaTagResource", "Description").ToString();
1 голос
/ 20 мая 2010

Может быть, вы просто ищете базу System.Web.Page GetLocalResourceObject (), ?

см. http://msdn.microsoft.com/en-us/library/ms153597.aspx

0 голосов
/ 04 февраля 2010

Редактировать

В случае проекта веб-сайта прочитайте это руководство Microsoft .

Боюсь, вы не можете использовать ResourceMagager в проекте веб-сайта, поскольку для него требуется пространство имен / сборка, в которой расположены ресурсы.

0 голосов
/ 08 февраля 2010

это не c #, но вы можете легко преобразовать его в него

У меня в каталоге app_localResources с 2 файлами

myPage.aspx.resx
myPage.aspx.fr-ca.resx

и я использую это так на моей странице .aspx

<asp:Label ID="lAddress1" runat="server" Text="<%$ Resources: lAddress1 %>"></asp:Label>

Вот так я управляю на моем

'using LCID from 
Public Enum elang
    En = &H1009  'en-CA http://www.microsoft.com/resources/msdn/goglobal/default.mspx?submitted=1009&OS=Windows%202003%20%20Service%20Pack%201
    Fr = &HC0C   'fr-CA http://www.microsoft.com/resources/msdn/goglobal/default.mspx?submitted=0C0C&OS=Windows%202003%20%20Service%20Pack%201
End Enum

'strongly typed value in session
Private _lang As elang = elang.En
Public Property lang() As elang
    Get
        Return _lang
    End Get
    Set(ByVal value As elang)
        _lang = value
    End Set
End Property

и на каждой странице я получил

Protected Overrides Sub InitializeCulture()
    If Not Me.IsPostBack Then
        Threading.Thread.CurrentThread.CurrentUICulture = New Globalization.CultureInfo(Sess.lang)
        Threading.Thread.CurrentThread.CurrentCulture = Globalization.CultureInfo.CreateSpecificCulture(Threading.Thread.CurrentThread.CurrentUICulture.Name)
    End If
    MyBase.InitializeCulture()
End Sub

когда я хочу использовать менеджер ресурсов, я создаю файл глобальных ресурсов на корневом уровне, и я использую его следующим образом

Dim rm = New System.Resources.ResourceManager("Resources.MyPage", Reflection.Assembly.Load("App_GlobalResources"))
0 голосов
/ 03 февраля 2010

При использовании ресурсов в ASP.Net вы увидите, что в файлах .resx (ResXCodeGen) используется специализированный компилятор (пользовательское свойство Tool)

Суть в том, что ваши ресурсы скомпилированы в класс. Имя этого класса - это имя, которое вы должны использовать, когда хотите обратиться к ресурсам там.

Имя класса генерируется следующим образом:

{пространство имен проекта} {структура папок} {имя файла} .resx (.resx НЕ является частью сгенерированного имени)

Поскольку вы упомянули, что ваш файл resx находится в каталоге с именем "Locales / resources", вам нужно использовать имя (при условии, что файл resx называется 'locales.resx')

"locales.resources.locales"

Добавление языка и локали, таких как "uk-en", добавляется менеджером ресурсов, загружая соответствующую сборку на основе культуры, указанной при создании экземпляра ResourceManager. Если ничего не указано, используется Thread.CurrentCulture. Вы не должны использовать расширения языка / локали самостоятельно, предоставьте это менеджеру ресурсов.

Если вы не уверены, как закончится класс ресурсов, вы всегда можете посмотреть на MSIL или использовать отражатель, чтобы определить имя класса ресурсов в фактической развернутой сборке.

; - Добавлено после комментариев, где размещены -------

Я также посмотрел на какой-то другой код, который у меня был;

Вы пробовали подход Reflection on App_GlobalResources?

1: Вы загружаете библиотеку «App_GlobalResources», находясь в контексте веб-сайта (в HttpHandler, Aspx, Ascx и т. Д.). => Assembly.Load ( "App_GlobalResources");

2: Просмотрите доступные типы и получите свойство ResourceManager для каждого типа. =>

PropertyInfo pi = type.GetProperty ("ResourceManager");

resManager = pi.GetValue (null, новый объект [] {}) как ResourceManager;

3: если он был, получите требуемый ResourceSet => resManager.GetResourceSet (englishCulture, true, true);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...