qTranslate X - Version 2.9.5

Version Description

  • more fixes for <!--more--> and <!--nextpage--> tags.
Download this release

Release Info

Developer johnclause
Plugin Icon wp plugin qTranslate X
Version 2.9.5
Comparing to
See all releases

Code changes from version 2.9.4 to 2.9.5

admin/import_export.php CHANGED
@@ -80,7 +80,7 @@ function qtranxf_add_row_migrate($nm,$plugin) {
80
<td>
81
<?php
82
if($plugin=='qtranslate' || $plugin=='ztranslate'){
83
- _e('There is no need to migrate any setting, the database schema is compatible with this plugin.');
84
}else{
85
?>
86
<label for="qtranslate_no_migration"><input type="radio" name="<?php echo $plugin; ?>-migration" id="<?php echo $plugin; ?>_no_migration" value="none" checked /> <?php _e('Do not migrate any setting', 'qtranslate'); ?></label>
80
<td>
81
<?php
82
if($plugin=='qtranslate' || $plugin=='ztranslate'){
83
+ _e('There is no need to migrate any setting, the database schema is compatible with this plugin.', 'qtranslate');
84
}else{
85
?>
86
<label for="qtranslate_no_migration"><input type="radio" name="<?php echo $plugin; ?>-migration" id="<?php echo $plugin; ?>_no_migration" value="none" checked /> <?php _e('Do not migrate any setting', 'qtranslate'); ?></label>
qtranslate.js CHANGED
@@ -6,6 +6,59 @@ function c(v){ ++cc; console.log('== '+cc+': '+v); }
6
function ct(v){ c(v); console.trace(); }
7
*/
8
9
qtranxj_split = function(text)
10
{
11
var result = new Object;
@@ -64,7 +117,7 @@ qtranxj_split = function(text)
64
}
65
return result;
66
}
67
-
68
/*
69
qtranxj_split = function(text)
70
{
@@ -121,10 +174,35 @@ qtranxj_split = function(text)
121
return result;
122
}
123
*/
124
//"_c" stands for "comment"
125
qtranxj_join_c = function(texts)
126
{
127
- var text = '';
128
for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
129
{
130
var lang=qTranslateConfig.enabled_languages[i];
@@ -141,6 +219,8 @@ qtranxj_join_c = function(texts)
141
//"b" stands for "bracket"
142
qtranxj_join_b = function(texts)
143
{
144
var text = '';
145
for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
146
{
6
function ct(v){ c(v); console.trace(); }
7
*/
8
9
+ qtranxj_split = function(text)
10
+ {
11
+ var result = new Object;
12
+ for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
13
+ {
14
+ var lang=qTranslateConfig.enabled_languages[i];
15
+ result[lang] = '';
16
+ }
17
+ var split_regex = /(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\])/gi;
18
+ var blocks = text.xsplit(split_regex);
19
+ //c('qtranxj_split: blocks='+blocks);
20
+ //c('qtranxj_split: blocks.length='+blocks.length);
21
+ if(!qtranxj_isArray(blocks))
22
+ return result;
23
+ if(blocks.length==1){//no language separator found, enter it to all languages
24
+ var b=blocks[0];
25
+ for(var j=0; j<qTranslateConfig.enabled_languages.length; ++j){
26
+ var lang=qTranslateConfig.enabled_languages[j];
27
+ result[lang] += b;
28
+ }
29
+ return result;
30
+ }
31
+ var clang_regex=/<!--:([a-z]{2})-->/gi;
32
+ var c_end_regex=/<!--:-->/g;
33
+ var blang_regex=/\[:([a-z]{2})\]/gi;
34
+ lang = false;
35
+ for(var i = 0;i<blocks.length;++i){
36
+ var b=blocks[i];
37
+ //c('blocks['+i+']='+b);
38
+ if(!b.length) continue;
39
+ matches = clang_regex.exec(b); clang_regex.lastIndex=0;
40
+ if(matches!=null){
41
+ lang = matches[1];
42
+ continue;
43
+ }
44
+ matches = c_end_regex.exec(b); c_end_regex.lastIndex=0;
45
+ if(matches!=null){
46
+ lang = false;
47
+ continue;
48
+ }
49
+ matches = blang_regex.exec(b); blang_regex.lastIndex=0;
50
+ if(matches!=null){
51
+ lang = matches[1];
52
+ continue;
53
+ }
54
+ if(!lang) continue;
55
+ result[lang] += b;
56
+ lang = false;
57
+ }
58
+ return result;
59
+ }
60
+
61
+ /*
62
qtranxj_split = function(text)
63
{
64
var result = new Object;
117
}
118
return result;
119
}
120
+ */
121
/*
122
qtranxj_split = function(text)
123
{
174
return result;
175
}
176
*/
177
+ qtranxj_allthesame = function(texts)
178
+ {
179
+ if(qTranslateConfig.enabled_languages.length==0) return '';
180
+ var text = '';
181
+ //take first not empty
182
+ for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
183
+ {
184
+ var lang=qTranslateConfig.enabled_languages[i];
185
+ var t = texts[lang];
186
+ if ( !t || t=='' ) continue;
187
+ text = t;
188
+ break;
189
+ }
190
+ for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
191
+ {
192
+ var lang=qTranslateConfig.enabled_languages[i];
193
+ var t = texts[lang];
194
+ if ( !t || t=='' ) continue;
195
+ if(t!=text) return null;
196
+ }
197
+ return text;
198
+ }
199
+
200
//"_c" stands for "comment"
201
qtranxj_join_c = function(texts)
202
{
203
+ var text = qtranxj_allthesame(texts);
204
+ if(text!=null) return text;
205
+ text='';
206
for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
207
{
208
var lang=qTranslateConfig.enabled_languages[i];
219
//"b" stands for "bracket"
220
qtranxj_join_b = function(texts)
221
{
222
+ var text = qtranxj_allthesame(texts);
223
+ if(text!=null) return text;
224
var text = '';
225
for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
226
{
qtranslate.min.js CHANGED
@@ -1 +1 @@
1
- function qtranxj_get_cookie(e){for(var n=document.cookie.split(";"),a=0;a<n.length;++a){var t=n[a],r=t.split("=");if(r[0].trim()==e&&!(n.length<2))return r[1].trim()}return""}function qtranxj_isArray(e){return e.constructor.toString().indexOf("Array")>=0}function qtranxj_ce(e,n,a,t){var r=document.createElement(e);if(n)for(prop in n)r[prop]=n[prop];return a&&(t&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r)),r}function LanguageSwitch(e,n){function a(){var e=this;if(!e.lang)return void alert("qTranslate-X: This should not have happened: Please, report this incident to the developers: !tabSwitch.lang");if(i!==e.lang){i&&l[i].classList.remove("active"),i=e.lang,e.classList.add("active");for(var n=0;n<s.length;++n)s[n].call(this)}}var t=qTranslateConfig.enabled_languages,r=qTranslateConfig.language_name,i=n,l={},s=[];location.pathname.indexOf();for(var o=0;o<t.length;++o){var g=qTranslateConfig.flag_location,u=t[o],f=qtranxj_ce("li",{lang:u,className:"qtranxs-lang-switch",onclick:a},e);qtranxj_ce("img",{src:g+qTranslateConfig.flag[u]},f),qtranxj_ce("span",{innerHTML:r[u]},f),l[u]=f,i==u&&f.classList.add("active")}this.getActiveLanguage=function(){return i},this.onSwitch=function(e){"function"==typeof e&&s.push(e)}}qtranxj_split=function(e){for(var n=new Object,a=0;a<qTranslateConfig.enabled_languages.length;++a){var t=qTranslateConfig.enabled_languages[a];n[t]=""}var r=/<!--:-->/gi,i=e.xsplit(r);if(!qtranxj_isArray(i))return n;var l,s,t;if(i.length>1){s=/<!--:([a-z]{2})-->/gi;for(var a=0;a<i.length;++a){var o=i[a];o.length&&(l=s.exec(o),s.lastIndex=0,null!=l&&(t=l[1],n[t]+=o.substring(o.indexOf("-->")+3)))}}else{var g=/(\[:[a-z]{2}\])/gi;if(i=e.xsplit(g),!qtranxj_isArray(i))return n;if(1==i.length)for(var o=i[0],u=0;u<qTranslateConfig.enabled_languages.length;++u){var t=qTranslateConfig.enabled_languages[u];n[t]+=o}else{s=/\[:([a-z]{2})\]/gi,t=!1;for(var a=0;a<i.length;++a){var o=i[a];if(t)n[t]+=o,t=!1;else{if(l=s.exec(o),s.lastIndex=0,null==l)continue;t=l[1]}}}}return n},qtranxj_join_c=function(e){for(var n="",a=0;a<qTranslateConfig.enabled_languages.length;++a){var t=qTranslateConfig.enabled_languages[a],r=e[t];r&&""!=r&&(n+="<!--:"+t+"-->",n+=r,n+="<!--:-->")}return n},qtranxj_join_b=function(e){for(var n="",a=0;a<qTranslateConfig.enabled_languages.length;++a){var t=qTranslateConfig.enabled_languages[a],r=e[t];r&&""!=r&&(n+="[:"+t+"]",n+=r)}return n},String.prototype.xsplit=function(e){if(3==="a~b".split(/(~)/).length)return this.split(e);e.global||(e=new RegExp(e.source,"g"+(e.ignoreCase?"i":"")));for(var n,a=0,t=[];null!=(n=e.exec(this));)t.push(this.slice(a,n.index)),n.length>1&&t.push(n[1]),a=e.lastIndex;return a<this.length&&t.push(this.slice(a)),a==this.length&&t.push(""),t};var qTranslateX=function(){function e(e){return document.getElementById(e)}function n(e,n){var a=g[e],t=languageSwitch.getActiveLanguage();a.contents[t]=n,a.mlContentField.value="<"===a.separator?qtranxj_join_c(a.contents):qtranxj_join_b(a.contents)}function a(e,a,t){if(e){var r=g[e.id]={};r.contentField=e,r.contents=qtranxj_split(e.value),r.mlContentField=qtranxj_ce("input",{name:e.name,className:"hidden",value:e.value},a,!0),t||(t="TEXTAREA"===e.tagName?"<":"["),r.separator=t,e.name+="_edit",e.value=r.contents[o],e.onblur=function(){n(this.id,this.value)}}}function t(e,n){a(e,n,"<")}function r(e,n){a(e,n,"[")}function i(){var n,a,t=!!e("tag-name");t?(n="tag-",a="addtag"):(n="",a="edittag");var r=e(n+"name"),i=e(a);if(!i||!r)return!1;var l=qTranslateConfig.language;build_translator=function(e,n){var a={};for(var t in qTranslateConfig.term_name){var r=qTranslateConfig.term_name[t],i=r[e],l=r[n];if(!i||!l){var s=r[qTranslateConfig.default_language];if(!s)continue;i||(i=s+"("+qTranslateConfig.default_language+")"),l||(l=s+"("+qTranslateConfig.default_language+")")}a[i]=l}return a};var s=e("the-list");hideQuickEdit=function(){if(s)for(var e=s.getElementsByTagName("TR"),n=0;n<e.length;n++)for(var a=e[n],t=a.getElementsByTagName("TD")[0],r=t.getElementsByClassName("inline"),i=0;i<r.length;++i){var l=r[i];l.style.display="none"}},hideQuickEdit(),updateNames=function(e,n){if(s)for(var a=s.getElementsByTagName("TR"),t=0;t<a.length;t++){for(var r,i=a[t],o=i.getElementsByTagName("TD")[0],g=o.getElementsByTagName("DIV"),u=0;u<g.length;u++){var f=g[u];if("name"===f.className){r=f.innerHTML;break}}if(l!=qTranslateConfig.default_language){var c=build_translator(l,qTranslateConfig.default_language);r=c[r]}for(var d=qTranslateConfig.term_name[r]||{},h=d[e]||"",v=d[n]||"",m=o.getElementsByClassName("row-title"),p=0;p<m.length;++p){var f=m[p];h?f.innerHTML=f.innerHTML.replace(h,v):f.innerHTML+=v}}};var g=document.getElementsByClassName("tagcloud")[0];updateTagCloud=function(e,n){if(g){var a=g.getElementsByTagName("A");if(a.length)for(var t=build_translator(e,n),r=0;r<a.length;++r){var i=a[r],l=i.innerHTML,s=t[l];s&&(i.innerHTML=s)}}},updateNamesAndTagCloud=function(e,n){updateNames(e,n),updateTagCloud(e,n)},l!==o&&updateNamesAndTagCloud(l,o);var u=qtranxj_ce("input",{name:r.name,className:"hidden",value:r.value},i,!0);r.name="";var f=qTranslateConfig.term_name[r.value]||{};o!==qTranslateConfig.default_language&&(r.value=f[o]||""),editinline_activated=function(){return!0};for(var c=document.getElementsByClassName("editinline"),d=0;d<c.length;++d){var h=c[d];"A"===h.tagName&&h.addEventListener("click",editinline_activated)}onTabSwitch=function(){o!==this.lang&&(r.value=f[this.lang]||"",updateNamesAndTagCloud(o,this.lang),o=this.lang)};for(var v=qTranslateConfig.enabled_languages,m={},d=0;d<v.length;++d){var p=v[d];m[p]=qtranxj_ce("input",{name:"qtranx_term_"+p,className:"hidden",value:name[p]||""},i,!0)}return r.onblur=function(){var e=languageSwitch.getActiveLanguage();m[e].value=this.value,f[e]=this.value,e===qTranslateConfig.default_language&&(u.value=this.value)},!0}function l(){function i(e,n){switch(qTranslateConfig.url_mode.toString()){case"1":e.search?e.search+="&lang="+n:e.search="?lang="+n;break;case"2":var a=qTranslateConfig.url_info_home,t=e.pathname.indexOf(a);e.pathname=a+n+e.pathname.substring(t+a.length-1);break;case"3":e.host=n+"."+e.host}}function l(n){if(!w){var a=e("view-post-btn");if(!a||!a.children.length)return;if(w=a.children[0],"A"!=w.tagName)return;b=w.href,E=qtranxj_ce("a",{})}E.href=b,i(E,n),w.href=E.href;var t=e("preview-action");if(t&&t.children.length&&(t.children[0].href=E.href),1!=qTranslateConfig.url_mode){if(!N){var r=e("sample-permalink");r&&r.childNodes.length&&(N=r.childNodes[0],y=N.nodeValue)}N&&(E.href=y,i(E,n),N.nodeValue=E.href)}}function s(e){var a=e.id;if(a){var t=g[a];t.mce||(t.mce=e,e.getBody().addEventListener("blur",function(){n(e.id,e.getContent())}))}}var u=e("post");if(!u)return!1;var f=e("title");f&&t(f,u);for(var c=u.getElementsByClassName("wp-editor-area"),d=0;d<c.length;++d){var h=c[d];t(h,u)}var v=e("attachment_caption");v&&t(v,u);for(var d=0;d<qTranslateConfig.custom_fields.length;++d){var m,p=qTranslateConfig.custom_fields[d];(0==p.indexOf("<")||0==p.indexOf("["))&&(m=p.substring(0,1),p=p.substring(1));var _=e(p);a(_,u,m)}for(var d=0;d<qTranslateConfig.custom_field_classes.length;++d){var m,T=qTranslateConfig.custom_field_classes[d];(0==T.indexOf("<")||0==T.indexOf("["))&&(m=T.substring(0,1),T=T.substring(1));for(var C=u.getElementsByClassName(T),q=0;q<C.length;++q)_=C[q],a(_,u,m)}var x=e("attachment_alt");x&&r(x,u);var w,b,E,N,y;return l(o),onTabSwitch=function(){for(var e in g){var n=g[e];n.contentField.value=n.contents[this.lang]}if(x&&(x.value=alttexts[this.lang]),l(this.lang),window.tinyMCE)for(var a=0;a<tinyMCE.editors.length;++a){var t=tinyMCE.editors[a],n=g[t.id];n&&t.setContent(n.contentField.value)}},window.addEventListener("load",function(){if(window.tinyMCE){for(var e=0;e<tinyMCE.editors.length;++e){var n=tinyMCE.editors[e];s(n)}for(var a in g){var t=g[a];t.mce||"TEXTAREA"===t.contentField.tagName&&(tinyMCEPreInit.mceInit[a].init_instance_callback=function(e){s(e)})}}}),!0}function s(){var n=document.getElementsByTagName("FORM");if(!n.length)return!1;var a=n[0];return r(e("blogname"),a),r(e("blogdescription"),a),onTabSwitch=function(){for(var e in g){var n=g[e];n.contentField.value=n.contents[this.lang]}},!0}var o=qtranxj_get_cookie("wp_qtrans_edit_language");o||(o=qTranslateConfig.language);var g={};setLangCookie=function(){document.cookie="wp_qtrans_edit_language="+this.lang};var u=location.pathname.match(/(\/wp-admin\/([^\/]*))#x2F;);switch(u&&u[1]){case"/wp-admin/post.php":case"/wp-admin/post-new.php":if(!l())return;break;case"/wp-admin/edit-tags.php":if(!i())return;break;case"/wp-admin/options-general.php":if(location.search.indexOf("page=")>=0)return;if(!s())return;break;default:return}var f=qtranxj_ce("ul",{className:"qtranxs-lang-switch-wrap"}),c=document.getElementsByClassName("wrap")[0],d=c.getElementsByTagName("form")[0];d.parentNode.insertBefore(f,d),languageSwitch=new LanguageSwitch(f,o),languageSwitch.onSwitch(onTabSwitch),languageSwitch.onSwitch(setLangCookie)};new qTranslateX;
1
+ function qtranxj_get_cookie(e){for(var a=document.cookie.split(";"),n=0;n<a.length;++n){var t=a[n],r=t.split("=");if(r[0].trim()==e&&!(a.length<2))return r[1].trim()}return""}function qtranxj_isArray(e){return e.constructor.toString().indexOf("Array")>=0}function qtranxj_ce(e,a,n,t){var r=document.createElement(e);if(a)for(prop in a)r[prop]=a[prop];return n&&(t&&n.firstChild?n.insertBefore(r,n.firstChild):n.appendChild(r)),r}function LanguageSwitch(e,a){function n(){var e=this;if(!e.lang)return void alert("qTranslate-X: This should not have happened: Please, report this incident to the developers: !tabSwitch.lang");if(i!==e.lang){i&&l[i].classList.remove("active"),i=e.lang,e.classList.add("active");for(var a=0;a<s.length;++a)s[a].call(this)}}var t=qTranslateConfig.enabled_languages,r=qTranslateConfig.language_name,i=a,l={},s=[];location.pathname.indexOf();for(var g=0;g<t.length;++g){var o=qTranslateConfig.flag_location,u=t[g],c=qtranxj_ce("li",{lang:u,className:"qtranxs-lang-switch",onclick:n},e);qtranxj_ce("img",{src:o+qTranslateConfig.flag[u]},c),qtranxj_ce("span",{innerHTML:r[u]},c),l[u]=c,i==u&&c.classList.add("active")}this.getActiveLanguage=function(){return i},this.onSwitch=function(e){"function"==typeof e&&s.push(e)}}qtranxj_split=function(e){for(var a=new Object,n=0;n<qTranslateConfig.enabled_languages.length;++n){var t=qTranslateConfig.enabled_languages[n];a[t]=""}var r=/(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\])/gi,i=e.xsplit(r);if(!qtranxj_isArray(i))return a;if(1==i.length){for(var l=i[0],s=0;s<qTranslateConfig.enabled_languages.length;++s){var t=qTranslateConfig.enabled_languages[s];a[t]+=l}return a}var g=/<!--:([a-z]{2})-->/gi,o=/<!--:-->/g,u=/\[:([a-z]{2})\]/gi;t=!1;for(var n=0;n<i.length;++n){var l=i[n];l.length&&(matches=g.exec(l),g.lastIndex=0,null==matches?(matches=o.exec(l),o.lastIndex=0,null==matches?(matches=u.exec(l),u.lastIndex=0,null==matches?t&&(a[t]+=l,t=!1):t=matches[1]):t=!1):t=matches[1])}return a},qtranxj_allthesame=function(e){if(0==qTranslateConfig.enabled_languages.length)return"";for(var a="",n=0;n<qTranslateConfig.enabled_languages.length;++n){var t=qTranslateConfig.enabled_languages[n],r=e[t];if(r&&""!=r){a=r;break}}for(var n=0;n<qTranslateConfig.enabled_languages.length;++n){var t=qTranslateConfig.enabled_languages[n],r=e[t];if(r&&""!=r&&r!=a)return null}return a},qtranxj_join_c=function(e){var a=qtranxj_allthesame(e);if(null!=a)return a;a="";for(var n=0;n<qTranslateConfig.enabled_languages.length;++n){var t=qTranslateConfig.enabled_languages[n],r=e[t];r&&""!=r&&(a+="<!--:"+t+"-->",a+=r,a+="<!--:-->")}return a},qtranxj_join_b=function(e){var a=qtranxj_allthesame(e);if(null!=a)return a;for(var a="",n=0;n<qTranslateConfig.enabled_languages.length;++n){var t=qTranslateConfig.enabled_languages[n],r=e[t];r&&""!=r&&(a+="[:"+t+"]",a+=r)}return a},String.prototype.xsplit=function(e){if(3==="a~b".split(/(~)/).length)return this.split(e);e.global||(e=new RegExp(e.source,"g"+(e.ignoreCase?"i":"")));for(var a,n=0,t=[];null!=(a=e.exec(this));)t.push(this.slice(n,a.index)),a.length>1&&t.push(a[1]),n=e.lastIndex;return n<this.length&&t.push(this.slice(n)),n==this.length&&t.push(""),t};var qTranslateX=function(){function e(e){return document.getElementById(e)}function a(e,a){var n=o[e],t=languageSwitch.getActiveLanguage();n.contents[t]=a,n.mlContentField.value="<"===n.separator?qtranxj_join_c(n.contents):qtranxj_join_b(n.contents)}function n(e,n,t){if(e){var r=o[e.id]={};r.contentField=e,r.contents=qtranxj_split(e.value),r.mlContentField=qtranxj_ce("input",{name:e.name,className:"hidden",value:e.value},n,!0),t||(t="TEXTAREA"===e.tagName?"<":"["),r.separator=t,e.name+="_edit",e.value=r.contents[g],e.onblur=function(){a(this.id,this.value)}}}function t(e,a){n(e,a,"<")}function r(e,a){n(e,a,"[")}function i(){var a,n,t=!!e("tag-name");t?(a="tag-",n="addtag"):(a="",n="edittag");var r=e(a+"name"),i=e(n);if(!i||!r)return!1;var l=qTranslateConfig.language;build_translator=function(e,a){var n={};for(var t in qTranslateConfig.term_name){var r=qTranslateConfig.term_name[t],i=r[e],l=r[a];if(!i||!l){var s=r[qTranslateConfig.default_language];if(!s)continue;i||(i=s+"("+qTranslateConfig.default_language+")"),l||(l=s+"("+qTranslateConfig.default_language+")")}n[i]=l}return n};var s=e("the-list");hideQuickEdit=function(){if(s)for(var e=s.getElementsByTagName("TR"),a=0;a<e.length;a++)for(var n=e[a],t=n.getElementsByTagName("TD")[0],r=t.getElementsByClassName("inline"),i=0;i<r.length;++i){var l=r[i];l.style.display="none"}},hideQuickEdit(),updateNames=function(e,a){if(s)for(var n=s.getElementsByTagName("TR"),t=0;t<n.length;t++){for(var r,i=n[t],g=i.getElementsByTagName("TD")[0],o=g.getElementsByTagName("DIV"),u=0;u<o.length;u++){var c=o[u];if("name"===c.className){r=c.innerHTML;break}}if(l!=qTranslateConfig.default_language){var f=build_translator(l,qTranslateConfig.default_language);r=f[r]}for(var d=qTranslateConfig.term_name[r]||{},h=d[e]||"",v=d[a]||"",m=g.getElementsByClassName("row-title"),_=0;_<m.length;++_){var c=m[_];h?c.innerHTML=c.innerHTML.replace(h,v):c.innerHTML+=v}}};var o=document.getElementsByClassName("tagcloud")[0];updateTagCloud=function(e,a){if(o){var n=o.getElementsByTagName("A");if(n.length)for(var t=build_translator(e,a),r=0;r<n.length;++r){var i=n[r],l=i.innerHTML,s=t[l];s&&(i.innerHTML=s)}}},updateNamesAndTagCloud=function(e,a){updateNames(e,a),updateTagCloud(e,a)},l!==g&&updateNamesAndTagCloud(l,g);var u=qtranxj_ce("input",{name:r.name,className:"hidden",value:r.value},i,!0);r.name="";var c=qTranslateConfig.term_name[r.value]||{};g!==qTranslateConfig.default_language&&(r.value=c[g]||""),editinline_activated=function(){return!0};for(var f=document.getElementsByClassName("editinline"),d=0;d<f.length;++d){var h=f[d];"A"===h.tagName&&h.addEventListener("click",editinline_activated)}onTabSwitch=function(){g!==this.lang&&(r.value=c[this.lang]||"",updateNamesAndTagCloud(g,this.lang),g=this.lang)};for(var v=qTranslateConfig.enabled_languages,m={},d=0;d<v.length;++d){var _=v[d];m[_]=qtranxj_ce("input",{name:"qtranx_term_"+_,className:"hidden",value:name[_]||""},i,!0)}return r.onblur=function(){var e=languageSwitch.getActiveLanguage();m[e].value=this.value,c[e]=this.value,e===qTranslateConfig.default_language&&(u.value=this.value)},!0}function l(){function i(e,a){switch(qTranslateConfig.url_mode.toString()){case"1":e.search?e.search+="&lang="+a:e.search="?lang="+a;break;case"2":var n=qTranslateConfig.url_info_home,t=e.pathname.indexOf(n);e.pathname=n+a+e.pathname.substring(t+n.length-1);break;case"3":e.host=a+"."+e.host}}function l(a){if(!x){var n=e("view-post-btn");if(!n||!n.children.length)return;if(x=n.children[0],"A"!=x.tagName)return;w=x.href,E=qtranxj_ce("a",{})}E.href=w,i(E,a),x.href=E.href;var t=e("preview-action");if(t&&t.children.length&&(t.children[0].href=E.href),1!=qTranslateConfig.url_mode){if(!N){var r=e("sample-permalink");r&&r.childNodes.length&&(N=r.childNodes[0],y=N.nodeValue)}N&&(E.href=y,i(E,a),N.nodeValue=E.href)}}function s(e){var n=e.id;if(n){var t=o[n];t.mce||(t.mce=e,e.getBody().addEventListener("blur",function(){a(e.id,e.getContent())}))}}var u=e("post");if(!u)return!1;var c=e("title");c&&t(c,u);for(var f=u.getElementsByClassName("wp-editor-area"),d=0;d<f.length;++d){var h=f[d];t(h,u)}var v=e("attachment_caption");v&&t(v,u);for(var d=0;d<qTranslateConfig.custom_fields.length;++d){var m,_=qTranslateConfig.custom_fields[d];(0==_.indexOf("<")||0==_.indexOf("["))&&(m=_.substring(0,1),_=_.substring(1));var p=e(_);n(p,u,m)}for(var d=0;d<qTranslateConfig.custom_field_classes.length;++d){var m,T=qTranslateConfig.custom_field_classes[d];(0==T.indexOf("<")||0==T.indexOf("["))&&(m=T.substring(0,1),T=T.substring(1));for(var q=u.getElementsByClassName(T),C=0;C<q.length;++C)p=q[C],n(p,u,m)}var b=e("attachment_alt");b&&r(b,u);var x,w,E,N,y;return l(g),onTabSwitch=function(){for(var e in o){var a=o[e];a.contentField.value=a.contents[this.lang]}if(b&&(b.value=alttexts[this.lang]),l(this.lang),window.tinyMCE)for(var n=0;n<tinyMCE.editors.length;++n){var t=tinyMCE.editors[n],a=o[t.id];a&&t.setContent(a.contentField.value)}},window.addEventListener("load",function(){if(window.tinyMCE){for(var e=0;e<tinyMCE.editors.length;++e){var a=tinyMCE.editors[e];s(a)}for(var n in o){var t=o[n];t.mce||"TEXTAREA"===t.contentField.tagName&&(tinyMCEPreInit.mceInit[n].init_instance_callback=function(e){s(e)})}}}),!0}function s(){var a=document.getElementsByTagName("FORM");if(!a.length)return!1;var n=a[0];return r(e("blogname"),n),r(e("blogdescription"),n),onTabSwitch=function(){for(var e in o){var a=o[e];a.contentField.value=a.contents[this.lang]}},!0}var g=qtranxj_get_cookie("wp_qtrans_edit_language");g||(g=qTranslateConfig.language);var o={};setLangCookie=function(){document.cookie="wp_qtrans_edit_language="+this.lang};var u=location.pathname.match(/(\/wp-admin\/([^\/]*))#x2F;);switch(u&&u[1]){case"/wp-admin/post.php":case"/wp-admin/post-new.php":if(!l())return;break;case"/wp-admin/edit-tags.php":if(!i())return;break;case"/wp-admin/options-general.php":if(location.search.indexOf("page=")>=0)return;if(!s())return;break;default:return}var c=qtranxj_ce("ul",{className:"qtranxs-lang-switch-wrap"}),f=document.getElementsByClassName("wrap")[0],d=f.getElementsByTagName("form")[0];d.parentNode.insertBefore(c,d),languageSwitch=new LanguageSwitch(c,g),languageSwitch.onSwitch(onTabSwitch),languageSwitch.onSwitch(setLangCookie)};new qTranslateX;
qtranslate.php CHANGED
@@ -3,7 +3,7 @@
3
Plugin Name: qTranslate-X
4
Plugin URI: http://wordpress.org/plugins/qtranslate-x/
5
Description: Adds user-friendly and database-friendly multilingual content support into WordPress.
6
- Version: 2.9.4
7
Author: John Clause based on original code by Qian Qin
8
Author URI: http://qtranslatexteam.wordpress.com/about
9
Tags: multilingual, multi, language, admin, tinymce, Polyglot, bilingual, widget, switcher, professional, human, translation, service, qTranslate, zTranslate, mqTranslate, qTranslate Plus, WPML
@@ -101,10 +101,11 @@ if ( ! defined( 'QTRANSLATE_FILE' ) ) {
101
define( 'QTRANSLATE_FILE', __FILE__ );
102
}
103
104
/* DEFAULT CONFIGURATION PART BEGINS HERE */
105
106
/* There is no need to edit anything here! */
107
-
108
define('QTX_STRING', 1);
109
define('QTX_BOOLEAN', 2);
110
define('QTX_INTEGER', 3);
3
Plugin Name: qTranslate-X
4
Plugin URI: http://wordpress.org/plugins/qtranslate-x/
5
Description: Adds user-friendly and database-friendly multilingual content support into WordPress.
6
+ Version: 2.9.5
7
Author: John Clause based on original code by Qian Qin
8
Author URI: http://qtranslatexteam.wordpress.com/about
9
Tags: multilingual, multi, language, admin, tinymce, Polyglot, bilingual, widget, switcher, professional, human, translation, service, qTranslate, zTranslate, mqTranslate, qTranslate Plus, WPML
101
define( 'QTRANSLATE_FILE', __FILE__ );
102
}
103
104
+ define('QTX_VERSION','2.9.5');
105
+
106
/* DEFAULT CONFIGURATION PART BEGINS HERE */
107
108
/* There is no need to edit anything here! */
109
define('QTX_STRING', 1);
110
define('QTX_BOOLEAN', 2);
111
define('QTX_INTEGER', 3);
qtranslate_configuration.php CHANGED
@@ -59,7 +59,7 @@ add_action('qtranxf_init_begin','qtranxf_reset_config');
59
function qtranxf_add_admin_js () {
60
global $q_config;
61
//wp_register_script( 'qtranslate-script', plugins_url( '/qtranslate.js', __FILE__ ) );
62
- wp_register_script( 'qtranslate-script', plugins_url( '/qtranslate.min.js', __FILE__ ) );
63
wp_enqueue_script( 'qtranslate-script' );
64
65
wp_dequeue_script('autosave');
@@ -359,15 +359,17 @@ function qtranxf_array_compare($a,$b) {
359
return empty($diff_a) && empty($diff_b);
360
}
361
362
function qtranxf_language_columns($columns) {
363
return array(
364
- 'flag' => 'Flag',
365
'name' => __('Name', 'qtranslate'),
366
'status' => __('Action', 'qtranslate'),
367
'status2' => '',
368
'status3' => ''
369
);
370
}
371
372
function qtranxf_useAdminTermLib($obj) {
373
if ($_SERVER["SCRIPT_NAME"]==="/wp-admin/edit-tags.php" &&
@@ -964,6 +966,20 @@ function qtranxf_add_language_menu( $wp_admin_bar )
964
}
965
}
966
967
add_filter('get_term', 'qtranxf_useAdminTermLib',0);
968
add_filter('get_terms', 'qtranxf_useAdminTermLib',0);
969
59
function qtranxf_add_admin_js () {
60
global $q_config;
61
//wp_register_script( 'qtranslate-script', plugins_url( '/qtranslate.js', __FILE__ ) );
62
+ wp_register_script( 'qtranslate-script', plugins_url( '/qtranslate.min.js', __FILE__ ), array(), QTX_VERSION );
63
wp_enqueue_script( 'qtranslate-script' );
64
65
wp_dequeue_script('autosave');
359
return empty($diff_a) && empty($diff_b);
360
}
361
362
+ //this is not in use?
363
function qtranxf_language_columns($columns) {
364
return array(
365
+ 'flag' => __('Flag', 'qtranslate'),
366
'name' => __('Name', 'qtranslate'),
367
'status' => __('Action', 'qtranslate'),
368
'status2' => '',
369
'status3' => ''
370
);
371
}
372
+ //add_filter('manage_language_columns', 'qtranxf_language_columns');
373
374
function qtranxf_useAdminTermLib($obj) {
375
if ($_SERVER["SCRIPT_NAME"]==="/wp-admin/edit-tags.php" &&
966
}
967
}
968
969
+ function qtranxf_links($links, $file){ // copied from Sociable Plugin
970
+ //Static so we don't call plugin_basename on every plugin row.
971
+ static $this_plugin;
972
+ if (!$this_plugin) $this_plugin = plugin_basename(dirname(__FILE__).'/qtranslate.php');
973
+
974
+ if ($file == $this_plugin){
975
+ $settings_link = '<a href="options-general.php?page=qtranslate-x">' . __('Settings', 'qtranslate') . '</a>';
976
+ array_unshift( $links, $settings_link ); // before other links
977
+ }
978
+ return $links;
979
+ }
980
+ add_filter('plugin_action_links', 'qtranxf_links', 10, 2);
981
+
982
+
983
add_filter('get_term', 'qtranxf_useAdminTermLib',0);
984
add_filter('get_terms', 'qtranxf_useAdminTermLib',0);
985
qtranslate_core.php CHANGED
@@ -913,18 +913,18 @@ function qtranxf_convertURL($url='', $lang='', $forceadmin = false, $showDefault
913
}
914
}
915
916
- // splits text with language tags into array
917
function qtranxf_split($text, $quicktags = true) {
918
global $q_config;
919
-
920
//init vars
921
$split_regex = "#(<!--[^-]*-->|\[:[a-z]{2}\])#ism";
922
$current_language = "";
923
$result = array();
924
foreach($q_config['enabled_languages'] as $language) {
925
$result[$language] = "";
926
}
927
-
928
// split text at all xml comments
929
$blocks = preg_split($split_regex, $text, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
930
foreach($blocks as $block) {
@@ -949,11 +949,11 @@ function qtranxf_split($text, $quicktags = true) {
949
$current_language = "";
950
continue;
951
// detect defective more tag
952
- } elseif(preg_match("#^<!--more-->$#ism", $block, $matches)) {
953
- foreach($q_config['enabled_languages'] as $language) {
954
- $result[$language] .= $block;
955
- }
956
- continue;
957
}
958
// correctly categorize text block
959
if($current_language == "") {
@@ -966,11 +966,56 @@ function qtranxf_split($text, $quicktags = true) {
966
$result[$current_language] .= $block;
967
}
968
}
969
- foreach($result as $lang => $lang_content) {
970
- $result[$lang] = preg_replace("#(<!--more-->|<!--nextpage-->)+$#ism","",$lang_content);
971
}
972
return $result;
973
}
974
975
function qtranxf_join($texts) {
976
global $q_config;
913
}
914
}
915
916
+ /*
917
function qtranxf_split($text, $quicktags = true) {
918
global $q_config;
919
//init vars
920
$split_regex = "#(<!--[^-]*-->|\[:[a-z]{2}\])#ism";
921
+ //$split_regex = "#(<!--:[[a-z]{2}]?-->|\[:[a-z]{2}\])#ism";
922
$current_language = "";
923
$result = array();
924
foreach($q_config['enabled_languages'] as $language) {
925
$result[$language] = "";
926
}
927
+
928
// split text at all xml comments
929
$blocks = preg_split($split_regex, $text, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
930
foreach($blocks as $block) {
949
$current_language = "";
950
continue;
951
// detect defective more tag
952
+ //} elseif(preg_match("#^<!--more-->$#ism", $block, $matches)) {
953
+ // foreach($q_config['enabled_languages'] as $language) {
954
+ // $result[$language] .= $block;
955
+ // }
956
+ // continue;
957
}
958
// correctly categorize text block
959
if($current_language == "") {
966
$result[$current_language] .= $block;
967
}
968
}
969
+ //foreach($result as $lang => $lang_content) {
970
+ // $result[$lang] = preg_replace("#(<!--more-->|<!--nextpage-->)+$#ism","",$lang_content);
971
+ //}
972
+ return $result;
973
+ }// */
974
+
975
+ if (!function_exists('qtranxf_split')){
976
+ function qtranxf_split($text, $quicktags = true) {
977
+ global $q_config;
978
+ //$split_regex = "#(<!--[^-]*-->|\[:[a-z]{2}\])#ism";
979
+ $split_regex = "#(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\])#ism";
980
+ $result = array();
981
+ foreach($q_config['enabled_languages'] as $language) {
982
+ $result[$language] = '';
983
+ }
984
+ // split text at all language comments and quick tags
985
+ $blocks = preg_split($split_regex, $text, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
986
+ if(count($blocks)==1){
987
+ $block=$blocks[0];
988
+ //no languages, put it in all languages then
989
+ foreach($q_config['enabled_languages'] as $language) {
990
+ $result[$language] = $block;
991
+ }
992
+ }else{
993
+ $current_language = false;
994
+ foreach($blocks as $block) {
995
+ # detect language tags
996
+ if(preg_match("#^<!--:([a-z]{2})-->$#ism", $block, $matches)) {
997
+ $current_language = $matches[1];
998
+ if(!qtranxf_isEnabled($current_language)) $current_language = false;
999
+ continue;
1000
+ // detect quicktags
1001
+ } elseif($quicktags && preg_match("#^\[:([a-z]{2})\]$#ism", $block, $matches)) {
1002
+ $current_language = $matches[1];
1003
+ if(!qtranxf_isEnabled($current_language)) $current_language = false;
1004
+ continue;
1005
+ // detect ending tags
1006
+ } elseif(preg_match("#^<!--:-->$#ism", $block, $matches)) {
1007
+ $current_language = false;
1008
+ continue;
1009
+ }
1010
+ // correctly categorize text block
1011
+ if(!$current_language) continue;
1012
+ $result[$current_language] .= $block;
1013
+ $current_language = false;
1014
+ }
1015
}
1016
return $result;
1017
}
1018
+ }
1019
1020
function qtranxf_join($texts) {
1021
global $q_config;
qtranslate_hooks.php CHANGED
@@ -73,18 +73,6 @@ function qtranxf_excludePages($pages) {
73
return array_merge($exclude, $pages);
74
}
75
76
- function qtranxf_links($links, $file){ // copied from Sociable Plugin
77
- //Static so we don't call plugin_basename on every plugin row.
78
- static $this_plugin;
79
- if (!$this_plugin) $this_plugin = plugin_basename(dirname(__FILE__).'/qtranslate.php');
80
-
81
- if ($file == $this_plugin){
82
- $settings_link = '<a href="options-general.php?page=qtranslate-x">' . __('Settings', 'qtranslate') . '</a>';
83
- array_unshift( $links, $settings_link ); // before other links
84
- }
85
- return $links;
86
- }
87
-
88
function qtranxf_languageColumnHeader($columns){
89
$new_columns = array();
90
if(isset($columns['cb'])) $new_columns['cb'] = '';
@@ -286,8 +274,6 @@ add_filter('comment_notification_subject', 'qtranxf_useCurrentLanguageIfNotFound
286
// add_filter('the_editor', 'qtranxf_modifyRichEditor');
287
//add_filter('admin_footer', 'qtranxf_modifyExcerpt');
288
add_filter('bloginfo_url', 'qtranxf_convertBlogInfoURL',10,2);
289
- add_filter('plugin_action_links', 'qtranxf_links', 10, 2);
290
- add_filter('manage_language_columns', 'qtranxf_language_columns');
291
add_filter('core_version_check_locale', 'qtranxf_versionLocale');
292
add_filter('redirect_canonical', 'qtranxf_checkCanonical', 10, 2);
293
?>
73
return array_merge($exclude, $pages);
74
}
75
76
function qtranxf_languageColumnHeader($columns){
77
$new_columns = array();
78
if(isset($columns['cb'])) $new_columns['cb'] = '';
274
// add_filter('the_editor', 'qtranxf_modifyRichEditor');
275
//add_filter('admin_footer', 'qtranxf_modifyExcerpt');
276
add_filter('bloginfo_url', 'qtranxf_convertBlogInfoURL',10,2);
277
add_filter('core_version_check_locale', 'qtranxf_versionLocale');
278
add_filter('redirect_canonical', 'qtranxf_checkCanonical', 10, 2);
279
?>
qtranslate_utils.php CHANGED
@@ -127,7 +127,7 @@ function qtranxf_startsWith($s, $n) {
127
function qtranxf_getAvailableLanguages($text) {
128
global $q_config;
129
$result = array();
130
- $content = qtranxf_split($text);
131
foreach($content as $language => $lang_text) {
132
$lang_text = trim($lang_text);
133
if(!empty($lang_text)) $result[] = $language;
127
function qtranxf_getAvailableLanguages($text) {
128
global $q_config;
129
$result = array();
130
+ $content = qtranxf_split($text);
131
foreach($content as $language => $lang_text) {
132
$lang_text = trim($lang_text);
133
if(!empty($lang_text)) $result[] = $language;
readme.txt CHANGED
@@ -4,7 +4,7 @@ Contributors: johnclause, chineseleper, Vavooon
4
Tags: multilingual, language, admin, tinymce, bilingual, widget, switcher, i18n, l10n, multilanguage, translation
5
Requires at least: 3.9
6
Tested up to: 4.1
7
- Stable tag: 2.9.4
8
License: GPLv3 or later
9
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QEXEK3HX8AR6U
10
License URI: http://www.gnu.org/licenses/gpl-3.0.html
@@ -28,9 +28,10 @@ qTranslate-X makes creation of multilingual content as easy as working with a si
28
- Choose one of 3 Modes to make your URLs look pretty and SEO-friendly. - The simple and beautiful `/en/foo/`, or nice and neat `en.yoursite.com`, and everywhere compatible `?lang=en`.
29
- One language for each URL - Users and SEO will thank you for not mixing multilingual content.
30
- qTranslate-X supports unlimited number of languages, which can be easily added/modified/deleted via a comfortable Configuration Page at Settings->Languages.
31
- - You may use [Google XML Sitemaps v3 for qTranslate](https://wordpress.org/plugins/google-xml-sitemaps-v3-for-qtranslate/) plugin to rebuild your XML sitemap for better SEO support.
32
- Custom CSS for "qTranslate Language Chooser" widget configurable via its properties.
33
- Menu item "Language Switcher" to enable language choosing from a menu.
34
35
You may still find a lot of useful information through reading [qTranslate](https://wordpress.org/plugins/qtranslate/ "Original qTranslate plugin")'s original documentation, which is not duplicated here in full. There are also other plugins, which offer multilingual support, but it seems that Qian Qin has very good original back-end design, and many people have been pleasantly using his plugin ever since. It stores all translations in the same single post, which makes it easy to maintain and to use it with other plugins. However, the user interface of former qTranslate got out of sync with the recent versions of Wordpress, especially after WP went to TinyMCE 4. There is a number of forks of qTranslate, see for example, [mqTranslate](https://wordpress.org/plugins/mqtranslate/ "mqTranslate plugin"), [qTranslate Plus](https://wordpress.org/plugins/qtranslate-xp/ "qTranslate Plus plugin") and [zTranslate](https://wordpress.org/plugins/ztranslate/ "zTranslate plugin"). They all try to fix qTranslate's user interface preserving its original back-end, which is what this plugin does too. This plugin is a hybrid of all of them and fixes a few bugs in each of them. It also has many new features too, like theme custom translatable fields, for example. We hope that this plugin is the most complete working version which combines the best features of [qTranslate](https://wordpress.org/plugins/qtranslate/ "Original qTranslate plugin"), [mqTranslate](https://wordpress.org/plugins/mqtranslate/ "mqTranslate fork"), [qTranslate Plus](https://wordpress.org/plugins/qtranslate-xp/ "qTranslate Plus fork") and [zTranslate](https://wordpress.org/plugins/ztranslate/ "zTranslate fork").
36
@@ -104,6 +105,14 @@ The following query options can be typed in the field "URL" of "Language Menu" c
104
105
We understand that this is not a very user-friendly way to adjust the options, but it works, and we will provide a better in-editor interface to specify them in the future.
106
107
= How do I customize images for flags? =
108
109
If you wish to use different flag images, point option "Flag Image Path" to your own folder, containing custom images outside of "plugins" or "themes" folders. Most people would put it somewhere under "uploads" folder.
@@ -141,6 +150,9 @@ One can find the original qTranslate FAQ [here](https://wordpress.org/plugins/qt
141
142
== Changelog ==
143
144
= 2.9.4 =
145
* fix for https://wordpress.org/support/topic/comment-shows-404-error
146
4
Tags: multilingual, language, admin, tinymce, bilingual, widget, switcher, i18n, l10n, multilanguage, translation
5
Requires at least: 3.9
6
Tested up to: 4.1
7
+ Stable tag: 2.9.5
8
License: GPLv3 or later
9
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QEXEK3HX8AR6U
10
License URI: http://www.gnu.org/licenses/gpl-3.0.html
28
- Choose one of 3 Modes to make your URLs look pretty and SEO-friendly. - The simple and beautiful `/en/foo/`, or nice and neat `en.yoursite.com`, and everywhere compatible `?lang=en`.
29
- One language for each URL - Users and SEO will thank you for not mixing multilingual content.
30
- qTranslate-X supports unlimited number of languages, which can be easily added/modified/deleted via a comfortable Configuration Page at Settings->Languages.
31
- Custom CSS for "qTranslate Language Chooser" widget configurable via its properties.
32
- Menu item "Language Switcher" to enable language choosing from a menu.
33
+ - Use [Google XML Sitemaps v3 for qTranslate](https://wordpress.org/plugins/google-xml-sitemaps-v3-for-qtranslate/) plugin to rebuild your XML sitemap for better SEO support.
34
+ - Use plugin [Qtranslate Slug](https://wordpress.org/plugins/qtranslate-slug/) if you need to translate slugs.
35
36
You may still find a lot of useful information through reading [qTranslate](https://wordpress.org/plugins/qtranslate/ "Original qTranslate plugin")'s original documentation, which is not duplicated here in full. There are also other plugins, which offer multilingual support, but it seems that Qian Qin has very good original back-end design, and many people have been pleasantly using his plugin ever since. It stores all translations in the same single post, which makes it easy to maintain and to use it with other plugins. However, the user interface of former qTranslate got out of sync with the recent versions of Wordpress, especially after WP went to TinyMCE 4. There is a number of forks of qTranslate, see for example, [mqTranslate](https://wordpress.org/plugins/mqtranslate/ "mqTranslate plugin"), [qTranslate Plus](https://wordpress.org/plugins/qtranslate-xp/ "qTranslate Plus plugin") and [zTranslate](https://wordpress.org/plugins/ztranslate/ "zTranslate plugin"). They all try to fix qTranslate's user interface preserving its original back-end, which is what this plugin does too. This plugin is a hybrid of all of them and fixes a few bugs in each of them. It also has many new features too, like theme custom translatable fields, for example. We hope that this plugin is the most complete working version which combines the best features of [qTranslate](https://wordpress.org/plugins/qtranslate/ "Original qTranslate plugin"), [mqTranslate](https://wordpress.org/plugins/mqtranslate/ "mqTranslate fork"), [qTranslate Plus](https://wordpress.org/plugins/qtranslate-xp/ "qTranslate Plus fork") and [zTranslate](https://wordpress.org/plugins/ztranslate/ "zTranslate fork").
37
105
106
We understand that this is not a very user-friendly way to adjust the options, but it works, and we will provide a better in-editor interface to specify them in the future.
107
108
+ = Can I translate slugs? =
109
+
110
+ Use plugin [Qtranslate Slug](https://wordpress.org/plugins/qtranslate-slug/).
111
+
112
+ = Can I build Google XML Sitemap, including pages with all different languages? =
113
+
114
+ Use plugin [Google XML Sitemaps v3 for qTranslate](https://wordpress.org/plugins/google-xml-sitemaps-v3-for-qtranslate/)
115
+
116
= How do I customize images for flags? =
117
118
If you wish to use different flag images, point option "Flag Image Path" to your own folder, containing custom images outside of "plugins" or "themes" folders. Most people would put it somewhere under "uploads" folder.
150
151
== Changelog ==
152
153
+ = 2.9.5 =
154
+ * more fixes for <!--more--> and <!--nextpage--> tags.
155
+
156
= 2.9.4 =
157
* fix for https://wordpress.org/support/topic/comment-shows-404-error
158