decaporg / decap-cms

A Git-based CMS for Static Site Generators
https://decapcms.org
MIT License
17.65k stars 3.02k forks source link

fix: apply duplicate i18n values on entry load #7145

Open demshy opened 3 months ago

demshy commented 3 months ago

Summary We are using a github-gateway implementation with 7 language variants on a pretty large website. For a while we were struggling with a bug, where every once in a while all the duplicated field values would be lost on one of the languages upon saving. I suspect that when you create a new entry and the CMS entry is updated with the files it requests from Github for each language, sometimes one of the files is not loaded correctly and data is null. If you then publish again without switching to the "broken" language variant it will save the empty file. There were also some cases when we already had the files, but added a duplicate field to the collection later on and the values were only saved to the default language.

This patch fixes the second part of this problem - when loading data it will apply the duplicate field values to all i18n variants, so it will get properly updated when published. I need to test a few more edge cases with lists, so we don't create any breaking changes and will update this accordingly.

Test plan

i18n:
  structure: multiple_files
  locales: [en, hr, de, it, si, nl, pl]

  ...

  - name: offers
    folder: content/offers
    create: true
    i18n: true
    fields: [
      {name: title, label: Title, widget: string, i18n: true, pattern: ['^.{0,240}$', Max 240 characters]},
      {name: publishDate, label: Publish date, widget: datetime, picker_utc: true, hint: UTC timezone, i18n: duplicate},
      {name: hideOfferDate, label: Unpublish date, widget: datetime, picker_utc: true, hint: UTC timezone, i18n: duplicate, required: false},
    ]

This was my testing collection. Test case: create a new offer then manually clear one of the files. Open the default entry in CMS, change the title and publish.

Checklist

Please add a x inside each checkbox:

A picture of a cute animal (not mandatory but encouraged) 20231219_104352m