(function(){ var windowLoadCompleted = false; jQuery(window).load(function() { // Prevent from being triggered again if (windowLoadCompleted) { return; } windowLoadCompleted = true; // Only proceed if qTranslate is loaded if (typeof qTranslateConfig != 'object' || typeof qTranslateConfig.qtx != 'object') { return; } // Enable the language switching buttons qTranslateConfig.qtx.enableLanguageSwitchingButtons('block'); // Ensure that translation of standard field types is enabled if (!window.acf_qtranslate_translate_standard_field_types) { return; } // Selectors for supported field types var field_types = { text: 'input:text', textarea: 'textarea', wysiwyg: '.wp-editor-area', }; // Remove content hooks from ACF Fields jQuery('.acf-postbox .acf-field').find('.qtranxs-translatable').each(function() { qTranslateConfig.qtx.removeContentHook(this); }); var post_type = jQuery('#post_type').val(); // Whitelist fields for translation function isTranslatableField(field){ if (post_type === 'acf-field-group') { if (field.id.match(/acf_fields-\d+-label/)) return true; if (field.id.match(/acf_fields-\d+-instructions/)) return true; if (field.id.match(/acf_fields-\d+-default_value/)) return true; return false; } return true; } // Setup field types jQuery.each(field_types, function(field_type, selector) { // Add content hooks for existing fields acf.get_fields({ type: field_type }).each(function() { var form = jQuery(this).closest('form').get(0); var field = jQuery(this).find(selector).get(0); if (!isTranslatableField(field)) return; qTranslateConfig.qtx.addContentHookC(field, form); }); // Watch and add content hooks when new fields are added acf.add_action('append_field/type=' + field_type, function($el) { var form = $el.closest('form').get(0); var field = $el.find(selector).get(0); if (!isTranslatableField(field)) return; qTranslateConfig.qtx.addContentHookC(field, form); if (jQuery(field).hasClass('wp-editor-area')) { //qTranslateConfig.qtx.addContentHooksTinyMCE(); // We must manually trigger load event so that the // loadTinyMceHooks function which calls setEditorHooks is executed var loadEvent = document.createEvent('UIEvents'); loadEvent.initEvent('load',false,false,window); window.dispatchEvent(loadEvent); } // Run at higher integer priority than the default in case the ACF handlers // change the id of the underlying input }, 100); }); //qTranslateConfig.qtx.addContentHooksTinyMCE(); // Watch and remove content hooks when fields are removed // however ACF removes the elements from the DOM early so // we must hook into handler and perform updates there var repeaterFieldRemove; if (acf.models) { repeaterFieldRemove = acf.models.RepeaterField.prototype.remove; } else { repeaterFieldRemove = acf.fields.repeater.remove; } function repeaterRemove($el) { var row = ($el.$el || $el).closest('.acf-row'); // support old versions of ACF5PRO as well row.find(_.toArray(field_types).join(',')).filter('.qtranxs-translatable').each(function() { qTranslateConfig.qtx.removeContentHook(this); }); // call the original handler repeaterFieldRemove.call(this, $el); }; }); })();