/// <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)); }
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(); }
public void acceptlanguage___equals_overload_null_sccess() { AcceptLanguageHeader header1 = "en-us;"; AcceptLanguageHeader header2 = null; var equals = header1.Equals(header2); equals.Should().BeFalse(); }
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(); }
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); }
public void acceptlanguage___gethashcode_success() { AcceptLanguageHeader header = "en-us;"; header.Should().NotBeNull(); var hashCode = header.GetHashCode(); hashCode.Should().NotBe(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); }
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); }
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); }
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); }
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); }
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); }
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); }