Как я могу получить строку ресурса без возврата к культуре по умолчанию
У меня есть следующие настройки в моем приложении:
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;
}
}
Он не учитывает сценарии, в которых может быть несколько уровней восстановления.