• Bonjour à tous,

    J’utilise la version 3.4.8 de Packlink pro et je viens de constater que plusieurs éléments sont en anglais :

    • sur la page de validation du panier de mon site internet le bouton “select drop-off location” est en anglais.
    • lorsque je clique sur le bouton, le contenu de la fenêtre est aussi en anglais..

      Comment puis je résoudre ces différents problèmes ? est ce un mauvais paramétrage de ma plateforme ?

      En remerciant par avance la personne qui pourra m’aider.
Viewing 5 replies - 1 through 5 (of 5 total)
  • Bonjour, avez-vous eu une réponse sur ce sujet ? J’ai exactement le même problème, et je n’arrive pas à obtenir de support.

    anpmsi

    (@anpmsi)

    Bonjour, ?a fait des années que ces éléments ne sont pas traduits mais les développeurs du module s’en contrefichent royalement. Ou alors ce sont des amateurs qui ne maitrisent pas le code. C’est assez usant de voir à quel point ils négligent leurs clients qui font remonter le problème depuis de nombreuses années.

    La solution c’est de traduire directement dans le code et d’arrêter de faire les mises à jours qui obligent à recommencer.

    add_action('wp_footer', function() {
    if (!is_checkout()) return;
    ?>
    <script>
    function forcePacklinkTranslations() {
    if (typeof Packlink === 'undefined' || !Packlink.checkout) return;

    const translations = {
    "pickDropOff": "Sélectionner un point de retrait",
    "changeDropOff": "Changer de point de retrait",
    "dropOffTitle": "Le colis sera livré à :",
    "noDropOffLocationsMessage": "Aucun point de retrait n'est disponible pour l'adresse saisie"
    };

    // Dictionnaire des traductions pour les textes bruts
    const textMappings = {
    "Package will be delivered to:": translations.dropOffTitle,
    "No drop-off locations available for the provided address.": translations.noDropOffLocationsMessage
    };

    // Fonction pour mettre à jour tous les éléments
    function updateAllTexts() {
    // Traitement des boutons
    document.querySelectorAll('button, .button, [role="button"]').forEach(button => {
    const btnText = button.textContent.trim();
    if (btnText === "Change Drop-Off Location") {
    button.textContent = translations.changeDropOff;
    }
    if (btnText === "Select Drop-Off Location") {
    button.textContent = translations.pickDropOff;
    }
    });

    // Traitement des textes bruts avec TreeWalker pour meilleures performances
    const walker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_TEXT,
    { acceptNode: function(node) {
    return node.nodeValue.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
    }},
    false
    );

    let node;
    while ((node = walker.nextNode())) {
    const originalText = node.nodeValue.trim();
    if (textMappings[originalText]) {
    node.nodeValue = node.nodeValue.replace(originalText, textMappings[originalText]);
    }
    }
    }

    // Observateur pour les modifications globales
    const globalObserver = new MutationObserver(() => updateAllTexts());

    // Configuration de l'observateur
    globalObserver.observe(document.body, {
    childList: true,
    subtree: true,
    characterData: true
    });

    // Surcharge des traductions Packlink
    Object.defineProperty(Packlink.checkout, '_translations', {
    value: translations,
    writable: false,
    configurable: false
    });

    // Initialisation
    updateAllTexts();
    }

    // Démarrage du système
    const init = () => {
    forcePacklinkTranslations();
    const interval = setInterval(forcePacklinkTranslations, 100);
    setTimeout(() => clearInterval(interval), 10000);
    };

    if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
    } else {
    init();
    }
    </script>
    <?php
    }, 0);

    Voici le code à ajouter dans le fichier functions.php de votre thème enfant. Utilisez un thème enfant pour ne perdre les changements lors des mises à jour du thème.

    Ce système remplacera dynamiquement :

    • Les boutons “Change Drop-Off Location” et “Select Drop-Off Location”
    • Le texte “Package will be delivered to:”
    • Le message d’erreur “No drop-off locations available…”

    Et ce même si ces éléments sont ajoutés dynamiquement après le chargement initial de la page.

    • This reply was modified 1 month, 3 weeks ago by siteweb.

    Salut @siteweb ,

    Excellent ce que tu as fait, merci beaucoup !

    J’aimerai completer ta solution pour changer également le message d’erreur “Please choose a drop-off location”, une idée ? Je vais chercher de mon coté et je reviendrai ici si je trouve la solution !

    add_action('wp_footer', function() {
    if (!is_checkout()) return;
    ?>
    <script>
    function forcePacklinkTranslations() {
    if (typeof Packlink === 'undefined' || !Packlink.checkout) return;

    const translations = {
    "pickDropOff": "Sélectionner un point de retrait",
    "changeDropOff": "Changer de point de retrait",
    "dropOffTitle": "Le colis sera livré à :",
    "noDropOffLocationsMessage": "Aucun point de retrait n'est disponible pour l'adresse saisie",
    "pleaseChooseDropoff": "Veuillez sélectionner un point de retrait"
    };

    // Dictionnaire des traductions pour les textes bruts
    const textMappings = {
    "Package will be delivered to:": translations.dropOffTitle,
    "No drop-off locations available for the provided address.": translations.noDropOffLocationsMessage,
    "Please choose a drop-off location.": translations.pleaseChooseDropoff
    };

    // Fonction pour mettre à jour tous les éléments
    function updateAllTexts() {
    // Traitement des boutons
    document.querySelectorAll('button, .button, [role="button"]').forEach(button => {
    const btnText = button.textContent.trim();
    if (btnText === "Change Drop-Off Location") {
    button.textContent = translations.changeDropOff;
    }
    if (btnText === "Select Drop-Off Location") {
    button.textContent = translations.pickDropOff;
    }
    });

    // Traitement des textes bruts avec TreeWalker pour meilleures performances
    const walker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_TEXT,
    { acceptNode: function(node) {
    return node.nodeValue.trim() ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
    }},
    false
    );

    let node;
    while ((node = walker.nextNode())) {
    const originalText = node.nodeValue.trim();
    if (textMappings[originalText]) {
    node.nodeValue = node.nodeValue.replace(originalText, textMappings[originalText]);
    }
    }
    }

    // Observateur pour les modifications globales
    const globalObserver = new MutationObserver(() => updateAllTexts());

    // Configuration de l'observateur
    globalObserver.observe(document.body, {
    childList: true,
    subtree: true,
    characterData: true
    });

    // Surcharge des traductions Packlink
    Object.defineProperty(Packlink.checkout, '_translations', {
    value: translations,
    writable: false,
    configurable: false
    });

    // Initialisation
    updateAllTexts();
    }

    // Démarrage du système
    const init = () => {
    forcePacklinkTranslations();
    const interval = setInterval(forcePacklinkTranslations, 100);
    setTimeout(() => clearInterval(interval), 10000);
    };

    if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
    } else {
    init();
    }
    </script>
    <?php
    }, 0);

    J’ai pu compléter ta solution !

Viewing 5 replies - 1 through 5 (of 5 total)
  • You must be logged in to reply to this topic.