# General Translation Integrations: Querying translations URL: https://generaltranslation.com/en-US/docs/integrations/sanity/guides/querying-translations.mdx --- title: Querying translations description: How to query document-level and field-level Sanity translations with GROQ. related: links: - /docs/integrations/sanity/guides/translating-content - /docs/integrations/sanity/guides/managing-translations - /docs/integrations/sanity/guides/configuring-sanity --- General Translation supports two Sanity storage models. Document-level localization creates a document for each locale, while field-level localization stores locale values in internationalized arrays on one document. ## Query document-level translations [#documents] Document-level translations are tagged with a language field, which defaults to `language`. Query the version you need by filtering on that field. ### Query source content Source documents do not set the language field by default. Exclude translated documents by filtering for an undefined language field. ```text *[_type == "article" && !defined(language)]{ title, slug, body } ``` ### Query a target locale Filter by the language field. ```text *[_type == "article" && language == "es"]{ title, slug, body } ``` ### Query one translated document ```text *[_type == "article" && slug.current == "hello-world" && language == "es"][0]{ title, body } ``` If you dedupe translated slugs, the slug includes the locale suffix, such as `hello-world-es`. ### Query all language versions ```text *[_type == "article"]{ title, slug, body, language } ``` ### Query source content with or without a language field Some source documents explicitly set the source locale while others leave the language field undefined. Include both representations when you need all source content. ```text *[_type == "article" && (language == "en" || !defined(language))]{ title, slug, body } ``` ### Use a custom language field If your plugin config sets `languageField: 'locale'`, query `locale` instead of `language`. The schema field and the query field must match the configured value. ```text *[_type == "article" && locale == "es"]{ title, slug, body } ``` ### Query translated references After references are patched, translated documents point to the translated versions of referenced documents. Query them as you normally would. ```text *[_type == "article" && language == "es"]{ title, "author": author->{ name, language } } ``` See [Patch references](/docs/integrations/sanity/guides/managing-translations#patch-references) for how references are rewritten. ## Query field-level translations [#fields] Field-level localization stores each locale in an `internationalizedArray*` field. Filter the array by its `language` property and project the matching `value`: ```text *[_type == "article"][0]{ "titleEs": title[language == "es"][0].value, "bodyEs": body[language == "es"][0].value } ``` The document itself does not receive the document-level `language` field or a `translation.metadata` link. Query other nonlocalized fields from the same document as usual. ## Next steps - /docs/integrations/sanity/guides/translating-content - /docs/integrations/sanity/guides/managing-translations - /docs/integrations/sanity/guides/configuring-sanity