2016-04-26 1 views
0

У меня есть следующие настройки в моем приложении:Как я могу получить строку ресурса без отката к культуре по умолчанию

MyResources.resx // english strings 
MyResources.zh-CN.resx // chinese strings 

Из-за запаздывания в процессе перевода, некоторые клавиши имеют английские значения, но ни один китаец значения. В других случаях весь файл resx zh-CN не существует. По умолчанию ResourceManager вернется к английскому значению, если китайская ценность не существует. Это приемлемо для моего использования в большинстве сценариев. Тем не менее, в настоящее время мне нужно получить строку китайского ресурса БЕЗ возврата на английский язык.

Мой вопрос: что такое правильный способ?

я сначала подумал, что это может быть сделано с помощью метода GetResourceSet:

var manager = MyResources.ResourceManager; 

var set = manager.GetResourceSet(CultureInfo.GetCultureInfo("zh-CN"), createIfNotExists: true, tryParents: false); 
if (set == null || set.GetString("key") == null) { /* not translated! */ } 

// however, this has issues because resource set lookup is cached: 

// this will force the association of the zh-CN culture with the 
// English resource set unde the hood 
manager.GetString("key", CultureInfo.GetCultureInfo("zh-CN")); 

// now this returns the English resource set, thus breaking my check 
var set2 = manager.GetResourceSet(CultureInfo.GetCultureInfo("zh-CN"), createIfNotExists: true, tryParents: false); 
if (set == null || set.GetString("key") == null) { /* checks whether key exists in english :-(*/ } 
+1

Добавить значения в файл ресурсов zh-CN – Fabio

+0

@Fabio предположительно вы предлагаете какие-то значения заглушки? Я не согласен, что это идеально; однако данный код является библиотекой, которая используется ~ 30 различными кодами, управляемыми разными разработчиками. Я хотел бы иметь решение, которое не полагается на них, мгновенно обновляя свои кодовые базы пустыми файлами resx всякий раз, когда мы начинаем переводить наши ресурсы на новый язык. – ChaseMedallion

+0

Как строки доступа доступны в коде? Сгенерированными классами (Visual Studio будет генерировать классы ресурсов) 'ResourceNamespace.MyResourcesFileName.KeyofString' или с помощью ResourceManager с жестко закодированным ключом:' ResourceManager.GetString («KeyofString») '? – Fabio

ответ

0

Это сценария одноразового, так как цель всегда, чтобы обеспечить запасной вариант. Но вы все равно можете обойти это, что-то вроде этого (слегка упрощенный пример). Это возвращает только то, что ResourceManager предоставляет для данной культуры, если оно отличается от значения по умолчанию.

Я просто положил некоторые вещи в конструктор из привычки/конвенции. Вы можете переместить ResourceManager, нужный CultureInfo или оба аргумента метода.

public class NonFallbackResourceManager 
{ 
    private readonly CultureInfo _desiredCulture; 
    private readonly ResourceManager _resourceManager; 

    public NonFallbackResourceManager(CultureInfo desiredCulture, ResourceManager resourceManager) 
    { 
     _desiredCulture = desiredCulture; 
     _resourceManager = resourceManager; 
    } 

    public string GetString(string key) 
    { 
     var desiredCultureString = _resourceManager.GetString(key, _desiredCulture); 
     var defaultCultureString = _resourceManager.GetString(key, CultureInfo.InvariantCulture); 
     return string.Equals(desiredCultureString, defaultCultureString) 
      ? String.Empty 
      : desiredCultureString; 
    } 
} 

В нем не учитываются сценарии, в которых может быть несколько уровней возврата.

Смежные вопросы