_search-language

_search-language is experimental, generated SQL and semantic may change in future!

Search parameter _search-language can be used to search specifying language.

GET [/fhir]/<resource>?_search-language=<locale>&<string-param>=<value>

Any string search parameters (e.g. name) will search in desired language if there is _search-language in query. Specifying only _search-language without any other string search parameters won't affect anything (except _sort).

List of supported locales required by FHIR.

Turn on _search-language

By default _search-language is skipped. It can be turned on by

features 
{...
 :multilingual
 {:enable-search-language true}}

Resources with Translation Extension

Aidbox searches for Translation Extension and if the resource contains it and the language is correct, then searches by the content of this translation.

Structure of a resource containing translation extension:

resourceType: <resourceType>
id: <id>
name: <name>
_name:
  extension:
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: <locale1>
        - url: content
          valueString: <translation in locale1> 
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: <locale2>
        - url: content
          valueString: <translation in locale2>

Fallback

If desired language is not present in Translation Extension, it will search by search-parameter like without _search-language. This fallback can be turned off by

box_features_multilingual_fallback=false

environment variable (true by default).

Note on field overwriting: Aidbox returns resource in FHIR format without any replacements.

Accept-Language

Use Accept-Language header instead of _search-language:

GET [/fhir]/<resourceType>?_sort=<string-search-param>
Accept-Language: <locale>

Note that browsers send requests with Accept-Language (e.g en-US,en;q=0.5) by default.

To enable Accept-Language support use

box_features_multilingual_use__accept__language__header=true

environment variable.

Sorting

_sort search parameter will use desired language if Accept-Language or _search-language are present.

GET [/fhir]/<resourceType>?_search-language=<locale>&_sort=<string-search-param>

Collation

By default PostgreSQL uses system locale to specify sort order. When searching by language, SQL will contain GROUP BY <...> COLLATE "<locale>". Note that if locale does not contain a territory part (language[_territory]), Aidbox will use "language_LANGUAGE", e.g. "en_EN" (is not an locale) or "ru_RU" (correct locale).

Collation is supported in Aidboxdb version 14.7+.

Examples

Get all locations, those names start with 'Clinique' in French:

GET /Location?_search-language=fr-CA&name=Clinique

Same with Accept-Language header:

GET /Location?name=Clinique
Accept-Language: fr-CA

Get all locations and sort by their names in French, using French locale for sort order (COLLATE):

GET /Location?_search-language=fr-CA%_sort=name

If some resource contains an array of strings, e.g. Location.alias, extensions can also be an array.

PUT /fhir/Location/my-loc

resourceType: Location
status: active
alias:
- a
- b
_alias:
- extension:
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: fr-CA
        - url: content
          valueString: a-fr-ca
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: en-CA
        - url: content
          valueString: a-en-ca
- extension:
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: fr-CA
        - url: content
          valueString: b-fr-ca
    - url: http://hl7.org/fhir/StructureDefinition/translation
      extension:
        - url: lang
          valueCode: en-CA
        - url: content
          valueString: b-en-ca

_search-language can search through arrays (search parameter Location.name searches in name, alias, _name and _alias)

GET /Location?_search-language=fr-CA&name=a-fr-ca // found my-loc
GET /Location?_search-language=fr-CA&name=b-fr-ca // found my-loc
GET /Location?_search-language=fr-CA&name=c-fr-ca // not found
GET /Location?_search-language=fr-CA&name=a-fr-ca,c-fr-ca // found my-loc

Last updated