Локализация с использованием нескольких файлов Resx - PullRequest
3 голосов
/ 19 августа 2010

Мое веб-приложение обрабатывает локализацию с помощью файла ресурсов, размещенного в спутниковой сборке с использованием ResourceManager. Поскольку приложение растет, я хотел бы разделить файл resx на несколько файлов (для каждого языка), но на стороне клиента, похоже, мне нужно создать экземпляр ResourceManager для каждого файла, из которого я хочу прочитать. Есть ли способ обернуть несколько файлов resx в один?

Спасибо

1 Ответ

0 голосов
/ 20 мая 2015

Если вы используете веб-сайты (шаблон проекта веб-сайтов ASP.NET), вы можете сделать это: HttpContext.GetGlobalResourceObject(classKey, resourceKey), где classKey - это имя вашего файла .resx, а resourceKey - локализованная строка в вашем ресурсе.

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

public class SatelliteResourceManager
    {
        private const string Resources = "Resources";
        private readonly string _assemblyName;

        public SatelliteResourceManager(string assemblyName)
        {
            _assemblyName = assemblyName;
        }

        public Assembly Assembly { get { return Assembly.Load(_assemblyName); } }

        protected IEnumerable<Type> ResourceTypes
        {
            get
            { 
                return Assembly.GetTypes().Where(a => a.IsClass && a.Namespace == Resources);
            }
        }

        public IEnumerable<ResourceManager> GetAllManagers()
        {
            foreach (var manager in ResourceTypes)
            {
                yield return (ResourceManager) manager.GetProperty("ResourceManager").GetValue(this, null);
            }
        }

        public string GetGlobalResource(string classKey, string resourceKey, string fallback)
        {
            var manager = GetAllManagers().FirstOrDefault(m => m.BaseName.EndsWith(classKey, StringComparison.InvariantCultureIgnoreCase));
            if (manager != null) return manager.GetString(resourceKey);
            return fallback;
        }
    }

Вам нужно создать экземпляр класса попередавая параметр с именем сборки проекта вашего ресурса, вы можете получить эту информацию из свойств проекта.Я также добавил поле «Ресурсы», это может быть полезно, если вы решили переопределить пространство имен по умолчанию для каждого файла .resx, учтите, что вы можете расширить этот класс, чтобы разрешить несколько «пространств имен» для файлов .resx (скриншот прилагается))

Using Custom Namespaces

...