Skip to content
Merged

3.1.2 #128

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## [3.1.2] - 1er novembre 2026

### Changed
- Mise à jour de DOMPurify (3.4.17) et des dépendances de développement, sans changement visible pour les utilisateurs
- `minimatch` forcé en 11.0.3 pour eslint (faille de sécurité dans un outil de développement), sans changement visible pour les utilisateurs

### Fixed
- Les termes inclus dans un nom de marque ou d’extension cité dans une traduction ne sont plus signalés à tort (ex. « Events » dans « The Events Calendar », « Search » dans « Google Search Console ») (#125)
- Les termes du glossaire entre parenthèses ou suivis d’un point sont maintenant signalés (ex. « (uploads) », « dossier uploads. ») (#116, #119)
- Les termes du glossaire précédés d’une apostrophe courbe (ex. « l’upload ») sont maintenant signalés comme avec l’apostrophe droite
- La locale `fr_FR` n’apparaît plus en double en tête de la page d’accueil quand GlotDict est installé (#112)

## [3.1.1] - 9 octobre 2026

### Added
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<div align="center">

[![Version 3.1.1](https://img.shields.io/badge/version-3.1.1-blue?style=flat-square)](CHANGELOG.md) [![Licence GPL v2+](https://img.shields.io/badge/licence-GPL%20v2%2B-276749?style=flat-square)](LICENSE) [![Tests : Vitest](https://img.shields.io/badge/tests-vitest-6E9F18?style=flat-square&logo=vitest&logoColor=white)](https://github.com/Association-WPFR/SPTE/actions/workflows/ci.yml) [![Lines](https://img.shields.io/badge/lines-50.59%25-red.svg?style=flat)](https://github.com/Association-WPFR/SPTE/actions/workflows/ci.yml)
[![Version 3.1.2](https://img.shields.io/badge/version-3.1.2-blue?style=flat-square)](CHANGELOG.md) [![Licence GPL v2+](https://img.shields.io/badge/licence-GPL%20v2%2B-276749?style=flat-square)](LICENSE) [![Tests : Vitest](https://img.shields.io/badge/tests-vitest-6E9F18?style=flat-square&logo=vitest&logoColor=white)](https://github.com/Association-WPFR/SPTE/actions/workflows/ci.yml) [![Lines](https://img.shields.io/badge/lines-50.59%25-red.svg?style=flat)](https://github.com/Association-WPFR/SPTE/actions/workflows/ci.yml)

</div>

Expand Down
17 changes: 13 additions & 4 deletions entrypoints/spte.content.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import DOMPurify from 'dompurify';
import { rules, charTitle, charClass, NBSP, rgxExclamationPointStrict, rgxQuestionMarkStrict, rgxSemiColonStrict } from '../utils/rules';
import { addStyle, createElement, parseCsv, isPartOfProjectName, stripHighlightTags, isInsideHtmlTag, isInsideDoubleBracketBlock, getReplaceMatchPosition } from '../utils/helpers';
import { buildWarningSpanHTML } from '../utils/warnings';
import { isInsideProductName } from '../utils/product-names';
import { createDefaultSettings } from '../utils/settings';
import {
addForeignToolTip,
Expand Down Expand Up @@ -107,6 +108,11 @@ export function checkTranslation(ctx, translation, oldStatus, newStatus) {
return string;
}

// Le mot fait partie d'un nom de marque ou d'extension cité dans la traduction (ex: « Search » dans « Google Search Console »).
if (rule.id === 'badWords' && isInsideProductName(fullString, offset, string.length)) {
return string;
}

// GlotPress a 6 statuts : untranslated, current, fuzzy, waiting, old, rejected. Old et rejected ne doivent pas être comptés.
switch (newStatus) {
case 'rejected':
Expand Down Expand Up @@ -323,9 +329,9 @@ function manageControls(ctx) {
/** @param {ReturnType<typeof buildContext>} ctx */
function frenchiesGoFirst(ctx) {
moveFrenchRowToFirst(ctx.frenchStatsGlobal, ctx.GDmayBeOnBoard);
// Pas de garde GlotDict ici : GlotDict n'a aucune emprise sur cette page
// (contrairement au tableau des locales d'un projet, où son réordonnancement peut entrer en conflit avec le nôtre).
moveFrenchLocaleCardToFirst(ctx.frenchLocaleCard, false);
// Garde GlotDict aussi ici : sur la page d'accueil, GlotDict clone la carte de la locale courante en tête de liste
// (gd_current_locale_first), ce qui donnait deux cartes fr_FR si SPTE déplaçait aussi l'originale. Issue #112.
moveFrenchLocaleCardToFirst(ctx.frenchLocaleCard, ctx.GDmayBeOnBoard);
}

/** @param {ReturnType<typeof buildContext>} ctx */
Expand Down Expand Up @@ -543,7 +549,10 @@ export function getGlossaryRegex(ctx, glossary) {
const badWordsRegexPattern = ctx.rulesById.get('badWords').regex.source;
// On duplique chaque mot avec un s final pour pouvoir traiter les pluriels.
const glossaryWithPlurals = glossary.reduce((a, i) => a.concat(i, `${i}s`), []);
const glossaryRegexPattern = `${glossaryWithPlurals.join('(?=[\\s,:;"\']|$)|(?<=[\\s,:;"\']|^)(?<!«\\s)')}(?=[\\s,.:;"']|$)`;
// Un seul lookbehind/lookahead pour tous les termes (et non un par séparateur de jointure) : sinon le premier terme n'a pas
// de lookbehind et seul le dernier accepte un point final. Parenthèses et ponctuation finale acceptées (« (uploads) », « uploads. »).
// Le point n'est une borne que suivi d'un espace ou de la fin, pour ne pas signaler « widget.php ». Voir issue #116.
const glossaryRegexPattern = `(?<=[\\s,:;"'’(]|^)(?<!«\\s)(?:${glossaryWithPlurals.join('|')})(?=[\\s,:;!?)»"']|\\.(?:\\s|$)|$)`;
// Flag « i » indispensable : les termes du glossaire sont en minuscules (et rgxBadWords l'a déjà), sinon un mot capitalisé n'est pas repéré.
const newRgxBadWords = new RegExp(`${badWordsRegexPattern}|${glossaryRegexPattern}`, 'gmi');
ctx.rulesById.get('badWords').regex = newRgxBadWords;
Expand Down
Loading
Loading