private static LoadLanguageResult LoadLanguageOrFallbackLanguage(
            LanguageResourceService <LanguageResourceDto> languageResourceService,
            string languageTwoLetterCode,
            string fallbackLanguageTwoLetterCode)
        {
            var desiredLanguageResourceDto = languageResourceService.Load(languageTwoLetterCode);

            if (desiredLanguageResourceDto != null)
            {
                return(new LoadLanguageResult(
                           languageTwoLetterCode,
                           desiredLanguageResourceDto.LocalizedItems
                           .ToDictionary(x => x.Key, x => x.Value)
                           ));
            }

            var fallbackLanguageResourceDto = languageResourceService.Load(fallbackLanguageTwoLetterCode);

            if (fallbackLanguageResourceDto != null)
            {
                return(new LoadLanguageResult(
                           fallbackLanguageTwoLetterCode,
                           fallbackLanguageResourceDto.LocalizedItems
                           .ToDictionary(x => x.Key, x => x.Value)
                           ));
            }

            throw new Exception($"Could not load the LanguageResourceDto for the {nameof(languageTwoLetterCode)} '{languageTwoLetterCode}', nor for the {nameof(fallbackLanguageTwoLetterCode)} '{fallbackLanguageTwoLetterCode}'.");
        }
 private LanguageResource(
     LanguageResourceService <LanguageResourceDto> languageResourceService,
     string currentLanguage,
     Dictionary <string, string> localizedStrings,
     string fallbackLanguageTwoLetterCode)
 {
     _currentLanguage               = currentLanguage ?? throw new ArgumentNullException(nameof(currentLanguage));
     _languageResourceService       = languageResourceService ?? throw new ArgumentNullException(nameof(languageResourceService));
     _localizedStrings              = localizedStrings ?? throw new ArgumentNullException(nameof(localizedStrings));
     _fallbackLanguageTwoLetterCode = fallbackLanguageTwoLetterCode ?? throw new ArgumentNullException(nameof(fallbackLanguageTwoLetterCode));
 }
        public static LanguageResource Create(
            LanguageResourceService <LanguageResourceDto> languageResourceService,
            string initialLanguageTwoLetterCode,
            string fallbackLanguageTwoLetterCode)
        {
            var result = LoadLanguageOrFallbackLanguage(
                languageResourceService,
                initialLanguageTwoLetterCode,
                fallbackLanguageTwoLetterCode
                );

            return(new LanguageResource(
                       languageResourceService,
                       result.Language,
                       result.LocalizedStrings,
                       fallbackLanguageTwoLetterCode
                       ));
        }