Как я могу получить строку ресурса без возврата к культуре по умолчанию

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

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 ответ

Это одноразовый сценарий, поскольку цель всегда состоит в том, чтобы обеспечить запасной вариант. Но вы все равно можете обойти это, что-то вроде этого (слегка упрощенный пример). Это только возвращает то, что 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;
    }
}

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

Другие вопросы по тегам