
Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag storeThe recommendation against using field-level translations with Portable Text in Sanity is primarily due to attribute count concerns.
When you use the object-based approach for field-level translations (where each language gets its own field like title.en, title.es, etc.), Portable Text content creates a massive number of attributes in your dataset.
Here's why: Portable Text is inherently complex. Each block, span, mark, annotation, and decorator creates its own attributes. When you multiply this by multiple languages using the object approach, you quickly hit Sanity's attribute limits.
For example, a simple Portable Text field might create attributes like:
content[].children[]content[].markDefs[]content[].styleWith field-level objects for 3 languages, you'd get:
content.en[].children[]content.es[].children[]content.no[].children[]This exponentially increases your attribute usage with each additional language.
The document-internationalization plugin documentation explicitly recommends document-level translations for Portable Text content. This means:
If you must use field-level translations with Portable Text, the internationalized-array plugin is a better option than objects, as it uses fewer attributes by storing the language identifier in the _key field rather than creating separate object properties for each language.
However, document-level translation remains the recommended approach for any content-heavy fields like Portable Text.
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.
Content operations
Content backend


The only platform powering content operations
By Industry


Tecovas strengthens their customer connections
Build and Share

Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag store