rosetta_translation-1.0.0-alpha1/js/rosetta_translations.es6.js

js/rosetta_translations.es6.js
/**
 * @file
 * Google/Rosetta language translations
 */

((Drupal, once, drupalSettings) => {
  Drupal.behaviors.rosetta_translations = {
    attach(context) {
      const cfg = drupalSettings.rosettaTranslation || {};
      const containerId = cfg.containerId || 'rosetta_translate_element';
      once('rosetta_translations', `#${containerId}`, context).forEach(
        function (translationSelect, index) {
          new TranslationSelectWidget(translationSelect);
        },
      );
    },
  };
})(Drupal, once, drupalSettings);

class TranslationSelectWidget {
  constructor(domNode) {
    const cfg = drupalSettings.rosettaTranslation || {};
    const containerId = cfg.containerId || 'rosetta_translate_element';

    // allowed languages (array preferred; fallback to CSV string → array)
    let langList = [];
    if (Array.isArray(cfg.preferredSupportedLanguages)) {
      langList = cfg.preferredSupportedLanguages;
    } else if (typeof cfg.preferredSupportedLanguages === 'string' && cfg.preferredSupportedLanguages.trim().length > 0) {
      langList = cfg.preferredSupportedLanguages
        .split(',')
        .map((s) => s.trim())
        .filter((s) => s.length > 0);
    }

    // search for lang param to set default language used in translation
    let searchParams = new URLSearchParams(location.search);
    if (searchParams.has("lang")) {
      let lang = searchParams.get('lang');
      if (langList.includes(lang)) {
        sessionStorage.setItem("@au5ton/translate-widget/lastLanguage", "\"" + lang + "\"");
      }
    }

    // ignore classes (array preferred; fallback to CSV string → array)
    let ignoreClasses = [];
    if (Array.isArray(cfg.ignoreClasses)) {
      ignoreClasses = cfg.ignoreClasses;
    } else if (typeof cfg.ignoreClasses === 'string' && cfg.ignoreClasses.trim().length > 0) {
      ignoreClasses = cfg.ignoreClasses
        .split(',')
        .map((s) => s.trim())
        .filter((s) => s.length > 0);
    }

    // ignore selectors (array preferred; fallback to CSV string → array)
    let ignoreSelectors = [];
    if (Array.isArray(cfg.ignoreSelectors)) {
      ignoreSelectors = cfg.ignoreSelectors;
    } else if (typeof cfg.ignoreSelectors === 'string' && cfg.ignoreSelectors.trim().length > 0) {
      ignoreSelectors = cfg.ignoreSelectors
        .split(',')
        .map((s) => s.trim())
        .filter((s) => s.length > 0);
    }

    // included attributes (array preferred; fallback to CSV string → array)
    let includedAttributes = [];
    if (Array.isArray(cfg.includedAttributes)) {
      includedAttributes = cfg.includedAttributes;
    } else if (typeof cfg.includedAttributes === 'string' && cfg.includedAttributes.trim().length > 0) {
      includedAttributes = cfg.includedAttributes
        .split(',')
        .map((s) => s.trim())
        .filter((s) => s.length > 0);
    }

    // load rosetta/google translation widget
    const options = {};
    if (cfg.siteName) options.siteName = cfg.siteName;
    options.pageLanguage = cfg.pageLanguage || 'en';
    if (cfg.chunkSize) options.chunkSize = cfg.chunkSize;
    if (langList.length) options.preferredSupportedLanguages = langList;
    if (ignoreClasses.length) options.ignoreClasses = ignoreClasses;
    if (ignoreSelectors.length) options.ignoreSelectors = ignoreSelectors;
    if (cfg.verboseOutput !== undefined) options.verboseOutput = !!cfg.verboseOutput;
    if (typeof cfg.intersectionThreshold === 'number') options.intersectionThreshold = cfg.intersectionThreshold;
    if (cfg.ignoreIntersection !== undefined) options.ignoreIntersection = !!cfg.ignoreIntersection;
    if (cfg.updateDocumentLanguageAttribute !== undefined) options.updateDocumentLanguageAttribute = !!cfg.updateDocumentLanguageAttribute;
    if (includedAttributes.length) options.includedAttributes = includedAttributes;
    if (cfg.showBanner !== undefined) options.showBanner = !!cfg.showBanner;
    if (cfg.buttons) options.buttons = cfg.buttons;
    if (cfg.attributionImageUrl) options.attributionImageUrl = cfg.attributionImageUrl;
    if (cfg.logoImageUrl) options.logoImageUrl = cfg.logoImageUrl;
    if (cfg.endpoints.translate) {
      options.endpoints = {
        translate: cfg.endpoints.translate,
        supportedLanguages: '/modules/contrib/rosetta_translation/dist/languages/supportedLanguages.json'
      };
    }

    // Rosetta dist is injected by the module as an external script via html_head.
    const init = () => {
      try {
        if (window.au5ton && typeof window.au5ton.translateWidget === 'function') {
          au5ton.translateWidget(options, containerId);
        } else if (cfg.verboseOutput) {
          console.error('Rosetta dist js not available.');
        }
      } catch (e) {
        if (cfg.verboseOutput) {
          console.error(e);
        }
      }
    };

    if (document.readyState === 'complete') {
      // If document finished loading, delay briefly to allow async script to load.
      setTimeout(init, 0);
    } else {
      // Otherwise, run on window load.
      window.addEventListener('load', () => setTimeout(init, 0));
    }

    // Wire select after widget renders (it may be added asynchronously).
    const attachSelectListener = () => {
      this.selectId = domNode.querySelector('select');
      if (!this.selectId) {
        return false;
      }
      if (cfg.sessionUrlUpdates) {
        this.languageChanged(this.selectId, langList);
        this.selectId.addEventListener('change', () => {
          this.languageChanged(this.selectId, langList);
        });
      }
      return true;
    };

    // Try immediately in case it's already present.
    if (!attachSelectListener()) {
      const observer = new MutationObserver(() => {
        if (attachSelectListener()) {
          observer.disconnect();
        }
      });
      observer.observe(domNode, { childList: true, subtree: true });
      // Safety stop after 5s.
      setTimeout(() => observer.disconnect(), 5000);
    }
  }

  // language changed function to handle session/url param as well as sizing of drop down.
  languageChanged(selectId, langList) {
    // needs a delay to let rosetta do its thing first.
    setTimeout(() => {
      // Get saved data from sessionStorage
      let currentLanguage = sessionStorage.getItem("@au5ton/translate-widget/lastLanguage").replace(/['"]+/g, '');
      let searchParams = new URLSearchParams(location.search);

      // update URL param with new lang
      if (langList.includes(currentLanguage)) {
        if (!searchParams.has("lang")) {
            this.urlLanguageUpdate(currentLanguage)
        } else {
          let lang = searchParams.get('lang');
          if (lang != currentLanguage) {
            this.urlLanguageUpdate(currentLanguage)
          }
        }
      }
    }, "1000");
  }

  // update URL param with new lang
  urlLanguageUpdate(lang) {
    let searchParams = new URLSearchParams(location.search);
    searchParams.set("lang", lang.replace(/['"]+/g, ''));
    window.history.replaceState({}, '', `${location.pathname}?${searchParams}`);
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc