feat: translation flows, revision conflicts, delete scopes, article moves and a target site for new articles

This commit is contained in:
Florian Sylvain committed 2026-11-03 00:12:29 +01:00
1 parent 339e646eb8
commit 45fbbc33b1
93 files changed
+7630 -294

No files matched your search

+2
View File
@@ -1,11 +1,13 @@
import { articleListMessages } from './articleListMessages'
import { editorMessages } from './editorMessages'
import { localizationMessages } from './localizationMessages'
import { translationFlowMessages } from './translationFlowMessages'
export const messages = {
...localizationMessages,
...articleListMessages,
...editorMessages,
...translationFlowMessages,
'Not found': 'Introuvable',
'Edit article': 'Modifier l’article',
unselected: 'désélectionnée',
+1
View File
@@ -19,6 +19,7 @@ const SOURCES = [
'components/SeoAdvancedSection.vue',
'components/SeoSocialSection.vue',
'components/SiteSelect.vue',
'components/SiteMoveField.vue',
'composables/useArticleActions.ts',
'composables/useArticleRowActions.ts',
'composables/useEditorImages.ts',
@@ -0,0 +1,20 @@
import { describe, expect, it } from 'vitest'
import { messages } from './messages'
import { translationFlowMessages } from './translationFlowMessages'
const NUMBERED = /\{\d+\}/g
describe('Translation flow messages', () => {
it.each(Object.entries(translationFlowMessages))('translates "%s"', (english, french) => {
expect(french).toMatch(/\S/)
expect(french).not.toBe(english)
expect([...french.matchAll(NUMBERED)].map((match) => match[0]).sort()).toEqual(
[...english.matchAll(NUMBERED)].map((match) => match[0]).sort(),
)
expect((messages as Record<string, string>)[english]).toBe(french)
})
it('says article, never story', () => {
expect(Object.keys(translationFlowMessages).join(' ')).not.toMatch(/\bstory\b/i)
})
})
+155
View File
@@ -0,0 +1,155 @@
export const translationFlowMessages = {
'Start empty': 'Commencer vide',
'Only the title. Freshness shows No source until you pick a tracked source.':
'Seulement le titre. La fraîcheur indique Aucune source tant que vous n’avez pas choisi une source suivie.',
'Copy from {0}': 'Copier depuis {0}',
"Copies body, excerpt, search and social text, image alternative text and authors. Images are reused, files aren't duplicated. The version starts as Needs review.":
'Copie le corps, l’extrait, les textes de recherche et de partage, les textes alternatifs des images et les auteurs. Les images sont réutilisées, les fichiers ne sont pas dupliqués. La version démarre à relire.',
'Creates a {0} draft of "{1}". It isn\'t published.':
'Crée un brouillon en {0} de « {1} ». Il n’est pas publié.',
'Creates a draft of "{0}" in the language you choose. It isn\'t published.':
'Crée un brouillon de « {0} » dans la langue que vous choisissez. Il n’est pas publié.',
'Title in {0}': 'Titre en {0}',
'Copying text is a starting point: it stays in {0} until you translate it.':
'Copier le texte est un point de départ : il reste en {0} jusqu’à ce que vous le traduisiez.',
'Create {0} draft': 'Créer le brouillon en {0}',
'{0} was disabled on this site.': '{0} a été désactivée sur ce site.',
'Add a translation': 'Ajouter une traduction',
'Source version': 'Version source',
'You choose which version to copy from. It is also the source tracked for review. Access is checked again when you create the draft.':
'Vous choisissez la version à copier. C’est aussi la source suivie pour la relecture. L’accès est vérifié à nouveau à la création du brouillon.',
'Choose a version': 'Choisir une version',
'Starting content': 'Contenu de départ',
'Someone else saved this version': 'Quelqu’un d’autre a enregistré cette version',
'Reload theirs?': 'Recharger sa version ?',
"Someone else saved this version at {0}. Your changes aren't saved. They stay here until you choose.":
'Quelqu’un d’autre a enregistré cette version à {0}. Vos modifications ne sont pas enregistrées. Elles restent ici jusqu’à votre choix.',
'This discards your unsaved changes.': 'Cela abandonne vos modifications non enregistrées.',
"Couldn't replace theirs": 'Impossible de remplacer sa version',
'Someone else saved this version again at {0}, before your save went through. Nothing was overwritten. Your changes are still here.':
'Quelqu’un d’autre a de nouveau enregistré cette version à {0}, avant votre enregistrement. Rien n’a été écrasé. Vos modifications sont toujours ici.',
'Nothing was overwritten. Your changes are still here. Try again.':
'Rien n’a été écrasé. Vos modifications sont toujours ici. Réessayez.',
'Your session ended. These changes were kept in this browser.':
'Votre session a pris fin. Ces modifications ont été conservées dans ce navigateur.',
'Keep my changes': 'Garder mes modifications',
'Nothing is sent. Your changes stay in the editor.':
'Rien n’est envoyé. Vos modifications restent dans l’éditeur.',
'Download my version': 'Télécharger ma version',
'Saves your title and body as a text file. Nothing is sent.':
'Enregistre votre titre et votre corps dans un fichier texte. Rien n’est envoyé.',
'Reload theirs': 'Recharger sa version',
'Shows their version. You confirm first.': 'Affiche sa version. Vous confirmez d’abord.',
'Save over theirs': 'Écraser sa version',
'Replaces the title, body and search fields of this version only. Other languages are untouched.':
'Remplace le titre, le corps et les champs de recherche de cette version seulement. Les autres langues ne changent pas.',
'Reload and discard my changes': 'Recharger et abandonner mes modifications',
"You can't move this article": 'Vous ne pouvez pas déplacer cet article',
'Moving to {0}…': 'Déplacement vers {0}…',
'Move to {0}?': 'Déplacer vers {0} ?',
'All {0} versions move together. Keep this page open.':
'Les {0} versions se déplacent ensemble. Gardez cette page ouverte.',
'Keep this page open.': 'Gardez cette page ouverte.',
'This moves every version together. Nothing is split.':
'Toutes les versions se déplacent ensemble. Rien n’est séparé.',
"Couldn't move the article": 'Impossible de déplacer l’article',
'{0} enables {1} only.': '{0} n’active que {1}.',
"{0} doesn't enable every language in this article":
'{0} n’active pas toutes les langues de cet article',
'Enable {0} on {1} first.': 'Activez d’abord {0} sur {1}.',
'Languages disabled on {0} count too.': 'Les langues désactivées sur {0} comptent aussi.',
'Nothing was moved.': 'Rien n’a été déplacé.',
'The {0} address "{1}" is already used by another {0} article on {2}.':
'L’adresse {0} « {1} » est déjà utilisée par un autre article en {0} sur {2}.',
'An address is already used on {0}': 'Une adresse est déjà utilisée sur {0}',
'Change it before moving. Nothing was moved.':
'Changez-la avant de déplacer. Rien n’a été déplacé.',
'Moving…': 'Déplacement…',
'Moves all language versions of this article.':
'Déplace toutes les versions linguistiques de cet article.',
'Addresses and links': 'Adresses et liens',
'Each version keeps its address. Links from the old site to it will stop working. RenewCMS does not create redirects.':
'Chaque version garde son adresse. Les liens de l’ancien site vers elle cesseront de fonctionner. RenewCMS ne crée pas de redirections.',
Moving: 'Déplacement',
'This takes a few seconds.': 'Cela prend quelques secondes.',
'Moving needs edit permission on every version':
'Déplacer exige la permission de modifier chaque version',
'Ask an owner to move it. Nothing was changed.':
'Demandez à un propriétaire de le déplacer. Rien n’a été modifié.',
'Nothing was moved. Try again.': 'Rien n’a été déplacé. Réessayez.',
'Moves the article to the site you choose.':
'Déplace l’article vers le site que vous choisissez.',
'Move article…': 'Déplacer l’article…',
'Starts an article in this language.': 'Démarre un article dans cette langue.',
'Translation of an existing article': 'Traduction d’un article existant',
'Uses the same rules as Add translation.': 'Suit les mêmes règles que Ajouter une traduction.',
'{0} only offers {1}, so the language was reset from {2}.':
'{0} ne propose que {1}, la langue a donc été réinitialisée depuis {2}.',
'Default for {0}.': 'Par défaut pour {0}.',
'No {0} version yet. Copies from {1}': 'Pas encore de version en {0}. Copie depuis {1}',
'Create a translation of an article you can read.':
'Créez une traduction d’un article que vous pouvez lire.',
'Give the article a title. You can write the rest in the editor.':
'Donnez un titre à l’article. Vous écrirez le reste dans l’éditeur.',
'Create article': 'Créer l’article',
'{0} draft created': 'Brouillon en {0} créé',
'Search articles': 'Rechercher des articles',
'Choose an article': 'Choisir un article',
'No article is missing this language.': 'Aucun article ne manque dans cette langue.',
'New article or translation': 'Nouvel article ou traduction',
'{0} already exists for this article': '{0} existe déjà pour cet article',
'Open it to continue. Your entries are kept here.':
'Ouvrez-la pour continuer. Votre saisie est conservée ici.',
"{0} can't be created for this article": '{0} ne peut pas être créée pour cet article',
'Try a different language, or ask an owner. Your entries are kept.':
'Essayez une autre langue ou demandez à un propriétaire. Votre saisie est conservée.',
'{0} was disabled': '{0} a été désactivée',
'{0} was disabled on this site while you were filling this in. Ask an owner to re-enable it, or choose another language. Your entries are kept.':
'{0} a été désactivée sur ce site pendant votre saisie. Demandez à un propriétaire de la réactiver ou choisissez une autre langue. Votre saisie est conservée.',
"The source isn't available to you": 'La source n’est pas disponible pour vous',
'You can no longer read the version you chose. Choose another source you can read, or start empty. Your title is kept.':
'Vous ne pouvez plus lire la version choisie. Choisissez une autre source lisible ou commencez vide. Votre titre est conservé.',
"Couldn't create the translation": 'Impossible de créer la traduction',
'Your entries are kept. Try again.': 'Votre saisie est conservée. Réessayez.',
'Open {0} version': 'Ouvrir la version en {0}',
'Your {0} title and body are saved as a text file. Your changes are still in the editor.':
'Votre titre et votre corps en {0} sont enregistrés dans un fichier texte. Vos modifications sont toujours dans l’éditeur.',
'Your title and body are saved as a text file. Your changes are still in the editor.':
'Votre titre et votre corps sont enregistrés dans un fichier texte. Vos modifications sont toujours dans l’éditeur.',
"Couldn't delete the whole article": 'Impossible de supprimer tout l’article',
'Some versions were deleted. Open the language menu to see what is left.':
'Certaines versions ont été supprimées. Ouvrez le menu des langues pour voir ce qui reste.',
'Delete the {0} version?': 'Supprimer la version en {0} ?',
'"{0}" will be deleted. Other versions stay.':
'« {0} » sera supprimé. Les autres versions restent.',
'{0} version deleted': 'Version en {0} supprimée',
'"{0}" is gone. Other versions stay.': '« {0} » a disparu. Les autres versions restent.',
"You can't delete this article": 'Vous ne pouvez pas supprimer cet article',
'Deleting an article needs delete permission on every version. You can still delete the version you are editing.':
'Supprimer un article exige la permission de supprimer chaque version. Vous pouvez toujours supprimer la version que vous modifiez.',
'Delete the only version?': 'Supprimer l’unique version ?',
'{0} is the only version of this article. Deleting it deletes the article.':
'{0} est la seule version de cet article. La supprimer supprime l’article.',
"This deletes the article and every version you can read. It can't be undone.":
'Cela supprime l’article et chaque version que vous pouvez lire. C’est irréversible.',
'Moved to {0}': 'Déplacé vers {0}',
'This page may be out of date. Reload it to see the latest.':
'Cette page n’est peut-être plus à jour. Rechargez-la pour voir la dernière version.',
'All {0} versions moved together.': 'Les {0} versions ont été déplacées ensemble.',
'The article moved.': 'L’article a été déplacé.',
'{0} · published': '{0} · publiée',
'{0} · draft': '{0} · brouillon',
'{0} and {1} more will be copied. You can change them in the editor.':
'{0} et {1} autres seront copiés. Vous pourrez les modifier dans l’éditeur.',
'{0} will be copied. You can change them in the editor.':
'{0} seront copiés. Vous pourrez les modifier dans l’éditeur.',
'1 inline image is reused.': '1 image dans le texte est réutilisée.',
'{0} inline images are reused.': '{0} images dans le texte sont réutilisées.',
'Cover image is reused.': 'L’image de couverture est réutilisée.',
'Cover image and 1 inline image are reused.':
'L’image de couverture et 1 image dans le texte sont réutilisées.',
'Cover image and {0} inline images are reused.':
'L’image de couverture et {0} images dans le texte sont réutilisées.',
'Alternative text is copied and stays in {0} until you translate it.':
'Le texte alternatif est copié et reste en {0} jusqu’à ce que vous le traduisiez.',
}