Discussion of missing translated documents and issues with the document internationalization plugin

12 replies
Last updated: Sep 19, 2022
Hi Sanity. This morning we tried to fix some translation references for documents by using https://github.com/sanity-io/document-internationalization/blob/main/docs/translation-maintenance.md , with the end result that the translated documents are now completely gone (while the base translation document is still in place). The references themselves seem to still be in place in the dataset, but the actual documents are nowhere to be found.
Is there any way for us to restore these documents? Should we avoid using translation maintenance to fix translation reference issues? And/or should we use strong references to avoid similar behaviour in the future when trying to fix references?
AI Update

I'm really sorry to hear about your documents disappearing - that's definitely stressful! Let me help you understand what likely happened and how to recover your content.

Recovering Your Documents

The good news is that your translated documents are likely recoverable since Sanity maintains document history. Since the references still exist but the documents themselves are gone, they were probably deleted rather than completely removed.

Method 1: Via Studio URL

If you know the document IDs (which you can find from your translation references):

  1. Navigate directly to: https://your-studio.sanity.studio/desk/your-doc-type;[document-id]
  2. You should see the deleted document with its history
  3. Click the document status indicator at the bottom of the editor or use the contextual menu (ellipsis icon) and select "History"
  4. Use the History panel to restore it to a previous version

Method 2: Programmatically via History API

If you have many documents to restore, you can use the History API to batch restore them:

import {createClient} from '@sanity/client'

const client = createClient({
  projectId: 'your-project-id',
  dataset: 'production',
  token: 'your-token-with-write-access',
  apiVersion: '2025-02-19',
  useCdn: false
})

// Get document history
const history = await client.request({
  url: `/data/history/production/documents/[document-id]`,
  method: 'GET'
})

// Restore by using a previous revision (before deletion)
const previousVersion = history.documents[0] // Get the last version before deletion
await client.createOrReplace(previousVersion)

Important: Your ability to restore depends on your plan's retention period (3 days for Free, 90 days for Growth, 365 days for Enterprise), so act quickly!

What Likely Happened

Without being able to verify the exact translation maintenance documentation you followed, it sounds like the maintenance process may have inadvertently deleted your translated documents. This could happen if:

  1. The maintenance operation interpreted the documents as orphaned or invalid
  2. There was a mismatch in how the translation references were configured
  3. The operation removed documents that it thought were no longer needed

About Reference Types in Document Internationalization

Regarding your question about strong vs. weak references: The document-internationalization plugin's behavior depends on how it's configured in your schema. The key difference:

  • Weak references allow documents to be deleted independently without affecting the referencing document
  • Strong references prevent a document from being deleted if another document references it

The appropriate choice depends on your use case and how the plugin is configured in your specific implementation. For translation workflows, the reference configuration affects what happens when you try to delete or modify translation relationships.

Prevention Going Forward

To avoid this in the future:

  1. Always backup before maintenance operations - Use dataset exports to create a safety net
  2. Test on a development dataset first - Clone your dataset and test any maintenance operations there before running them on production
  3. Verify reference integrity - Ensure all translation fields (__i18n_lang, __i18n_refs, etc.) are properly populated before attempting fixes
  4. Document your setup - Keep notes on your specific document-internationalization configuration so you understand how references are structured
  5. Be cautious with maintenance operations - Any operation that modifies or "cleans up" references should be thoroughly tested first

Additional Resources

For more information about restoring deleted documents, check out:

Once you restore your documents, I'd recommend carefully verifying that all translation references are correctly bidirectional (base language references translations, translations reference base) to prevent similar issues in the future.

If you continue to have trouble with the restoration or need help understanding what went wrong with your specific maintenance operation, consider reaching out to Sanity support with your project details - they can help investigate what happened and ensure your translation setup is configured correctly.

Hello
user U
Where did you check for the original docs? What do you mean it’s still in place? Did you query for them and see if they are still there? There are many many roads to getting things back and I cannot see, what you mean with deleted. If a reference is still in place, the docs are still there.

But without more inforamation we will not be able to answer. +
Hi Saskia. Thanks for getting back. To clarify -• The base document still exists and is available within the Sanity studio UI and API
• The translated documents (that were previously referenced from the base document) (
i18n.[...].[locale]
) are no longer visible from within the Sanity Studio UI.• We did find a way to find the translated documents by looking up transactions, and then querying each single translated document one-by-one.
Surprised by how translation maintenance can result in 300+ documents missing as part of it's "fix behavior", but again it might be due to the type of reference we're using (weak)?

Via the transactions API I see similar transactions to the one below for all of the documents that went missing:

  "id": "frfQR1pcDXW7QBTcyUY7FK",
  "timestamp": "2022-08-22T07:31:12.735179Z",
  "author": "[id]",
  "mutations": [
    {
      "delete": {
        "id": "i18n.cd505c82-4aab-4b64-8eff-[...].da",
        "purge": false
      }
    }
  ],
  "documentIDs": [
    "i18n.cd505c82-4aab-4b64-8eff-[...].da"
  ]
}
okay, then the issue must lie in your studio setup … could you provice us more information around that?for example: where in the sanity UI did they disappear from? Was everything work before with the plugin?
• The translated documents disappeared from the document-internationalization dropdown in top right corner. I.e. localisation for each language were shown as "not created", and upon click they would be re-created from the base document. When we did that we were in fact able to see and restore from previous history (most likely due to the fact that the id was the same as before).• Once published (after restoring) the document history was reset, and now it looks like the document was created when it was restored.
• The plugin seems to have been working fine - except that we see quite a few documents show up under "translation maintenance" to be fixed, which is what we did yesterday - causing the issue to begin with.
Document internationalization config looks like this:

{
  "idStructure": "subpath",
  "referenceBehavior": "weak",
  "base": "en",
  "languages": [
    { "id": "da", "title": "Danish", "flag": "dk" },
    { "id": "de", "title": "German" },
    { "id": "en-GB", "title": "English (UK)", "flag": "gb" },
    { "id": "en", "title": "English", "flag": "gb" },
    { "id": "fr", "title": "French", "flag": "fr" },
    { "id": "nb", "title": "Norwegian", "flag": "no" },
    { "id": "sv", "title": "Swedish", "flag": "se" }
  ],
  "withTranslationsMaintenance": true
}
hm could you send a screenshot for us? this is very curious… We will have alook
(screanshots are needed, so we are sure which dropdown you mean etc.=
Yes. of course.
Here's a document where some translations have been created and are available. Others are not.
When fixing using "Translation Maintenance" what happened was that all translations except base translation went "inactive" - or whatever you want to call the "create new document translations" section 🙂 Also they were no longer in the dataset, but only to be found via the transactions and history api.
Hello
user U
sorry nobody came back to you, somehow this seems to have slipped off the table, so sorry for that.Can I still help you with this issue?
Hi Saskia. Thanks for following up on this. I've been in dialogue with Simeon regarding this, and I can see that a few re-workings of the document internationalisation plugin are on their way to avoid similar situations going forward.
Wonderful that Simeon is helping you 🙂Let’s mark this thread as resolved, and you can pose new questions in the usual way, if you need something else

Sanity – Build the way you think, not the way your CMS thinks

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.

Was this answer helpful?