/// <summary>
        /// Translations based on key and locale
        /// Depending of configuration can fallback and try with less restrictive locales e.g zh-hk-hans to zh-hk to zh
        /// Depending of configuration can fallback specified DefaultLocale
        /// </summary>
        /// <param name="key">The translation key.</param>
        /// <param name="header">The Accept-Language header that will be used to get the translation.</param>
        /// <returns>The resulting translation for this <paramref name="header"/>. If no translation is not found for this <paramref name="header"/> the result will be "missing-key-'{<paramref name="key"/>}'".</returns>
        public async Task <SafeGet <TranslationModel> > GetAsync(string key, AcceptLanguageHeader header)
        {
            if (string.IsNullOrEmpty(key) == true)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (header is null)
            {
                throw new ArgumentNullException(nameof(header));
            }

            foreach (var locale in header.Locales)
            {
                var translationModel = await GetAsync(key, locale).ConfigureAwait(false);

                if (translationModel.Found)
                {
                    return(translationModel);
                }
            }

            if (ShouldFallbackToDefaultLocale(header))
            {
                return(await GetAsync(key, options.DefaultLocale).ConfigureAwait(false));
            }

            return(SafeGet <TranslationModel> .NotFound);
        }
            public void Must_parse_correctly(string headerValue)
            {
                AcceptLanguageHeader[] headers = AcceptLanguageHeader.ParseMany(headerValue).ToArray();

                Assert.That(headers, Has.Length.EqualTo(4));

                Assert.That(headers[0].Language, Is.EqualTo("de"));
                Assert.That(headers[0].LanguagePrefix, Is.Null);
                Assert.That(headers[0].LanguageRange, Is.EqualTo("de"));
                Assert.That(headers[0].Qvalue, Is.EqualTo(1m));
                Assert.That(headers[0].EffectiveQvalue, Is.EqualTo(1m));

                Assert.That(headers[1].Language, Is.EqualTo("en"));
                Assert.That(headers[1].LanguagePrefix, Is.Null);
                Assert.That(headers[1].LanguageRange, Is.EqualTo("en"));
                Assert.That(headers[1].Qvalue, Is.EqualTo(0.567m));
                Assert.That(headers[1].EffectiveQvalue, Is.EqualTo(0.567m));

                Assert.That(headers[2].Language, Is.EqualTo("gb"));
                Assert.That(headers[2].LanguagePrefix, Is.EqualTo("en"));
                Assert.That(headers[2].LanguageRange, Is.EqualTo("en-gb"));
                Assert.That(headers[2].Qvalue, Is.Null);
                Assert.That(headers[2].EffectiveQvalue, Is.EqualTo(1m));

                Assert.That(headers[3].Language, Is.EqualTo("fr"));
                Assert.That(headers[3].LanguagePrefix, Is.Null);
                Assert.That(headers[3].LanguageRange, Is.EqualTo("fr"));
                Assert.That(headers[3].Qvalue, Is.EqualTo(0m));
                Assert.That(headers[3].EffectiveQvalue, Is.EqualTo(0m));
            }
Пример #3
0
        public void acceptlanguage___equals_overload_not_string_or_equivelent_sccess()
        {
            AcceptLanguageHeader header1 = "en-us;";
            var other = 2;

            var equals = header1.Equals(other);

            equals.Should().BeFalse();
        }
Пример #4
0
        public void acceptlanguage___equals_overload_null_sccess()
        {
            AcceptLanguageHeader header1 = "en-us;";
            AcceptLanguageHeader header2 = null;

            var equals = header1.Equals(header2);

            equals.Should().BeFalse();
        }
Пример #5
0
        public void acceptlanguage___ctor_returns_default_for_null_or_whitespace(string value)
        {
            var header = new AcceptLanguageHeader(value);

            header.Should().NotBeNull();
            header.Value.Should().Be(value);
            header.Values.Should().NotBeNull();
            header.Values.Should().BeEmpty();
        }
Пример #6
0
        public void acceptlanguage___ctor_basic_returns_type(string value, int expectedCount)
        {
            var header = new AcceptLanguageHeader($"{value}");

            header.Should().NotBeNull();
            header.Value.Should().Be(value);
            header.Values.Should().NotBeNull();
            header.Values.Should().HaveCount(expectedCount);
        }
Пример #7
0
        public void acceptlanguage___gethashcode_success()
        {
            AcceptLanguageHeader header = "en-us;";

            header.Should().NotBeNull();

            var hashCode = header.GetHashCode();

            hashCode.Should().NotBe(0);
        }
Пример #8
0
        public void acceptlanguage___equals_operator_header_success(string encoding)
        {
            var value = "en-US;q=0.1, es-ES; q=1, de; q=0.7, *; q=0.5";

            var header1 = new AcceptLanguageHeader(encoding);
            var header2 = new AcceptLanguageHeader(value);

            var equals = header1 == header2;

            equals.Should().Be(true);
        }
Пример #9
0
        public void acceptlanguage___notequals_operator_header_success(string encoding)
        {
            var value = "en-US;q=0.1, es-ES; q=1, de; q=0.7, *; q=0.5, xi";

            var contentType1 = new AcceptLanguageHeader(encoding);
            var contentType2 = new AcceptLanguageHeader(value);

            var equals = contentType1 != contentType2;

            equals.Should().Be(true);
        }
Пример #10
0
        public void acceptlanguage___notequals_operator_string_success(string encoding)
        {
            var value = "en-US;q=0.1, es-ES; q=1, de; q=0.7, *; q=0.5, xi";

            var header = new AcceptLanguageHeader(encoding);

            var equals = header != value;

            equals.Should().Be(true);

            equals = value != header;
            equals.Should().Be(true);
        }
Пример #11
0
        public void acceptlanguage___equals_override_success(string encoding)
        {
            var value = "en-US;q=0.1, es-ES; q=1, de; q=0.7, *; q=0.5";

            var header = new AcceptLanguageHeader(encoding);

            var equals = header.Equals(value);

            equals.Should().Be(true);

            equals = header.Equals(new AcceptLanguageHeader(value));
            equals.Should().Be(true);
        }
Пример #12
0
        public void acceptlanguage___ctor_qualities_modified_when_outofrange()
        {
            var value  = "en-US;q=-1, es-ES; q=1.1, de; q=0.7, *; q=0.5";
            var header = new AcceptLanguageHeader(value);

            header.Should().NotBeNull();
            header.Value.Should().Be(value);
            header.Values.Should().NotBeNull();
            header.Values.Should().HaveCount(4);

            header.Values[0].Code.Should().Be("es-ES");
            header.Values[0].Quality.Should().Be(1f);

            header.Values[1].Code.Should().Be("de");
            header.Values[1].Quality.Should().Be(0.7f);

            header.Values[2].Code.Should().Be("*");
            header.Values[2].Quality.Should().Be(0.5f);

            header.Values[3].Code.Should().Be("en-US");
            header.Values[3].Quality.Should().Be(0f);
        }
Пример #13
0
        public void acceptlanguage___assignment_standard_orders_byquality()
        {
            var value = "en-US;q=0.1, es-ES; q=1, de; q=0.7, *; q=0.5";
            AcceptLanguageHeader header = value;

            header.Should().NotBeNull();
            header.Value.Should().Be(value);
            header.Values.Should().NotBeNull();
            header.Values.Should().HaveCount(4);

            header.Values[0].Code.Should().Be("es-ES");
            header.Values[0].Quality.Should().Be(1f);

            header.Values[1].Code.Should().Be("de");
            header.Values[1].Quality.Should().Be(0.7f);

            header.Values[2].Code.Should().Be("*");
            header.Values[2].Quality.Should().Be(0.5f);

            header.Values[3].Code.Should().Be("en-US");
            header.Values[3].Quality.Should().Be(0.1f);
        }
Пример #14
0
        public void acceptlanguage___assignment_charsets_quality_set_to_0_when_quality_invalid()
        {
            var value = "en-US;q=0.1, es-ES; q=ABC, de; q=0.7, *; q=0.5";
            AcceptLanguageHeader header = value;

            header.Should().NotBeNull();
            header.Value.Should().Be(value);
            header.Values.Should().NotBeNull();
            header.Values.Should().HaveCount(4);

            header.Values[0].Code.Should().Be("de");
            header.Values[0].Quality.Should().Be(0.7f);

            header.Values[1].Code.Should().Be("*");
            header.Values[1].Quality.Should().Be(0.5f);

            header.Values[2].Code.Should().Be("en-US");
            header.Values[2].Quality.Should().Be(0.1f);

            header.Values[3].Code.Should().Be("es-ES");
            header.Values[3].Quality.Should().Be(0f);
        }
        /// <summary>
        /// Translations based on locale
        /// Depending of configuration can fallback and try with less restrictive locales e.g zh-hk-hans to zh-hk to zh
        /// Depending of configuration can fallback specified DefaultLocale
        /// </summary>
        /// <param name="header">>The Accept-Language header that will be used to get the translation.</param>
        /// <returns>The resulting translations for this <paramref name="header"/>. If no translations are not found for this <paramref name="header"/> the collection will be empty.</returns>
        public async Task <List <SafeGet <TranslationModel> > > GetAllAsync(AcceptLanguageHeader header)
        {
            if (header is null)
            {
                throw new ArgumentNullException(nameof(header));
            }

            foreach (var locale in header.Locales)
            {
                var translations = await GetAllAsync(locale).ConfigureAwait(false);

                if (translations.Count > 0)
                {
                    return(translations);
                }
            }

            if (ShouldFallbackToDefaultLocale(header))
            {
                return(await GetAllAsync(options.DefaultLocale).ConfigureAwait(false));
            }

            return(new List <SafeGet <TranslationModel> >());
        }
 public void Must_not_result_in_header(string headerValue)
 {
     Assert.That(AcceptLanguageHeader.ParseMany(headerValue), Is.Empty);
 }
            public void Must_not_match(string headerValue, string languageRange)
            {
                AcceptLanguageHeader header = AcceptLanguageHeader.ParseMany(headerValue).Single();

                Assert.That(header.LanguageRangeMatches(languageRange), Is.False);
            }
 /// <summary>
 /// Attempts to use fall-back strategy by using DefaultLocale
 /// Checks if default locale is defined.
 /// Also checks if it is different than the locales we have already tried
 /// </summary>
 /// <param name="header"></param>
 /// <returns></returns>
 bool ShouldFallbackToDefaultLocale(AcceptLanguageHeader header)
 {
     return(string.IsNullOrEmpty(options.DefaultLocale) == false && header.Locales.Any(x => x.Equals(options.DefaultLocale, StringComparison.OrdinalIgnoreCase)) == false);
 }