selectPreferredLanguage

Signature

def selectPreferredLanguage(first: Language, more: Language*): Directive1[Language]

Description

Inspects the request’s Accept-Language header and determines, which of a given set of language alternatives is preferred by the client according to content negotiation rules defined by RFC 7231 in section 5.3.5.

If there are several best language alternatives that the client has equal preference for (even if this preference is zero!) the order of the arguments is used as a tie breaker (first one wins).

Example

Scala
val request = Get() ~> `Accept-Language`(
  Language("en-US"),
  Language("en") withQValue 0.7f,
  LanguageRange.`*` withQValue 0.1f,
  Language("de") withQValue 0.5f)

request ~> {
  selectPreferredLanguage("en", "en-US") { lang =>
    complete(lang.toString)
  }
} ~> check { responseAs[String] shouldEqual "en-US" }

request ~> {
  selectPreferredLanguage("de-DE", "hu") { lang =>
    complete(lang.toString)
  }
} ~> check { responseAs[String] shouldEqual "de-DE" }
Java
import static akka.http.javadsl.server.Directives.complete;
import static akka.http.javadsl.server.Directives.selectPreferredLanguage;

final Route enRoute = selectPreferredLanguage(
  Arrays.asList(Language.create("en"), Language.create("en-US")), lang ->
    complete(lang.toString())
);
final Route deHuRoute = selectPreferredLanguage(
  Arrays.asList(Language.create("de-DE"), Language.create("hu")), lang ->
    complete(lang.toString())
);


// tests:
final HttpRequest request = HttpRequest.GET("/").addHeader(AcceptLanguage.create(
  Language.create("en-US").withQValue(1f),
  Language.create("en").withQValue(0.7f),
  LanguageRanges.ALL.withQValue(0.1f),
  Language.create("de-DE").withQValue(0.5f)
));

testRoute(enRoute).run(request).assertEntity("en-US");
testRoute(deHuRoute).run(request).assertEntity("de-DE");
Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.