diff --git a/application/config/internal.php b/application/config/internal.php index d401193a054..43f26e72905 100644 --- a/application/config/internal.php +++ b/application/config/internal.php @@ -275,6 +275,7 @@ 'checkPermission' => 'LS_Twig_Extension::checkPermission',/* Not in 3.X */ 'getAllQuestionClasses' => 'LS_Twig_Extension::getAllQuestionClasses', 'getLanguageNameFromCode' => 'getLanguageNameFromCode',/* Not in 3.X */ + 'getLanguageRTL' => 'LS_Twig_Extension::getLanguageRTL', 'intval' => 'intval', 'empty' => 'empty', @@ -360,6 +361,7 @@ ), 'functions' => array( 'getLanguageData', + 'getLanguageRTL', 'array_flip', 'array_intersect_key', diff --git a/application/controllers/admin/htmleditor_pop.php b/application/controllers/admin/htmleditor_pop.php index b7235722694..e84f6a8e04f 100644 --- a/application/controllers/admin/htmleditor_pop.php +++ b/application/controllers/admin/htmleditor_pop.php @@ -37,6 +37,7 @@ public function index() $aData['sControlIdDis'] = $aData['sFieldName'] . '_popupctrldis'; $aData['toolbarname'] = 'popup'; $aData['htmlformatoption'] = ''; + $aData['contentsLangDirection'] = sanitize_xss_string(App()->request->getQuery('contdir')); if (in_array($aData['sFieldType'], array('email-invitation', 'email-registration', 'email-confirmation', 'email-reminder'))) { $aData['htmlformatoption'] = ',fullPage:true'; } diff --git a/application/core/LS_Twig_Extension.php b/application/core/LS_Twig_Extension.php index bc82d0a2b51..4cba2eab7d2 100644 --- a/application/core/LS_Twig_Extension.php +++ b/application/core/LS_Twig_Extension.php @@ -676,4 +676,13 @@ public static function getAllTokenAnswers($iSurveyID) return $aResponses; } + + /** + * Returns true if the language uses RTL writing system. + */ + public static function getLanguageRTL($sLanguageCode) + { + Yii::app()->loadHelper('surveytranslator'); + return getLanguageRTL($sLanguageCode); + } } diff --git a/application/helpers/admin/htmleditor_helper.php b/application/helpers/admin/htmleditor_helper.php index 57f3c47bf55..51f32bab325 100644 --- a/application/helpers/admin/htmleditor_helper.php +++ b/application/helpers/admin/htmleditor_helper.php @@ -288,18 +288,26 @@ function getInlineEditor($fieldtype, $fieldname, $fieldtext, $surveyID = null, $ $('#" . $fieldname . "').before('$loaderHTML'); - $oCKeditorVarName = CKEDITOR.replace('$fieldname', { - LimeReplacementFieldsType : \"" . $fieldtype . "\" - ,LimeReplacementFieldsSID : \"" . $surveyID . "\" - ,LimeReplacementFieldsGID : \"" . $gID . "\" - ,LimeReplacementFieldsQID : \"" . $qID . "\" - ,LimeReplacementFieldsAction : \"" . $action . "\" - ,LimeReplacementFieldsPath : \"" . Yii::app()->getController()->createUrl("limereplacementfields/index") . "\" - ,language:'" . sTranslateLangCode2CK(Yii::app()->session['adminlang']) . "'" - . $sFileBrowserAvailable - . $htmlformatoption - . $toolbaroption - . "}); + var ckeConfig = { + LimeReplacementFieldsType : \"" . $fieldtype . "\" + ,LimeReplacementFieldsSID : \"" . $surveyID . "\" + ,LimeReplacementFieldsGID : \"" . $gID . "\" + ,LimeReplacementFieldsQID : \"" . $qID . "\" + ,LimeReplacementFieldsAction : \"" . $action . "\" + ,LimeReplacementFieldsPath : \"" . Yii::app()->getController()->createUrl("limereplacementfields/index") . "\" + ,language:'" . sTranslateLangCode2CK(Yii::app()->session['adminlang']) . "'" + . $sFileBrowserAvailable + . $htmlformatoption + . $toolbaroption + . "}; + + // Override language direction if 'data-contents-dir' attribute is set in the target field + if ($('#" . $fieldname . "').get(0).hasAttribute('data-contents-dir')) { + var inputLangDirection = $('#" . $fieldname . "').attr('data-contents-dir'); + ckeConfig.contentsLangDirection = inputLangDirection ? inputLangDirection : ''; + } + + $oCKeditorVarName = CKEDITOR.replace('$fieldname', ckeConfig); \$('#$fieldname').parents('ul:eq(0)').addClass('editor-parent'); }"; diff --git a/application/views/admin/htmleditor/pop_editor_view.php b/application/views/admin/htmleditor/pop_editor_view.php index 67207e4e7e0..04b027201a3 100644 --- a/application/views/admin/htmleditor/pop_editor_view.php +++ b/application/views/admin/htmleditor/pop_editor_view.php @@ -41,6 +41,7 @@ function closeme() */ if($('textarea').length > 0){ CKEDITOR.on('instanceReady',CKeditor_OnComplete); + var oCKeditor = CKEDITOR.replace( 'MyTextarea' , { height : '350', width : '98%', toolbarStartupExpanded : true, @@ -53,6 +54,7 @@ function closeme() LimeReplacementFieldsAction: "", LimeReplacementFieldsPath : "createUrl("/limereplacementfields/index"); ?>", language : "" + }); } }); diff --git a/application/views/admin/survey/prepareEditorScript_view.php b/application/views/admin/survey/prepareEditorScript_view.php index 78cb34eb624..e9a95db2b53 100644 --- a/application/views/admin/survey/prepareEditorScript_view.php +++ b/application/views/admin/survey/prepareEditorScript_view.php @@ -60,10 +60,19 @@ function start_popup_editor(fieldname, fieldtext, sid, gid, qid, fieldtype, acti if (activepopup == null) { - document.getElementById(fieldname).readOnly=true; + var targetField = document.getElementById(fieldname); + targetField.readOnly=true; document.getElementById(controlidena).style.display='none'; document.getElementById(controliddis).style.display=''; - popup = window.open('".$this->createUrl('admin/htmleditor_pop/sa/index')."/name/'+fieldname+'/text/'+fieldtext+'/type/'+fieldtype+'/action/'+action+'/sid/'+sid+'/gid/'+gid+'/qid/'+qid+'/lang/".App()->language."','', 'location=no, status=yes, scrollbars=auto, menubar=no, resizable=yes, width=690, height=500'); + var editorurl = '".$this->createUrl('admin/htmleditor_pop/sa/index')."/name/'+fieldname+'/text/'+fieldtext+'/type/'+fieldtype+'/action/'+action+'/sid/'+sid+'/gid/'+gid+'/qid/'+qid+'/lang/".App()->language."'; + + // Override language direction if 'data-contents-dir' attribute is set in the target field + if (targetField.hasAttribute('data-contents-dir')) { + var inputLangDirection = targetField.getAttribute('data-contents-dir'); + editorurl = editorurl + '/contdir/' + (inputLangDirection ? inputLangDirection : ''); + } + + popup = window.open(editorurl,'', 'location=no, status=yes, scrollbars=auto, menubar=no, resizable=yes, width=690, height=500'); editorwindowsHash[fieldname] = popup; } diff --git a/application/views/questionAdministration/answerOptionRow.twig b/application/views/questionAdministration/answerOptionRow.twig index 1a8b97a5d9a..fe452009911 100644 --- a/application/views/questionAdministration/answerOptionRow.twig +++ b/application/views/questionAdministration/answerOptionRow.twig @@ -115,6 +115,7 @@ id='answeroptions[{{ answerOption.aid }}][{{ scale_id }}][answeroptionl10n][{{ language }}]' name='answeroptions[{{ answerOption.aid }}][{{ scale_id }}][answeroptionl10n][{{ language }}]' placeholder='{{ gT("Some example answer option") }}' + data-contents-dir="{{ getLanguageRTL(language) ? 'rtl' : 'ltr' }}" value="{{ answerOptionl10n.answer|escape('html_attr') }}" /> diff --git a/application/views/questionAdministration/subquestionRow.twig b/application/views/questionAdministration/subquestionRow.twig index 4ca3dc1c03d..39c6cc75293 100644 --- a/application/views/questionAdministration/subquestionRow.twig +++ b/application/views/questionAdministration/subquestionRow.twig @@ -112,6 +112,7 @@ name='subquestions[{{ subquestion.qid }}][{{ scale_id }}][subquestionl10n][{{ language }}]' placeholder='{{ gT("Some example subquestion","js") }}' value="{{ subquestionl10n.question|escape('html_attr') }}" + data-contents-dir="{{ getLanguageRTL(language) ? 'rtl' : 'ltr' }}" onkeypress=" if(event.keyCode==13) { if (event && event.preventDefault) event.preventDefault(); document.getElementById('save-button').click(); return false;}" /> diff --git a/application/views/questionAdministration/textElements.php b/application/views/questionAdministration/textElements.php index e529f527b24..e09af38c07f 100644 --- a/application/views/questionAdministration/textElements.php +++ b/application/views/questionAdministration/textElements.php @@ -16,7 +16,13 @@ questionl10ns[$lang]->question ?? '', - array('class'=>'form-control','cols'=>'60','rows'=>'8','id'=>"question_{$lang}") + [ + 'class' => 'form-control', + 'cols' => '60', + 'rows' => '8', + 'id' => "question_{$lang}", + 'data-contents-dir' => getLanguageRTL($lang) ? 'rtl' : 'ltr' + ] ); ?> questionl10ns[$lang]->help ?? '', - array('class'=>'form-control','cols'=>'60','rows'=>'4','id'=>"help_{$lang}") + [ + 'class' => 'form-control', + 'cols' => '60', + 'rows' => '4', + 'id' => "help_{$lang}", + 'data-contents-dir' => getLanguageRTL($lang) ? 'rtl' : 'ltr' + ] ); ?>