First, you can fetch the list of locales configured in a project with the following query:
query {_site {locales # -> ["en", "it", "fr"]}}
In case you have a model with some localized fields, and the model itself does not require the presence of a localization for each one of the locales configured in a project, you might need to know which localizations are actually present for each record.
The _locales
field gives you exactly this information:
query {allBlogPosts {_locales # -> ["en", "it"]title}}
The same _locales
field can also be used to filter your records. For example, you can fetch only the records which have both an en
and it
localizations this way:
query {allBlogPosts(filter: {_locales: {allIn: [it]}}) {title}}
You can also use the anyIn
criteria to fetch records which contain at least one of the requested localizations, or notIn
to fetch records which do not have any of the specified localizations.
When you're fetching the value of a localized field, by default it will be returned in the project default locale — that is, the first locale in your project settings:
query {_site {locales # -> ["en", "it"]}allBlogPosts {title # -> will return the title value in "en" locale}}
To change that, you can add a locale
argument to queries to specify another locale:
query {allBlogPosts(locale: it) {title # -> will return the title value in "it" locale}}
You can also specify a different locale on a per-field basis:
query {allBlogPosts(locale: it) {title # -> will return the title value in "it" localeenTitle: title(locale: en) # -> will return the title value in "en" locale}}
You can also specify a list of fallback locales together with the locale
argument:
query {allBlogPosts(locale: it_IT, fallbackLocales: [it, en]) {title}}
If the field value for the specified locale
is null
-ish (null
, empty string or empty array), the system will try to find a non null
-ish value in each of the localizations specified in the fallbackLocales
argument. The order of the elements in the fallbackLocales
argument is important, as the system will start from the first element in the array, and go on from there.
Just like the locale
argument, you can specify different fallback locales on a per-field basis:
query {allBlogPosts {title(locale: it_IT, fallbackLocales: [it, en])}}
If you want to get the value of a field in every available localization, you can use the _all[FIELD]Locales
field:
query {allBlogPosts {_allTitleLocales {localevalue} # -> returns [{ locale: "en", value: "Hi!"}, { locale: "it", value: "Ciao!"}]}}
DatoCMS allows a great deal of customization when dealing with localization. Check out these tutorial videos for a hands-on approach: