Attached Files |
improved_translation_interface_part1_core.patch [^] (112,884 bytes) 2012-10-17 05:48
[Show Content]
Index: admin/system_presets/simple/email_events_emailevents.php
===================================================================
--- admin/system_presets/simple/email_events_emailevents.php (revision 15581)
+++ admin/system_presets/simple/email_events_emailevents.php (working copy)
@@ -18,7 +18,7 @@
'email_message_list' => Array (/*'new_item', 'edit', 'delete', 'approve', 'decline', 'frontend_mail', 'view',*/ 'export', /*'dbl-click'*/),
// edit email edit - general tab
-// 'email_message_edit' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'email_message_edit' => Array (/*'select',*/ 'setprimary', /*'cancel', 'reset_edit', 'prev', 'next'*/),
// edit email edit - settings tab
// 'email_message_edit_settings' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
@@ -35,7 +35,7 @@
// virtual fields to hide
$virtual_hidden_fields = Array (
/*'RecipientType', 'RecipientName', 'RecipientAddressType',
- 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/
+ 'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/ 'TranslationInSync', 'TranslateFromLanguage'
);
// fields to make required
@@ -52,6 +52,10 @@
'RecipientAddress', 'Tag', 'Replacement', 'ReplacementTagsXML',*/
);
+ $debug_only_virtual_fields = Array (
+ 'SourceSubject', 'SourceHtmlBody', 'SourcePlainTextBody',
+ );
+
// tabs during editing
$hide_edit_tabs = Array (
'Default' => Array (/*'general',*/ 'settings'),
@@ -60,5 +64,5 @@
// hide columns in grids
$hide_columns = Array (
// 'Default' => Array ('EventId', 'Description', 'Event', 'Module', 'Type', 'Enabled', 'LastChanged'),
-// 'Emails' => Array ('EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged'),
+ 'Emails' => Array (/*'EventId', 'Event', 'Subject', 'Description', 'Type', 'Enabled', 'Module', 'FrontEndOnly', 'LastChanged',*/ 'TranslationInSync', 'TranslateFromLanguage'),
);
\ No newline at end of file
Index: admin/system_presets/simple/phrases_phrases.php
===================================================================
--- admin/system_presets/simple/phrases_phrases.php (revision 15581)
+++ admin/system_presets/simple/phrases_phrases.php (working copy)
@@ -20,7 +20,7 @@
'phrases_list_st' => Array (/*'new_item', 'edit', 'delete', 'view',*/ 'export', /*'dbl-click'*/),
// edit phrase
-// 'phrase_edit_single' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'phrase_edit_single' => Array (/*'select',*/ 'setprimary', /*'cancel', 'reset_edit', 'prev', 'next'*/),
);
// fields to hide
@@ -31,14 +31,19 @@
// virtual fields to hide
$virtual_hidden_fields = Array (
- /*'PrimaryTranslation', 'CurrentTranslation', 'CurrentHintTranslation', 'CurrentColumnTranslation',
- 'LangFile', 'ImportOverwrite', 'DoNotEncode', 'ExportPhrases', 'ExportEmailEvents'*/
+ /*'PrimaryTranslation', 'SourceTranslation', 'SourceHintTranslation', 'SourceColumnTranslation',
+ 'CurrentTranslation', 'CurrentHintTranslation', 'CurrentColumnTranslation', 'LangFile', 'ImportOverwrite',
+ 'ImportSynced', 'DoNotEncode', 'ExportPhrases', 'ExportEmailEvents',*/ 'TranslationInSync', 'TranslateFromLanguage'
);
$debug_only_fields = Array (
'HintTranslation', 'ColumnTranslation'
);
+ $debug_only_virtual_fields = Array (
+ 'SourceHintTranslation', 'SourceColumnTranslation'
+ );
+
// fields to make required
$required_fields = Array (
'Phrase', 'Translation', 'PhraseType', 'Module'
@@ -55,5 +60,5 @@
// 'Default' => Array ('PhraseId', 'Phrase', 'CurrentTranslation', 'PrimaryTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation'),
// single list of phrases
-// 'Phrases' => Array ('PhraseId', 'Phrase', 'CurrentTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation'),
+ 'Phrases' => Array (/*'PhraseId', 'Phrase', 'CurrentTranslation', 'PhraseType', 'LastChanged', 'Module', 'CurrentHintTranslation', 'CurrentColumnTranslation',*/ 'TranslationInSync', 'TranslateFromLanguage'),
);
\ No newline at end of file
Index: core/admin_templates/import/import_start.tpl
===================================================================
--- core/admin_templates/import/import_start.tpl (revision 15581)
+++ core/admin_templates/import/import_start.tpl (working copy)
@@ -42,7 +42,6 @@
<inp2:m_RenderElement name="inp_edit_swf_upload" prefix="adm" field="ImportFile" title="la_fld_ImportFile"/>
<inp2:m_RenderElement name="inp_edit_filler"/>
- <!--<inp2:m_RenderElement name="inp_edit_checkbox" prefix="phrases.import" field="ImportOverwrite" hint_label="la_importlang_phrasewarning" title="la_prompt_overwritephrases"/>-->
</table>
</div>
Index: core/admin_templates/incs/form_blocks.tpl
===================================================================
--- core/admin_templates/incs/form_blocks.tpl (revision 15581)
+++ core/admin_templates/incs/form_blocks.tpl (working copy)
@@ -575,6 +575,12 @@
<a href="javascript:PreSaveAndOpenTranslator('<inp2:m_param name="prefix"/>', '<inp2:m_param name="field"/>', 'popups/translator', 1);" title="<inp2:m_Phrase label='la_Translate'/>"><img src="img/icons/icon24_translate.png" border="0"></a>
</inp2:m_DefineElement>
+<inp2:m_DefineElement name="source_language_field_caption_element">
+ <label for="<inp2:m_param name='NamePrefix'/><inp2:{$prefix}_InputName field='$field'/>">
+ <span class="<inp2:m_if check='{$prefix}_HasError' field='$field'>error-cell</inp2:m_if>"><inp2:$prefix_SourceLanguageTitle label="$title"/></span><inp2:m_if check="{$prefix}_IsRequired" field="$field"><span class="field-required"> *</span></inp2:m_if>:<inp2:m_if check="{$prefix}_FieldHintLabel" title_label="$title" direct_label="$hint_label"><span> <img src="<inp2:m_TemplatesBase/>/img/hint_icon.png" width="12" height="13" title="<inp2:$prefix_FieldHintLabel title_label='$title' direct_label='$hint_label' html_escape='1'/>" alt="<inp2:$prefix_FieldHintLabel title_label='$title' direct_label='$hint_label' html_escape='1'/>"/></inp2:m_if>
+ </label>
+</inp2:m_DefineElement>
+
<inp2:m_DefineElement name="inp_edit_textarea_ml">
<inp2:m_RenderElement name="inp_edit_textarea" format="no_default" pass_params="true"/>
<!--##<inp2:m_RenderElement design="form_row" pass_params="1">
Index: core/admin_templates/incs/style_template.css
===================================================================
--- core/admin_templates/incs/style_template.css (revision 15581)
+++ core/admin_templates/incs/style_template.css (working copy)
@@ -498,6 +498,18 @@
background: #fff none;
}
+.highlight-area, .code-highlight-area {
+ border: 1px solid black;
+ padding: 8px;
+ font-family: monospace !important;
+ font-size: 12px;
+ overflow: auto;
+}
+
+.code-highlight-area {
+ background-color: #F6F6F6;
+}
+
.error {
color: red;
}
Index: core/admin_templates/languages/email_message_edit.tpl
===================================================================
--- core/admin_templates/languages/email_message_edit.tpl (revision 15581)
+++ core/admin_templates/languages/email_message_edit.tpl (working copy)
@@ -11,10 +11,26 @@
<script type="text/javascript">
a_toolbar = new ToolBar();
a_toolbar.AddButton( new ToolBarButton('select', '<inp2:m_phrase label="la_ToolTip_Save" escape="1"/>', function() {
+ Application.SetVar('translation_save_mode', 1);
submit_event('emailevents','<inp2:emailevents_SaveEvent/>');
}
) );
+ <inp2:m_if check="lang_IsMultiLanguage">
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'setprimary',
+ '<inp2:m_Phrase label="hint:la_ToolTip_SetPrimaryTranslation" escape="1"/>::<inp2:m_Phrase label="la_ToolTip_SetPrimaryTranslation" escape="1"/>',
+ function() {
+ Application.SetVar('translation_save_mode', 2);
+ submit_event('emailevents','<inp2:emailevents_SaveEvent/>');
+ }
+ )
+ );
+ </inp2:m_if>
+
+ a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+
a_toolbar.AddButton( new ToolBarButton('cancel', '<inp2:m_phrase label="la_ToolTip_Cancel" escape="1"/>', function() {
cancel_edit('emailevents','OnCancelEdit','<inp2:emailevents_SaveEvent/>','<inp2:m_Phrase label="la_FormCancelConfirmation" escape="1"/>');
}
@@ -27,7 +43,7 @@
) );
<inp2:m_if check="emailevents_IsSingle" inverse="inverse">
- a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+ a_toolbar.AddButton( new ToolBarSeparator('sep2') );
</inp2:m_if>
a_toolbar.AddButton( new ToolBarButton('prev', '<inp2:m_phrase label="la_ToolTip_Prev" escape="1"/>', function() {
@@ -53,6 +69,16 @@
<inp2:emailevents_SaveWarning name="grid_save_warning"/>
<inp2:emailevents_ErrorWarning name="form_error_warning"/>
+<inp2:m_DefineElement name="inp_primary_label">
+ <inp2:m_RenderElement design="form_row" pass_params="1">
+ <td class="control-cell" valign="top">
+ <div class="highlight-area" style="width: 735px; height: 234px;">
+ <inp2:{$prefix}_Field field="$field" nl2br="$nl2br"/>
+ </div>
+ </td>
+ </inp2:m_RenderElement>
+</inp2:m_DefineElement>
+
<div id="scroll_container">
<table class="edit-form">
<inp2:m_RenderElement name="subsection" prefix="emailevents" fields="EventId,Description,Subject" title="la_section_General"/>
@@ -65,8 +91,16 @@
</inp2:m_if>
<inp2:m_RenderElement name="inp_label" prefix="emailevents" field="Description" title="la_fld_Description"/>
+
+ <inp2:m_if check="emailevents_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="emailevents" field="TranslationInSync"/>
+ </inp2:m_if>
+
<inp2:m_RenderElement name="inp_edit_box_ml" prefix="emailevents" field="Subject" format="no_default" title="la_fld_Subject"/>
+ <inp2:m_if check="emailevents_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="emailevents" field="SourceSubject" caption_render_as="source_language_field_caption_element"/>
+ </inp2:m_if>
<inp2:m_RenderElement name="subsection" prefix="emailevents" fields="HtmlBody,PlainTextBody" title="la_section_Message"/>
<inp2:m_if check="m_IsDebugMode">
<inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="emailevents" field="HtmlBody" format="no_default" title="la_fld_HtmlVersion" control_options="{min_height: 200}"/>
@@ -74,7 +108,15 @@
<inp2:m_RenderElement name="inp_edit_fck" prefix="emailevents" field="HtmlBody" format="no_default" title="la_fld_HtmlVersion" rows="5" cols="60" control_options="{min_height: 200}"/>
</inp2:m_if>
+ <inp2:m_if check="emailevents_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_primary_label" prefix="emailevents" field="SourceHtmlBody" caption_render_as="source_language_field_caption_element" nl2br="1"/>
+ </inp2:m_if>
+
<inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="emailevents" field="PlainTextBody" format="no_default" title="la_fld_TextVersion" allow_html="0" control_options="{min_height: 200}"/>
+
+ <inp2:m_if check="emailevents_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_primary_label" prefix="emailevents" field="SourcePlainTextBody" caption_render_as="source_language_field_caption_element" nl2br="1"/>
+ </inp2:m_if>
<inp2:m_RenderElement name="inp_edit_filler" control_options="{max_height: 8}"/>
</table>
</div>
Index: core/admin_templates/languages/phrase_edit.tpl
===================================================================
--- core/admin_templates/languages/phrase_edit.tpl (revision 15581)
+++ core/admin_templates/languages/phrase_edit.tpl (working copy)
@@ -9,11 +9,33 @@
<td>
<script type="text/javascript">
a_toolbar = new ToolBar();
- a_toolbar.AddButton( new ToolBarButton('select', '<inp2:m_phrase label="la_ToolTip_Save" escape="1"/>', function() {
+
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'select',
+ '<inp2:m_phrase label="la_ToolTip_Save" escape="1"/>',
+ function() {
+ Application.SetVar('translation_save_mode', 1);
submit_event('phrases','<inp2:phrases_SaveEvent/>');
}
- ) );
+ )
+ );
+ <inp2:m_if check="lang_IsMultiLanguage">
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'setprimary',
+ '<inp2:m_Phrase label="hint:la_ToolTip_SetPrimaryTranslation" escape="1"/>::<inp2:m_Phrase label="la_ToolTip_SetPrimaryTranslation" escape="1"/>',
+ function() {
+ Application.SetVar('translation_save_mode', 2);
+ submit_event('phrases','<inp2:phrases_SaveEvent/>');
+ }
+ )
+ );
+
+ a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+ </inp2:m_if>
+
a_toolbar.AddButton(
new ToolBarButton(
'cancel',
@@ -35,7 +57,7 @@
<inp2:m_if check="phrases_IsTopmostPrefix">
<inp2:m_if check="phrases_IsSingle" inverse="inverse">
- a_toolbar.AddButton( new ToolBarSeparator('sep1') );
+ a_toolbar.AddButton( new ToolBarSeparator('sep2') );
</inp2:m_if>
a_toolbar.AddButton( new ToolBarButton('prev', '<inp2:m_phrase label="la_ToolTip_Prev" escape="1"/>', function() {
@@ -71,38 +93,47 @@
<inp2:m_RenderElement name="inp_edit_hidden" prefix="phrases" field="Phrase"/>
</inp2:m_if>
-<inp2:m_DefineElement name="translations_element">
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="Translation" style="width: 100%; height: 100px;" control_options="{max_height: 100}" allow_html="0"/>
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="HintTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="ColumnTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
-</inp2:m_DefineElement>
+<inp2:m_DefineElement name="translations_element" prefix="phrases">
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="$prefix" field="Translation" style="width: 100%; height: 100px;" control_options="{max_height: 100}" allow_html="0"/>
-<inp2:m_DefineElement name="phrase_element">
- <inp2:m_if check="m_Get" name="simple_mode">
- <inp2:m_RenderElement name="translations_element"/>
- <inp2:m_else/>
- <tr class="subsectiontitle">
- <td colspan="3"><inp2:phrases_Field name="Phrase"/></td>
- </tr>
+ <inp2:m_if check="phrases_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="$prefix" field="SourceTranslation" caption_render_as="source_language_field_caption_element"/>
+ </inp2:m_if>
- <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PrimaryTranslation"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="phrases" field="Phrase" size="60"/>
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="$prefix" field="HintTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
- <inp2:m_RenderElement name="translations_element"/>
+ <inp2:m_if check="phrases_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="$prefix" field="SourceHintTranslation" caption_render_as="source_language_field_caption_element"/>
+ </inp2:m_if>
- <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PhraseType"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="phrases" field="Module" has_empty="1"/>
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="$prefix" field="ColumnTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
+
+ <inp2:m_if check="phrases_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="$prefix" field="SourceColumnTranslation" caption_render_as="source_language_field_caption_element"/>
</inp2:m_if>
</inp2:m_DefineElement>
<div id="scroll_container">
<table class="edit-form">
- <!--##<inp2:m_if check="m_GetEquals" name="phrases_label" value="ALEX, FIX IT!">
- <inp2:phrases_MultipleEditing render_as="phrase_element"/>
- <inp2:m_else/>##-->
- <inp2:m_RenderElement name="phrase_element"/>
- <!--##</inp2:m_if>##-->
+ <inp2:m_if check="m_Get" name="simple_mode">
+ <inp2:m_RenderElement name="translations_element"/>
+ <inp2:m_else/>
+ <tr class="subsectiontitle">
+ <td colspan="3"><inp2:phrases_Field name="Phrase"/></td>
+ </tr>
+ <inp2:m_if check="phrases_ShowSourceLanguage">
+ <inp2:m_RenderElement name="inp_label" prefix="phrases" field="TranslationInSync"/>
+ </inp2:m_if>
+
+ <inp2:m_RenderElement name="inp_edit_box" prefix="phrases" field="Phrase" size="60"/>
+
+ <inp2:m_RenderElement name="translations_element"/>
+
+ <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PhraseType"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="phrases" field="Module" has_empty="1"/>
+ </inp2:m_if>
+
<inp2:m_RenderElement name="inp_edit_filler"/>
</table>
</div>
Index: core/admin_templates/logs/email_logs/email_log_edit.tpl
===================================================================
--- core/admin_templates/logs/email_logs/email_log_edit.tpl (revision 15581)
+++ core/admin_templates/logs/email_logs/email_log_edit.tpl (working copy)
@@ -83,7 +83,7 @@
<inp2:m_RenderElement design="form_row" prefix="email-log" field="TextBody" title="la_fld_TextVersion">
<td class="control-cell" valign="top">
- <div style="border: 1px solid black; width: 624px; height: 234px; padding: 8px; font-family: serif; font-size: 16px; overflow: auto;">
+ <div class="highlight-area" style="width: 624px; height: 234px;">
<inp2:$prefix_Field name="$field" nl2br="1"/>
</div>
</td>
Index: core/admin_templates/logs/system_logs/system_log_edit.tpl
===================================================================
--- core/admin_templates/logs/system_logs/system_log_edit.tpl (revision 15581)
+++ core/admin_templates/logs/system_logs/system_log_edit.tpl (working copy)
@@ -56,14 +56,6 @@
font-size: 12px;
}
- .highlight-area {
- border: 1px solid black;
- padding: 8px;
- font-family: serif;
- background-color: #F6F6F6;
- overflow: auto;
- }
-
.log_backtrace {
margin: 0;
padding-left: 25px;
@@ -77,7 +69,7 @@
<inp2:m_DefineElement name="inp_serialized_label">
<inp2:m_RenderElement design="form_row" pass_params="1">
<td class="control-cell" valign="top">
- <div class="highlight-area" style="width: 760px; height: 234px;">
+ <div class="code-highlight-area" style="width: 760px; height: 234px;">
<inp2:{$prefix}_PrintArray field="$field"/>
</div>
</td>
@@ -89,7 +81,7 @@
<inp2:m_if check="m_Param" name="has_args">
<a href="#" title="<inp2:m_Phrase name='hint:la_LogBacktraceFunction' html_escape='1'/>" trace_index="<inp2:m_Param name='index'/>"><inp2:m_Phrase name="la_LogBacktraceFunction"/>:</a> <inp2:m_Param name="file_info"/>
- <div class="highlight-area" style="display: none;" id="trace_args_<inp2:m_Param name='index'/>">
+ <div class="code-highlight-area" style="display: none;" id="trace_args_<inp2:m_Param name='index'/>">
<inp2:m_Param name="args"/>
</div>
<inp2:m_else/>
Index: core/admin_templates/mailing_lists/mailing_list_edit.tpl
===================================================================
--- core/admin_templates/mailing_lists/mailing_list_edit.tpl (revision 15581)
+++ core/admin_templates/mailing_lists/mailing_list_edit.tpl (working copy)
@@ -134,7 +134,7 @@
<inp2:m_RenderElement design="form_row" prefix="mailing-list" field="MessageText" title="la_fld_TextVersion">
<td class="control-cell" valign="top">
- <div style="border: 1px solid black; width: 624px; height: 234px; padding: 8px; font-family: serif; font-size: 16px; overflow: auto;">
+ <div class="highlight-area" style="width: 624px; height: 234px;">
<inp2:$prefix_Field name="$field" nl2br="1"/>
</div>
</td>
Index: core/admin_templates/regional/languages_import.tpl
===================================================================
--- core/admin_templates/regional/languages_import.tpl (revision 15581)
+++ core/admin_templates/regional/languages_import.tpl (working copy)
@@ -36,7 +36,8 @@
<inp2:m_RenderElement name="inp_edit_upload" prefix="phrases.import" field="LangFile" title="la_fld_LanguageFile"/>
<inp2:m_RenderElement name="inp_edit_checkboxes" prefix="phrases.import" field="PhraseType" title="la_fld_InstallPhraseTypes"/>
- <inp2:m_RenderElement name="inp_edit_checkbox" prefix="phrases.import" field="ImportOverwrite" hint_label="la_importlang_phrasewarning" title="la_prompt_overwritephrases"/>
+ <inp2:m_RenderElement name="inp_edit_radio" prefix="phrases.import" field="ImportOverwrite"/>
+ <inp2:m_RenderElement name="inp_edit_radio" prefix="phrases.import" field="ImportSynced"/>
<!-- <inp2:m_RenderElement name="inp_edit_checkboxes" no_empty="no_empty" prefix="phrases.export" field="Module" title="la_fld_InstallModules" /> -->
<inp2:m_RenderElement name="inp_edit_filler"/>
Index: core/admin_templates/regional/phrases_edit.tpl
===================================================================
--- core/admin_templates/regional/phrases_edit.tpl (revision 15581)
+++ core/admin_templates/regional/phrases_edit.tpl (working copy)
@@ -68,36 +68,28 @@
<inp2:m_RenderElement name="inp_edit_hidden" prefix="phrases" field="Phrase"/>
</inp2:m_if>
-<inp2:m_DefineElement name="phrase_element">
- <inp2:lang_Field name="LanguageId" result_to_var="language_id"/>
+<div id="scroll_container">
+ <table class="edit-form">
+ <inp2:lang_Field name="LanguageId" result_to_var="language_id"/>
- <inp2:m_if check="m_Get" name="simple_mode">
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_Translation" title="la_fld_Translation" rows="7" cols="50" allow_html="0"/>
- <inp2:m_else/>
- <tr class="subsectiontitle">
- <td colspan="3"><inp2:phrases_Field name="Phrase"/></td>
- </tr>
+ <inp2:m_if check="m_Get" name="simple_mode">
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_Translation" title="la_fld_Translation" rows="7" cols="50" allow_html="0"/>
+ <inp2:m_else/>
+ <tr class="subsectiontitle">
+ <td colspan="3"><inp2:phrases_Field name="Phrase"/></td>
+ </tr>
- <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PrimaryTranslation"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="phrases" field="Phrase" size="60"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="phrases" field="Phrase" size="60"/>
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_Translation" title="la_fld_Translation" style="width: 100%; height: 100px;" control_options="{max_height: 100}" allow_html="0"/>
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_HintTranslation" title="la_fld_HintTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
- <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_ColumnTranslation" title="la_fld_ColumnTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
+ <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PrimaryTranslation"/>
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_Translation" title="la_fld_Translation" style="width: 100%; height: 100px;" control_options="{max_height: 100}" allow_html="0"/>
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_HintTranslation" title="la_fld_HintTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
+ <inp2:m_RenderElement name="inp_edit_textarea_ml" prefix="phrases" field="l{$language_id}_ColumnTranslation" title="la_fld_ColumnTranslation" style="width: 100%; height: 50px;" control_options="{max_height: 50}" allow_html="0"/>
- <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PhraseType"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="phrases" field="Module" has_empty="1"/>
- </inp2:m_if>
-</inp2:m_DefineElement>
+ <inp2:m_RenderElement name="inp_label" prefix="phrases" field="PhraseType"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="phrases" field="Module" has_empty="1"/>
+ </inp2:m_if>
-<div id="scroll_container">
- <table class="edit-form">
- <!--##<inp2:m_if check="m_GetEquals" name="phrases_label" value="ALEX, FIX IT!">
- <inp2:phrases_MultipleEditing render_as="phrase_element"/>
- <inp2:m_else/>##-->
- <inp2:m_RenderElement name="phrase_element"/>
- <!--##</inp2:m_if>##-->
-
<inp2:m_RenderElement name="inp_edit_filler"/>
</table>
</div>
Index: core/install/english.lang
===================================================================
--- core/install/english.lang (revision 15581)
+++ core/install/english.lang (working copy)
@@ -478,6 +478,8 @@
<PHRASE Label="la_fld_ImportColumns" Module="Core" Type="1">SW1wb3J0IENvbHVtbnM=</PHRASE>
<PHRASE Label="la_fld_ImportFile" Module="Core" Type="1">SW1wb3J0IEZpbGU=</PHRASE>
<PHRASE Label="la_fld_ImportFilename" Module="Core" Type="1">SW1wb3J0IEZpbGVuYW1l</PHRASE>
+ <PHRASE Label="la_fld_ImportOverwrite" Module="Core" Type="1" Hint="RW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCB1bmRvIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gZXhpc3RpbmcgcGhyYXNlcw==">T3ZlcndyaXRlIEV4aXN0aW5nIFBocmFzZXM=</PHRASE>
+ <PHRASE Label="la_fld_ImportSynced" Module="Core" Type="1" Hint="RW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBtYXJrIGFsbCBuZXcgbGFiZWxzIGZyb20gdGhpcyBsYW5ndWFnZSBwYWNrIHN5bmNlZCB3aXRoIGFsbCBvdGhlciBsYW5ndWFnZXMu">SW1wb3J0IE5ldyBQaHJhc2VzIGFzIFN5bmNlZA==</PHRASE>
<PHRASE Label="la_fld_IncludeFieldTitles" Module="Core" Type="1">SW5jbHVkZSBmaWVsZCB0aXRsZXM=</PHRASE>
<PHRASE Label="la_fld_IncludeSublevels" Module="Core" Type="1" Column="SW5jbHVkZSBTdWJsZXZlbHM=">SW5jbHVkZSBTdWJsZXZlbHM=</PHRASE>
<PHRASE Label="la_fld_InputDateFormat" Module="Core" Type="1">SW5wdXQgRGF0ZSBGb3JtYXQ=</PHRASE>
@@ -659,6 +661,12 @@
<PHRASE Label="la_fld_SkinName" Module="Core" Type="1" Column="TmFtZQ==">TmFtZQ==</PHRASE>
<PHRASE Label="la_fld_SkipFirstRow" Module="Core" Type="1">U2tpcCBGaXJzdCBSb3c=</PHRASE>
<PHRASE Label="la_fld_SortValues" Module="Core" Type="1">U29ydCBWYWx1ZXM=</PHRASE>
+ <PHRASE Label="la_fld_SourceColumnTranslation" Module="Core" Type="1" Column="U291cmNlIENvbHVtbiBQaHJhc2U=">U291cmNlIENvbHVtbiBQaHJhc2UgKGZyb20gJXMp</PHRASE>
+ <PHRASE Label="la_fld_SourceHintTranslation" Module="Core" Type="1" Column="U291cmNlIEhpbnQgUGhyYXNl">U291cmNlIEhpbnQgUGhyYXNlIChmcm9tICVzKQ==</PHRASE>
+ <PHRASE Label="la_fld_SourceHtmlBody" Module="Core" Type="1" Column="U291cmNlIEhUTUwgVmVyc2lvbg==">U291cmNlIEhUTUwgVmVyc2lvbiAoZnJvbSAlcyk=</PHRASE>
+ <PHRASE Label="la_fld_SourcePlainTextBody" Module="Core" Type="1" Column="U291cmNlIFRleHQgVmVyc2lvbg==">U291cmNlIFRleHQgVmVyc2lvbiAoZnJvbSAlcyk=</PHRASE>
+ <PHRASE Label="la_fld_SourceSubject" Module="Core" Type="1" Column="U291cmNlIFN1YmplY3Q=">U291cmNlIFN1YmplY3QgKGZyb20gJXMp</PHRASE>
+ <PHRASE Label="la_fld_SourceTranslation" Module="Core" Type="1" Column="U291cmNl">U291cmNlIFBocmFzZSAoZnJvbSAlcyk=</PHRASE>
<PHRASE Label="la_fld_SSLUrl" Module="Core" Type="1" Hint="aHR0cHM6Ly93d3cuZG9tYWluLmNvbS9wYXRo" Column="U1NMIFVybA==">U1NMIEZ1bGwgVVJM</PHRASE>
<PHRASE Label="la_fld_StartDate" Module="Core" Type="1" Column="U3RhcnQgRGF0ZQ==">U3RhcnQgRGF0ZQ==</PHRASE>
<PHRASE Label="la_fld_State" Module="Core" Type="1" Column="U3RhdGU=">U3RhdGU=</PHRASE>
@@ -706,7 +714,9 @@
<PHRASE Label="la_fld_TransitionEffect" Module="Core" Type="1" Column="UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3Q=">UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3Q=</PHRASE>
<PHRASE Label="la_fld_TransitionEffectCustom" Module="Core" Type="1" Column="UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3QgKGN1c3RvbSk=">UHJvbW8gVHJhbnNpdGlvbiBFZmZlY3QgKGN1c3RvbSk=</PHRASE>
<PHRASE Label="la_fld_TransitionTime" Module="Core" Type="1" Column="VHJhbnNpdGlvbiBEZWxheSAoc2Vjb25kcyk=">VHJhbnNpdGlvbiBEZWxheSAoc2Vjb25kcyk=</PHRASE>
+ <PHRASE Label="la_fld_TranslateFromLanguage" Module="Core" Type="1" Column="VHJhbnNsYXRlIEZyb20gTGFuZ2F1Z2U=">VHJhbnNsYXRlIEZyb20gTGFuZ2F1Z2U=</PHRASE>
<PHRASE Label="la_fld_Translation" Module="Core" Type="1" Column="VmFsdWU=">UGhyYXNl</PHRASE>
+ <PHRASE Label="la_fld_TranslationInSync" Module="Core" Type="1" Column="VHJhbnNsYXRpb24gaW4gU3luYw==">VHJhbnNsYXRpb24gaW4gU3luYw==</PHRASE>
<PHRASE Label="la_fld_Type" Module="Core" Type="1" Column="VHlwZQ==">VHlwZQ==</PHRASE>
<PHRASE Label="la_fld_UnitSystem" Module="Core" Type="1">TWVhc3VyZXMgU3lzdGVt</PHRASE>
<PHRASE Label="la_fld_Upload" Module="Core" Type="1">VXBsb2FkIEZpbGUgRnJvbSBMb2NhbCBQQw==</PHRASE>
@@ -1091,7 +1101,6 @@
<PHRASE Label="la_prompt_NewestLinkDate" Module="Core" Type="1">TmV3ZXN0IExpbmsgRGF0ZQ==</PHRASE>
<PHRASE Label="la_prompt_NewestUserDate" Module="Core" Type="1">TmV3ZXN0IFVzZXIgRGF0ZQ==</PHRASE>
<PHRASE Label="la_prompt_NonExpiredSessions" Module="Core" Type="1">Q3VycmVudGx5IEFjdGl2ZSBVc2VyIFNlc3Npb25z</PHRASE>
- <PHRASE Label="la_prompt_overwritephrases" Module="Core" Type="1">T3ZlcndyaXRlIEV4aXN0aW5nIFBocmFzZXM=</PHRASE>
<PHRASE Label="la_prompt_PendingCategories" Module="Core" Type="1">UGVuZGluZyBTZWN0aW9ucw==</PHRASE>
<PHRASE Label="la_prompt_PendingItems" Module="Core" Type="1">UGVuZGluZyBJdGVtcw==</PHRASE>
<PHRASE Label="la_prompt_perform_now" Module="Core" Type="1">UGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBub3c/</PHRASE>
@@ -1650,6 +1659,7 @@
<PHRASE Label="la_ToolTip_setPrimary" Module="Core" Type="1">U2V0IFByaW1hcnk=</PHRASE>
<PHRASE Label="la_ToolTip_setprimarycategory" Module="Core" Type="1">U2V0IFByaW1hcnkgU2VjdGlvbg==</PHRASE>
<PHRASE Label="la_ToolTip_SetPrimaryLanguage" Module="Core" Type="1">U2V0IFByaW1hcnkgTGFuZ3VhZ2U=</PHRASE>
+ <PHRASE Label="la_ToolTip_SetPrimaryTranslation" Module="Core" Type="1" Hint="VXNlIHRoaXMgdHJhbnNsYXRpb24gYXMgcHJpbWFyeSBmb3Igb3RoZXIgbGFuZ3VhZ2Vz">VXNlIGFzIFByaW1hcnk=</PHRASE>
<PHRASE Label="la_ToolTip_SetSticky" Module="Core" Type="1">U2V0IFN0aWNreQ==</PHRASE>
<PHRASE Label="la_ToolTip_Settings" Module="Core" Type="1">U2V0dGluZ3M=</PHRASE>
<PHRASE Label="la_ToolTip_ShowMenu" Module="Core" Type="1">U2hvdyBNZW51</PHRASE>
@@ -1731,7 +1741,6 @@
<PHRASE Label="lc_field_status" Module="Core" Type="2">U3RhdHVz</PHRASE>
<PHRASE Label="lc_field_topseller" Module="Core" Type="2">SXRlbSBJcyBhIFRvcCBTZWxsZXI=</PHRASE>
<PHRASE Label="lc_field_url" Module="Core" Type="2">VVJM</PHRASE>
- <PHRASE Label="lc_importlang_phrasewarning" Module="Core" Type="2">RW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCB1bmRvIGFueSBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgdG8gZXhpc3RpbmcgcGhyYXNlcw==</PHRASE>
<PHRASE Label="lc_of" Module="Core" Type="2">b2Y=</PHRASE>
<PHRASE Label="lc_Text_Invalid" Module="Core" Type="2">SW52YWxpZA==</PHRASE>
<PHRASE Label="lc_Text_Not_Validated" Module="Core" Type="2">Tm90IFZhbGlkYXRlZA==</PHRASE>
Index: core/install/install_data.sql
===================================================================
--- core/install/install_data.sql (revision 15581)
+++ core/install/install_data.sql (working copy)
@@ -737,7 +737,7 @@
INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.edit', 11, 1, 1, 0);
INSERT INTO Permissions VALUES (DEFAULT, 'in-portal:skins.delete', 11, 1, 1, 0);
-INSERT INTO AdminSkins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000 !important;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-top-width: 1px;\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2, .grid-edit-table .edit-form-odd > td, .grid-edit-table .edit-form-even > td {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2, .grid-edit-table .edit-form-even > td {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.filter, div.filter-active {\r\n background-color: white;\r\n border: 1px solid #AAAAAA;\r\n color: black;\r\n font-weight: normal;\r\n padding: 3px;\r\n}\r\n\r\ndiv.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.multioptions_filter {\r\n position: absolute;\r\n z-index: 100;\r\n color: black;\r\n background-color: white;\r\n border: 1px solid black;\r\n padding: 3px 5px;\r\n display: none;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px !important;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n/* remove top-border from first sub-section element */\r\ntable.edit-form .subsectiontitle:first-child, table.bordered .subsectiontitle:first-child {\r\n border-top-width: 0;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-notice, .form-warning {\r\n font-size: 11px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n}\r\n\r\n.form-notice {\r\n color: green;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n/* Uploader */\r\n.uploader-queue div.file {\r\n font-size: 11px;\r\n border: 1px solid #7F99C5;\r\n padding: 3px;\r\n background-color: #DEE7F6;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.uploader-queue .left {\r\n float: left;\r\n vertical-align: top;\r\n}\r\n\r\n.uploader-queue .file-label {\r\n margin-left: 5px;\r\n}\r\n\r\n.uploader-queue .preview .delete-checkbox {\r\n margin-top: -3px;\r\n}\r\n\r\n.uploader-queue .progress-container {\r\n margin: 2px 5px 0px 5px;\r\n}\r\n\r\n.uploader-queue .progress-empty {\r\n width: 150px;\r\n height: 9px;\r\n border: 1px solid black;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_left.gif'') repeat-x;\r\n}\r\n\r\n.uploader-queue .progress-full {\r\n height: 9px;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n.uploader-queue .thumbnail {\r\n /*margin-bottom: 2px;*/\r\n border: 1px solid black;\r\n background-color: grey;\r\n}\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Page header (bluebar) */\r\n.page-title td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}\r\n\r\n/* Ajax Dropdown */\r\n.suggest-box {\r\n border: 1px solid #999;\r\n background-color: #fff;\r\n}\r\n\r\n.suggest-item, .suggest-item-over {\r\n padding: 1px 2px 0px 2px;\r\n font-family: arial,verdana;\r\n font-size: 12px;\r\n}\r\n\r\n.suggest-item-over {\r\n background-color: #3366CC;\r\n color: #fff;\r\n}\r\n\r\n/* Dashboard Summary Boxes */\r\n.summary-box {\r\n border: 1px solid black;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.summary-box .title {\r\n color: white;\r\n font-weight: bold;\r\n padding: 6px 5px;\r\n vertical-align: middle;\r\n background-color: #4A92CE;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n.summary-box .content {\r\n padding: 4px;\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.summary-box .group {\r\n border-bottom: 1px solid black;\r\n margin-bottom: 10px;\r\n padding: 0 0 10px 10px;\r\n}\r\n\r\n.summary-box .group.last {\r\n border-width: 0px;\r\n margin-bottom: 0;\r\n padding-bottom: 5px;\r\n}\r\n\r\n.summary-box h4 {\r\n margin: 0;\r\n padding: 0 0 3px 0;\r\n font-size: 11px;\r\n font-weight: bold;\r\n}\r\n\r\n.summary-box .hint {\r\n font-size: 10px;\r\n color: grey;\r\n margin-bottom: 3px;\r\n}\r\n\r\n.summary-box .hint .cache-key {\r\n margin-bottom: 7px;\r\n margin-left: 3px;\r\n}\r\n\r\n.summary-box ul {\r\n margin-top: 5px;\r\n margin-bottom: 3px;\r\n padding-left: 30px;\r\n}\r\n\r\n.summary-box li {\r\n padding-bottom: 4px;\r\n}\r\n\r\nspan.cke_skin_kama {\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n padding: 0px !important;\r\n}\r\n\r\n.cke_wrapper{\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1342105805, 1, 1);
+INSERT INTO AdminSkins VALUES(DEFAULT, 'Default', '/* General elements */\r\n\r\nhtml {\r\n height: 100%;\r\n}\r\n\r\nbody {\r\n font-family: verdana,arial,helvetica,sans-serif;\r\n color: #000000;\r\n overflow-x: auto; overflow-y: auto;\r\n margin: 0px 0px 0px 0px;\r\n text-decoration: none;\r\n}\r\n\r\nbody, td {\r\n /* fix for Firefox, when font-size was not inherited in table cells */\r\n font-size: 9pt;\r\n}\r\n\r\na {\r\n color: #006699;\r\n text-decoration: none;\r\n}\r\n\r\na:hover {\r\n color: #009ff0;\r\n text-decoration: none;\r\n}\r\n\r\nform {\r\n display: inline;\r\n}\r\n\r\nimg { border: 0px; }\r\n\r\nbody.height-100 {\r\n height: 100%;\r\n}\r\n\r\nbody.regular-body {\r\n margin: 0px 10px 5px 10px;\r\n color: #000000;\r\n background-color: @@SectionBgColor@@;\r\n}\r\n\r\nbody.edit-popup {\r\n margin: 0px 0px 0px 0px;\r\n}\r\n\r\ntable.collapsed {\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered, table.bordered, .bordered-no-bottom {\r\n border: 1px solid #000000 !important;\r\n border-top-width: 0px;\r\n border-collapse: collapse;\r\n}\r\n\r\n.bordered-no-bottom {\r\n border-top-width: 1px;\r\n border-bottom: none;\r\n}\r\n\r\n.login-table td {\r\n padding: 1px;\r\n}\r\n\r\n.disabled {\r\n background-color: #ebebeb;\r\n}\r\n\r\n/* Head frame */\r\ntable.head-table {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/right_background.png'') top right @@HeadBgColor@@ no-repeat;\r\n}\r\n\r\n.head-table tr td, .head-table tr td a {\r\n color: @@HeadColor@@\r\n}\r\n\r\ndiv#extra_toolbar td.button-active {\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_button_background.gif'') bottom left repeat-x;\r\n height: 22px;\r\n}\r\n\r\ndiv#extra_toolbar td.button-active a {\r\n color: black;\r\n text-decoration: none;\r\n}\r\n\r\ntd.kx-block-header, .head-table tr td.kx-block-header{\r\n color: @@HeadBarColor@@;\r\n background: url(''@@base_url@@/core/admin_templates/img/top_frame/toolbar_background.gif'') repeat-x top left;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n padding-left: 7px;\r\n padding-right: 7px;\r\n}\r\n\r\na.kx-header-link {\r\n text-decoration: underline;\r\n font-weight: bold;\r\n color: #0080C8;\r\n}\r\n\r\na.kx-header-link:hover {\r\n color: #FFCB05;\r\n text-decoration: none;\r\n}\r\n\r\n.kx-secondary-foreground {\r\n color: #FFFFFF;\r\n /*background-color: @@HeadBarBgColor@@;*/\r\n}\r\n\r\n.kx-login-button {\r\n background-color: #2D79D6;\r\n color: #FFFFFF;\r\n}\r\n\r\n/* General form button (yellow) */\r\n.button {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #000000;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Disabled (grayed-out) form button */\r\n.button-disabled {\r\n font-size: 12px;\r\n font-weight: normal;\r\n color: #676767;\r\n background: url(''@@base_url@@/core/admin_templates/img/button_back_disabled.gif'') #f9eeae repeat-x;\r\n text-decoration: none;\r\n}\r\n\r\n/* Tabs bar */\r\n\r\n.tab, .tab-active {\r\n background-color: #F0F1EB;\r\n padding: 3px 7px 2px 7px;\r\n border-top: 1px solid black;\r\n border-left: 1px solid black;\r\n border-right: 1px solid black;\r\n margin-left: 3px !important;\r\n white-space: nowrap;\r\n}\r\n\r\n.tab-active {\r\n background-color: #4487D9;\r\n}\r\n\r\n.tab a {\r\n color: #4487D9;\r\n font-weight: bold;\r\n}\r\n\r\n.tab-active a {\r\n color: #FFFFFF;\r\n font-weight: bold;\r\n}\r\n\r\na.scroll-left, a.scroll-right {\r\n cursor: pointer;\r\n display: block;\r\n float: left;\r\n height: 18px;\r\n margin: 0px 1px;\r\n width: 18px;\r\n}\r\n\r\na.scroll-left {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/left.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.scroll-right {\r\n background: transparent url(''@@base_url@@/core/admin_templates/img/tabs/right.png'') no-repeat scroll 0 0;\r\n}\r\n\r\na.disabled {\r\n visibility: hidden !important;\r\n}\r\n\r\na.scroll-left:hover, a.scroll-right:hover {\r\n background-position: 0 -18px;\r\n}\r\n\r\ntd.scroll-right-container {\r\n width: 20px;\r\n}\r\n\r\ntd.scroll-right-container.disabled, td.scroll-right-container.disabled * {\r\n width: 0px;\r\n margin: 0px;\r\n}\r\n\r\ntd.scroll-right-container.disabled br {\r\n display: none;\r\n}\r\n\r\n/* Toolbar */\r\n\r\n.toolbar {\r\n font-size: 8pt;\r\n border: 1px solid #000000;\r\n border-width: 0px 1px 1px 1px;\r\n background-color: @@ToolbarBgColor@@;\r\n border-collapse: collapse;\r\n}\r\n\r\n.toolbar td {\r\n height: 100%;\r\n}\r\n\r\n.toolbar-button, .toolbar-button-disabled, .toolbar-button-over {\r\n float: left;\r\n text-align: center;\r\n font-size: 8pt;\r\n padding: 5px 5px 5px 5px;\r\n vertical-align: middle;\r\n color: #006F99;\r\n}\r\n\r\n.toolbar-button-over {\r\n color: #000;\r\n}\r\n\r\n.toolbar-button-disabled {\r\n color: #444;\r\n}\r\n\r\n/* Scrollable Grids */\r\n\r\n\r\n.layout-only-table td {\r\n border: none !important;\r\n}\r\n\r\n/* Main Grid class */\r\n.grid-scrollable {\r\n padding: 0px;\r\n border: 1px solid black !important;\r\n border-top: none !important;\r\n}\r\n\r\n/* Div generated by js, which contains all the scrollable grid elements, affects the style of scrollable area without data (if there are too few rows) */\r\n.grid-container {\r\n background-color: #fff;\r\n}\r\n\r\n.grid-container table {\r\n border-collapse: collapse;\r\n}\r\n\r\n/* Inner div generated in each data-cell */\r\n.grid-cell-div {\r\n overflow: hidden;\r\n height: auto;\r\n}\r\n\r\n/* Main row definition */\r\n.grid-data-row td, .grid-data-row-selected td, .grid-data-row-even-selected td, .grid-data-row-mouseover td, .table-color1, .table-color2, .grid-edit-table .edit-form-odd > td, .grid-edit-table .edit-form-even > td {\r\n font-weight: normal;\r\n color: @@OddColor@@;\r\n background-color: @@OddBgColor@@;\r\n padding: 3px 5px 3px 5px;\r\n overflow: hidden;\r\n border-right: 1px solid #c9c9c9;\r\n}\r\n.grid-data-row-even td, .table-color2, .grid-edit-table .edit-form-even > td {\r\n background-color: @@EvenBgColor@@;\r\n color: @@EvenColor@@;\r\n}\r\n.grid-data-row td a, .grid-data-row-selected td a, .grid-data-row-mouseover td a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* mouse-over rows */\r\n.grid-data-row-mouseover td, table tr.grid-data-row[_row_highlighted] td {\r\n background: #FFFDF4;\r\n}\r\n\r\n/* Selected row, applies to both checkbox and data areas */\r\n.grid-data-row-selected td, table tr.grid-data-row[_row_selected] td {\r\n background: #FEF2D6;\r\n}\r\n\r\n.grid-data-row-even-selected td, .grid-data-row-even[_row_selected] td {\r\n background: #FFF7E0;\r\n}\r\n\r\n/* General header cell definition */\r\n.grid-header-row td {\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n text-decoration: none;\r\n padding: 3px 5px 3px 5px;\r\n color: @@ColumnTitlesColor@@;\r\n border-right: none;\r\n text-align: left;\r\n vertical-align: middle !important;\r\n white-space: nowrap;\r\n border-right: 1px solid #777;\r\n}\r\n\r\n/* Filters row */\r\ntr.grid-header-row-1 td {\r\n background-color: @@FiltersBgColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Grid Filters */\r\ntable.range-filter {\r\n width: 100%;\r\n}\r\n\r\n.range-filter td {\r\n padding: 0px 0px 2px 2px !important;\r\n border: none !important;\r\n font-size: 8pt !important;\r\n font-weight: normal !important;\r\n text-align: left;\r\n color: #000000 !important;\r\n}\r\n\r\ninput.filter, select.filter, input.filter-active, select.filter-active {\r\n margin-bottom: 0px;\r\n border: 1px solid #aaa;\r\n}\r\n\r\ninput.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\nselect.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.filter, div.filter-active {\r\n background-color: white;\r\n border: 1px solid #AAAAAA;\r\n color: black;\r\n font-weight: normal;\r\n padding: 3px;\r\n}\r\n\r\ndiv.filter-active {\r\n background-color: #FFFF00;\r\n}\r\n\r\ndiv.multioptions_filter {\r\n position: absolute;\r\n z-index: 100;\r\n color: black;\r\n background-color: white;\r\n border: 1px solid black;\r\n padding: 3px 5px;\r\n display: none;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Column titles row */\r\ntr.grid-header-row-0 td {\r\n height: 25px;\r\n font-weight: bold;\r\n background-color: @@ColumnTitlesBgColor@@;\r\n color: @@ColumnTitlesColor@@;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\ntr.grid-header-row-0 td a {\r\n color: @@ColumnTitlesColor@@;\r\n}\r\n\r\ntr.grid-header-row-0 td a:hover {\r\n color: #FFCC00;\r\n}\r\n\r\n\r\n.grid-footer-row td {\r\n background-color: #D7D7D7;\r\n font-weight: bold;\r\n border-right: 1px solid #C9C9C9;\r\n padding: 3px 5px 3px 5px;\r\n}\r\n\r\ntd.grid-header-last-cell, td.grid-data-last-cell, td.grid-footer-last-cell {\r\n border-right: none !important;\r\n}\r\n\r\ntd.grid-data-col-0, td.grid-data-col-0 div {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 {\r\n text-align: center;\r\n vertical-align: middle !important;\r\n}\r\n\r\ntr.grid-header-row-1 td.grid-header-col-1 div {\r\n display: table-cell;\r\n vertical-align: middle;\r\n}\r\n\r\n.grid-status-bar {\r\n border: 1px solid black;\r\n border-top: none;\r\n padding: 0px;\r\n width: 100%;\r\n border-collapse: collapse;\r\n height: 30px;\r\n}\r\n\r\n.grid-status-bar td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* /Scrollable Grids */\r\n\r\n\r\n/* Forms */\r\ntable.edit-form {\r\n border: none;\r\n border-top-width: 0px !important;\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\n.edit-form-odd, .edit-form-even {\r\n padding: 0px;\r\n}\r\n\r\n.subsectiontitle {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #4A92CE;\r\n color: #fff;\r\n height: 25px;\r\n border-top: 1px solid black;\r\n vertical-align: middle;\r\n}\r\n\r\n/* remove top-border from first sub-section element */\r\ntable.edit-form .subsectiontitle:first-child, table.bordered .subsectiontitle:first-child {\r\n border-top-width: 0;\r\n}\r\n\r\n.subsectiontitle td {\r\n vertical-align: middle;\r\n /*padding: 3px 5px 3px 5px;*/\r\n padding: 1px 5px;\r\n}\r\n\r\n.label-cell {\r\n background: #DEE7F6 url(''@@base_url@@/core/admin_templates/img/bgr_input_name_line.gif'') no-repeat right bottom;\r\n font: 12px arial, sans-serif;\r\n padding: 4px 20px;\r\n width: 160px;\r\n}\r\n\r\n.control-mid {\r\n width: 13px;\r\n border-left: 1px solid #7A95C2;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_mid.gif'') repeat-x left bottom;\r\n}\r\n\r\n.control-cell {\r\n font: 11px arial, sans-serif;\r\n padding: 4px 10px 5px 5px;\r\n background: #fff url(''@@base_url@@/core/admin_templates/img/bgr_input_line.gif'') no-repeat left bottom;\r\n width: auto;\r\n vertical-align: middle;\r\n}\r\n\r\n.label-cell-filler {\r\n background: #DEE7F6 none;\r\n}\r\n.control-mid-filler {\r\n background: #fff none;\r\n border-left: 1px solid #7A95C2;\r\n}\r\n.control-cell-filler {\r\n background: #fff none;\r\n}\r\n\r\n.highlight-area, .code-highlight-area {\r\n border: 1px solid black;\r\n padding: 8px;\r\n font-family: monospace !important;\r\n font-size: 12px;\r\n overflow: auto;\r\n}\r\n\r\n.code-highlight-area {\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.error {\r\n color: red;\r\n}\r\n.error-cell {\r\n color: red;\r\n}\r\n\r\n.field-required {\r\n color: red;\r\n}\r\n\r\n.warning-table {\r\n background-color: #F0F1EB;\r\n border: 1px solid #000000;\r\n border-collapse: collapse;\r\n border-top-width: 0px;\r\n}\r\n\r\n.form-notice, .form-warning {\r\n font-size: 11px;\r\n}\r\n\r\n.form-warning {\r\n color: red;\r\n}\r\n\r\n.form-notice {\r\n color: green;\r\n}\r\n\r\n.priority {\r\n color: red;\r\n padding-left: 1px;\r\n padding-right: 1px;\r\n font-size: 11px;\r\n}\r\n\r\n.small-statistics {\r\n font-size: 11px;\r\n color: #707070;\r\n}\r\n\r\n.req-note {\r\n font-style: italic;\r\n color: #333;\r\n}\r\n\r\n#scroll_container table.tableborder {\r\n border-collapse: separate\r\n}\r\n\r\n/* Uploader */\r\n.uploader-queue div.file {\r\n font-size: 11px;\r\n border: 1px solid #7F99C5;\r\n padding: 3px;\r\n background-color: #DEE7F6;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.uploader-queue .left {\r\n float: left;\r\n vertical-align: top;\r\n}\r\n\r\n.uploader-queue .file-label {\r\n margin-left: 5px;\r\n}\r\n\r\n.uploader-queue .preview .delete-checkbox {\r\n margin-top: -3px;\r\n}\r\n\r\n.uploader-queue .progress-container {\r\n margin: 2px 5px 0px 5px;\r\n}\r\n\r\n.uploader-queue .progress-empty {\r\n width: 150px;\r\n height: 9px;\r\n border: 1px solid black;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_left.gif'') repeat-x;\r\n}\r\n\r\n.uploader-queue .progress-full {\r\n height: 9px;\r\n background: url(''@@base_url@@/core/admin_templates/img/progress_done.gif'');\r\n}\r\n\r\n.uploader-queue .thumbnail {\r\n /*margin-bottom: 2px;*/\r\n border: 1px solid black;\r\n background-color: grey;\r\n}\r\n\r\n/* To be sorted */\r\nspan#category_path, span#category_path a {\r\n color: #FFFFFF;\r\n}\r\n\r\nspan#category_path a {\r\n text-decoration: underline;\r\n}\r\n\r\n/* Section title, right to the big icon */\r\n.admintitle {\r\n font-size: 16pt;\r\n font-weight: bold;\r\n color: @@SectionColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Page header (bluebar) */\r\n.page-title td {\r\n background-color: @@TitleBarBgColor@@;\r\n color: @@TitleBarColor@@;\r\n font-size: 11pt;\r\n font-weight: normal;\r\n padding: 2px 8px 2px 8px;\r\n}\r\n\r\n/* Right side of bluebar */\r\n.tablenav, tablenav a {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n\r\n text-decoration: none;\r\n background-color: @@TitleBarBgColor@@;\r\n background-image: none;\r\n}\r\n\r\n/* Section title in the bluebar * -- why ''link''? :S */\r\n.tablenav_link {\r\n font-size: 11pt;\r\n font-weight: bold;\r\n color: @@TitleBarColor@@;\r\n text-decoration: none;\r\n}\r\n\r\n/* Active page in top and bottom bluebars pagination */\r\n.current_page {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n background-color: #fff;\r\n color: #2D79D6;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Other pages and arrows in pagination on blue */\r\n.nav_url {\r\n font-size: 10pt;\r\n font-weight: bold;\r\n color: #fff;\r\n padding: 3px 2px 3px 3px;\r\n}\r\n\r\n/* Tree */\r\n.tree-body {\r\n background-color: @@TreeBgColor@@;\r\n height: 100%\r\n}\r\n\r\n.tree_head.td, .tree_head, .tree_head:hover {\r\n font-weight: bold;\r\n font-size: 10px;\r\n color: #FFFFFF;\r\n font-family: Verdana, Arial;\r\n text-decoration: none;\r\n}\r\n\r\n.tree {\r\n padding: 0px;\r\n border: none;\r\n border-collapse: collapse;\r\n}\r\n\r\n.tree tr td {\r\n padding: 0px;\r\n margin: 0px;\r\n font-family: helvetica, arial, verdana,;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n}\r\n\r\n.tree tr td a {\r\n font-size: 11px;\r\n color: @@TreeColor@@;\r\n font-family: Helvetica, Arial, Verdana;\r\n text-decoration: none;\r\n padding: 2px;\r\n}\r\n\r\n.tree tr td a:hover, .tree tr td a.debug-only-item:hover {\r\n color: @@TreeHoverColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a, .tree tr.highlighted td a.debug-only-item {\r\n color: @@TreeHighColor@@;\r\n background-color: @@TreeHighBgColor@@;\r\n}\r\n\r\n.tree tr.highlighted td a:hover {\r\n color: @@TreeHighHoverColor@@;\r\n}\r\n\r\n.tree tr td a.debug-only-item {\r\n color: grey;\r\n}\r\n\r\n/* Ajax Dropdown */\r\n.suggest-box {\r\n border: 1px solid #999;\r\n background-color: #fff;\r\n}\r\n\r\n.suggest-item, .suggest-item-over {\r\n padding: 1px 2px 0px 2px;\r\n font-family: arial,verdana;\r\n font-size: 12px;\r\n}\r\n\r\n.suggest-item-over {\r\n background-color: #3366CC;\r\n color: #fff;\r\n}\r\n\r\n/* Dashboard Summary Boxes */\r\n.summary-box {\r\n border: 1px solid black;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.summary-box .title {\r\n color: white;\r\n font-weight: bold;\r\n padding: 6px 5px;\r\n vertical-align: middle;\r\n background-color: #4A92CE;\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n.summary-box .content {\r\n padding: 4px;\r\n background-color: #F6F6F6;\r\n}\r\n\r\n.summary-box .group {\r\n border-bottom: 1px solid black;\r\n margin-bottom: 10px;\r\n padding: 0 0 10px 10px;\r\n}\r\n\r\n.summary-box .group.last {\r\n border-width: 0px;\r\n margin-bottom: 0;\r\n padding-bottom: 5px;\r\n}\r\n\r\n.summary-box h4 {\r\n margin: 0;\r\n padding: 0 0 3px 0;\r\n font-size: 11px;\r\n font-weight: bold;\r\n}\r\n\r\n.summary-box .hint {\r\n font-size: 10px;\r\n color: grey;\r\n margin-bottom: 3px;\r\n}\r\n\r\n.summary-box .hint .cache-key {\r\n margin-bottom: 7px;\r\n margin-left: 3px;\r\n}\r\n\r\n.summary-box ul {\r\n margin-top: 5px;\r\n margin-bottom: 3px;\r\n padding-left: 30px;\r\n}\r\n\r\n.summary-box li {\r\n padding-bottom: 4px;\r\n}\r\n\r\nspan.cke_skin_kama {\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n padding: 0px !important;\r\n}\r\n\r\n.cke_wrapper{\r\n border-width: 0px !important;\r\n -moz-border-radius: 0px !important;\r\n -webkit-border-radius: 0px !important;\r\n}', 'in-portal_logo_img.jpg', 'in-portal_logo_img2.jpg', 'in-portal_logo_login.gif', 'a:22:{s:11:"HeadBgColor";a:2:{s:11:"Description";s:27:"Head frame background color";s:5:"Value";s:7:"#007BF4";}s:9:"HeadColor";a:2:{s:11:"Description";s:21:"Head frame text color";s:5:"Value";s:7:"#FFFFFF";}s:14:"SectionBgColor";a:2:{s:11:"Description";s:28:"Section bar background color";s:5:"Value";s:7:"#FFFFFF";}s:12:"SectionColor";a:2:{s:11:"Description";s:22:"Section bar text color";s:5:"Value";s:7:"#2D79D6";}s:12:"HeadBarColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"HeadBarBgColor";a:1:{s:5:"Value";s:7:"#1961B8";}s:13:"TitleBarColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TitleBarBgColor";a:1:{s:5:"Value";s:7:"#2D79D6";}s:14:"ToolbarBgColor";a:1:{s:5:"Value";s:7:"#F0F1EB";}s:14:"FiltersBgColor";a:1:{s:5:"Value";s:7:"#D7D7D7";}s:17:"ColumnTitlesColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:19:"ColumnTitlesBgColor";a:1:{s:5:"Value";s:7:"#999999";}s:8:"OddColor";a:1:{s:5:"Value";s:7:"#000000";}s:10:"OddBgColor";a:1:{s:5:"Value";s:7:"#F6F6F6";}s:9:"EvenColor";a:1:{s:5:"Value";s:7:"#000000";}s:11:"EvenBgColor";a:1:{s:5:"Value";s:7:"#EBEBEB";}s:9:"TreeColor";a:1:{s:5:"Value";s:7:"#000000";}s:14:"TreeHoverColor";a:1:{s:5:"Value";s:7:"#009FF0";}s:13:"TreeHighColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:18:"TreeHighHoverColor";a:1:{s:5:"Value";s:7:"#FFFFFF";}s:15:"TreeHighBgColor";a:1:{s:5:"Value";s:7:"#4A92CE";}s:11:"TreeBgColor";a:1:{s:5:"Value";s:7:"#DCECF6";}}', 1350469652, 1, 1);
INSERT INTO LocalesList VALUES
(1, '0x0436', 'Afrikaans (South Africa)', 'af-ZA', 'Latn', '1252'),
Index: core/install/install_schema.sql
===================================================================
--- core/install/install_schema.sql (revision 15581)
+++ core/install/install_schema.sql (working copy)
@@ -110,6 +110,11 @@
l3_PlainTextBody longtext,
l4_PlainTextBody longtext,
l5_PlainTextBody longtext,
+ l1_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l2_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l3_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l4_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l5_TranslateFrom int(11) NOT NULL DEFAULT '0',
Headers text,
Enabled int(11) NOT NULL DEFAULT '1',
FrontEndOnly tinyint(3) unsigned NOT NULL DEFAULT '0',
@@ -137,7 +142,8 @@
KEY l2_PlainTextBody (l2_PlainTextBody(5)),
KEY l3_PlainTextBody (l3_PlainTextBody(5)),
KEY l4_PlainTextBody (l4_PlainTextBody(5)),
- KEY l5_PlainTextBody (l5_PlainTextBody(5))
+ KEY l5_PlainTextBody (l5_PlainTextBody(5)),
+ KEY l1_TranslateFrom (l1_TranslateFrom)
);
CREATE TABLE SystemEventSubscriptions (
@@ -236,6 +242,11 @@
l3_ColumnTranslation text,
l4_ColumnTranslation text,
l5_ColumnTranslation text,
+ l1_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l2_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l3_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l4_TranslateFrom int(11) NOT NULL DEFAULT '0',
+ l5_TranslateFrom int(11) NOT NULL DEFAULT '0',
PhraseType int(11) NOT NULL DEFAULT '0',
LastChanged int(10) unsigned DEFAULT NULL,
LastChangeIP varchar(15) NOT NULL DEFAULT '',
@@ -245,7 +256,8 @@
KEY PhraseKey (PhraseKey),
KEY l1_Translation (l1_Translation(5)),
KEY l1_HintTranslation (l1_HintTranslation(5)),
- KEY l1_ColumnTranslation (l1_ColumnTranslation(5))
+ KEY l1_ColumnTranslation (l1_ColumnTranslation(5)),
+ KEY l1_TranslateFrom (l1_TranslateFrom)
);
CREATE TABLE PhraseCache (
Index: core/install/install_toolkit.php
===================================================================
--- core/install/install_toolkit.php (revision 15581)
+++ core/install/install_toolkit.php (working copy)
@@ -438,7 +438,11 @@
$language_import_helper = $this->Application->recallObject('LanguageImportHelper');
/* @var $language_import_helper LanguageImportHelper */
- $language_import_helper->performImport($lang_file, '|0|1|2|', '', $upgrade ? LANG_SKIP_EXISTING : LANG_OVERWRITE_EXISTING);
+ if ( !$upgrade ) {
+ $language_import_helper->setOption(LanguageImportHelper::OVERWRITE_EXISTING);
+ }
+
+ $language_import_helper->performImport($lang_file, '|0|1|2|', '');
}
/**
Index: core/install/upgrades.css
===================================================================
--- core/install/upgrades.css (revision 15581)
+++ core/install/upgrades.css (working copy)
@@ -817,3 +817,29 @@
}
/* Right side of bluebar */
+
+# ===== v 5.3.0-B1 =====
+Index: style_template.css
+===================================================================
+--- style_template.css (revision 15437)
++++ style_template.css (working copy)
+@@ -498,6 +498,18 @@
+ background: #fff none;
+ }
+
++.highlight-area, .code-highlight-area {
++ border: 1px solid black;
++ padding: 8px;
++ font-family: monospace !important;
++ font-size: 12px;
++ overflow: auto;
++}
++
++.code-highlight-area {
++ background-color: #F6F6F6;
++}
++
+ .error {
+ color: red;
+ }
+
\ No newline at end of file
Index: core/install/upgrades.php
===================================================================
--- core/install/upgrades.php (revision 15581)
+++ core/install/upgrades.php (working copy)
@@ -2295,4 +2295,23 @@
// drop RunInterval column
$this->Conn->Query('ALTER TABLE ' . $table_name . ' DROP RunInterval');
}
+
+ /**
+ * Update to 5.3.0-B1
+ *
+ * @param string $mode when called mode {before, after)
+ */
+ public function Upgrade_5_3_0_B1($mode)
+ {
+ if ( $mode != 'before' ) {
+ return;
+ }
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ // add new ml columns to phrases/e-mail events
+ $ml_helper->createFields('phrases');
+ $ml_helper->createFields('emailevents');
+ }
}
\ No newline at end of file
Index: core/install/upgrades.sql
===================================================================
--- core/install/upgrades.sql (revision 15581)
+++ core/install/upgrades.sql (working copy)
@@ -2860,3 +2860,19 @@
# ===== v 5.3.0-B1 =====
ALTER TABLE ScheduledTasks ADD Settings TEXT NULL;
ALTER TABLE Themes ADD ImageResizeRules TEXT NULL;
+
+DELETE FROM UserPersistentSessionData WHERE VariableName = 'emailevents[Emails]columns_.';
+
+INSERT INTO <%TABLE_PREFIX%>SystemCache (VarName, Data)
+SELECT 'tmp_translation' AS VarName, l<%PRIMARY_LANGUAGE%>_Translation AS Data
+FROM <%TABLE_PREFIX%>LanguageLabels
+WHERE PhraseKey = 'LC_IMPORTLANG_PHRASEWARNING';
+
+UPDATE <%TABLE_PREFIX%>LanguageLabels
+SET
+ Phrase = 'la_fld_ImportOverwrite',
+ PhraseKey = 'LA_FLD_IMPORTOVERWRITE',
+ l<%PRIMARY_LANGUAGE%>_HintTranslation = (SELECT Data FROM <%TABLE_PREFIX%>SystemCache WHERE VarName = 'tmp_translation' LIMIT 1)
+WHERE PhraseKey = 'LA_PROMPT_OVERWRITEPHRASES';
+
+DELETE FROM LanguageLabels WHERE PhraseKey = 'LC_IMPORTLANG_PHRASEWARNING';
Index: core/kernel/constants.php
===================================================================
--- core/kernel/constants.php (revision 15581)
+++ core/kernel/constants.php (working copy)
@@ -196,3 +196,8 @@
const SILENT = 2;
const AUTOMATIC = 3;
}
+
+class TranslationSaveMode {
+ const SYNC_WITH_PRIMARY = 1;
+ const MAKE_PRIMARY = 2;
+}
\ No newline at end of file
Index: core/kernel/kbase.php
===================================================================
--- core/kernel/kbase.php (revision 15581)
+++ core/kernel/kbase.php (working copy)
@@ -441,16 +441,21 @@
protected function addCalculatedFields($query, $aggregated = 1)
{
$fields = $this->getCalculatedFields($aggregated);
- if ($fields) {
+ if ( $fields ) {
$sql = Array ();
+ // inside calculated field "%2$s" is current language
$fields = str_replace('%2$s', $this->Application->GetVar('m_lang'), $fields);
+ // can't use "%3$s" as usual, because it's already populated in kDBBase::replaceModePrefix() across whole query
+ $fields = str_replace('%4$s', $this->Application->GetDefaultLanguageId(), $fields);
+
foreach ($fields as $field_name => $field_expression) {
- $sql[] = '('.$field_expression.') AS `'.$field_name.'`';
+ $sql[] = '(' . $field_expression . ') AS `' . $field_name . '`';
}
- $sql = implode(',',$sql);
+ $sql = implode(',', $sql);
- return $this->Application->ReplaceLanguageTags( str_replace('%2$s', ','.$sql, $query) );
+ // inside sql "%2$s" is placeholder for calculated fields
+ return $this->Application->ReplaceLanguageTags(str_replace('%2$s', ',' . $sql, $query));
}
return str_replace('%2$s', '', $query);
Index: core/units/email_events/email_event_tp.php
===================================================================
--- core/units/email_events/email_event_tp.php (revision 15581)
+++ core/units/email_events/email_event_tp.php (working copy)
@@ -98,4 +98,43 @@
$object->SetFieldOptions('RecipientType', $field_options);
}
+ /**
+ * Determine if primary translation should be shown
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function ShowSourceLanguage($params)
+ {
+ if ( $this->IsNewItem($params) ) {
+ return false;
+ }
+
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return !$ml_helper->editingInSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+ }
+
+ /**
+ * Shows field label with %s replaced with source translation language
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function SourceLanguageTitle($params)
+ {
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return $ml_helper->replaceSourceLanguage($object, $params['label']);
+ }
}
\ No newline at end of file
Index: core/units/email_events/email_events_config.php
===================================================================
--- core/units/email_events/email_events_config.php (revision 15581)
+++ core/units/email_events/email_events_config.php (working copy)
@@ -51,7 +51,7 @@
'email_message_edit' => Array (
'prefixes' => Array ('emailevents'),
'format' => '#emailevents_status# - #emailevents_titlefield# - !la_section_General!',
- 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'toolbar_buttons' => Array ('select', 'setprimary', 'cancel', 'reset_edit', 'prev', 'next'),
),
'email_message_edit_settings' => Array (
@@ -73,6 +73,8 @@
),
),
+ 'CheckSimulatniousEdit' => true,
+
'PermSection' => Array ('main' => 'in-portal:configemail'),
'Sections' => Array (
@@ -89,6 +91,21 @@
'TableName' => TABLE_PREFIX . 'EmailEvents',
+ 'CalculatedFields' => Array (
+ '' => Array (
+ 'SourceSubject' => 'l%4$s_Subject',
+ 'SourceHtmlBody' => 'l%4$s_HtmlBody',
+ 'SourcePlainTextBody' => 'l%4$s_PlainTextBody',
+
+ 'CurrentSubject' => 'l%5$s_Subject',
+ 'CurrentHtmlBody' => 'l%5$s_HtmlBody',
+ 'CurrentPlainTextBody' => 'l%5$s_PlainTextBody',
+
+ 'TranslationInSync' => 'IF(l%5$s_TranslateFrom = 0, 1, 0)',
+ 'TranslateFromLanguage' => 'l%5$s_TranslateFrom',
+ ),
+ ),
+
'ListSQLs' => Array (
'' => ' SELECT %1$s.* %2$s FROM %1$s',
),
@@ -168,6 +185,12 @@
'default' => null
),
+ 'TranslateFrom' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kMultiLanguage', 'db_type' => 'int', 'index_type' => 'int',
+ 'not_null' => 1, 'default' => 0
+ ),
+
'Enabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
@@ -222,6 +245,25 @@
'Tag' => Array ('type' => 'string', 'default' => ''),
'Replacement' => Array ('type' => 'string', 'default' => ''),
'ReplacementTagsXML' => Array ('type' => 'string', 'default' => ''),
+
+ 'SourceSubject' => Array ('type' => 'string', 'default' => ''),
+ 'SourceHtmlBody' => Array ('type' => 'string', 'default' => ''),
+ 'SourcePlainTextBody' => Array ('type' => 'string', 'default' => ''),
+
+ 'CurrentSubject' => Array ('type' => 'string', 'default' => ''),
+ 'CurrentHtmlBody' => Array ('type' => 'string', 'default' => ''),
+ 'CurrentPlainTextBody' => Array ('type' => 'string', 'default' => ''),
+
+ 'TranslationInSync' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0,
+ ),
+ 'TranslateFromLanguage' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'Languages ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId',
+ 'default' => 0,
+ ),
),
'Grids' => Array (
@@ -253,13 +295,15 @@
'Fields' => Array (
'EventId' => Array ('title' => 'column:la_fld_Id', 'filter_block' => 'grid_range_filter', 'width' => 60, ),
'Event' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ),
- 'Subject' => Array ('filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ),
+ 'CurrentSubject' => Array ('title' => 'column:la_fld_Subject', 'filter_block' => 'grid_like_filter', 'no_special' => 0, 'width' => 300, ),
'Description' => Array ('filter_block' => 'grid_like_filter', 'width' => 250, ),
'Type' => Array ('filter_block' => 'grid_options_filter', 'width' => 60, ),
'Enabled' => Array ('filter_block' => 'grid_options_filter', 'width' => 70, ),
'Module' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, ),
'FrontEndOnly' => Array ('filter_block' => 'grid_options_filter', 'width' => 120, 'hidden' => 1),
'LastChanged' => Array ('title' => 'column:la_fld_Modified', 'filter_block' => 'grid_date_range_filter', 'width' => 150),
+ 'TranslationInSync' => Array ('filter_block' => 'grid_options_filter', 'width' => 100, 'hidden' => 1),
+ 'TranslateFromLanguage' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, 'hidden' => 1),
),
),
),
Index: core/units/email_events/email_events_event_handler.php
===================================================================
--- core/units/email_events/email_events_event_handler.php (revision 15581)
+++ core/units/email_events/email_events_event_handler.php (working copy)
@@ -297,26 +297,47 @@
{
parent::OnAfterConfigRead($event);
- $options = Array ();
+ $fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
+ $fields['Module']['options'] = $this->_getModules();
- foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
- if ( $module_name == 'In-Portal' ) {
- continue;
- }
-
- $options[$module_name] = $module_name;
+ if ( $this->Application->findModule('Name', 'Custom') ) {
+ $fields['Module']['default'] = 'Custom';
}
- $fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
- $fields['Module']['options'] = $options;
$this->Application->setUnitOption($event->Prefix, 'Fields', $fields);
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $ml_helper->replaceMLCalculatedFields($event);
+
if ( $this->Application->GetVar('regional') ) {
$this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true);
}
}
/**
+ * Returns modules, where e-mail event can be added to
+ *
+ * @return Array
+ * @access protected
+ */
+ protected function _getModules()
+ {
+ $ret = Array ();
+
+ foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
+ if ( $module_name == 'In-Portal' ) {
+ continue;
+ }
+
+ $ret[$module_name] = $module_name;
+ }
+
+ return $ret;
+ }
+
+ /**
* Prepare temp tables and populate it
* with items selected in the grid
*
@@ -371,6 +392,16 @@
$object->SetDBField('ReplacementTagsXML', $xml);
$this->setRequired($event);
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $translation_fields = $this->getTranslationFields();
+ $source_language = $ml_helper->getSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+
+ foreach ($translation_fields as $translation_field) {
+ $object->SetDBField('Source' . $translation_field, $object->GetDBField('l' . $source_language . '_' . $translation_field));
+ }
}
/**
@@ -454,8 +485,8 @@
*/
function translationChanged($object)
{
+ $translation_fields = $this->getTranslationFields();
$changed_fields = array_keys($object->GetChangedFields());
- $translation_fields = Array ('Subject', 'HtmlBody', 'PlainTextBody');
foreach ($changed_fields as $changed_field) {
$changed_field = preg_replace('/^l[\d]+_/', '', $changed_field);
@@ -469,6 +500,17 @@
}
/**
+ * Returns fields, that can be translated
+ *
+ * @return Array
+ * @access protected
+ */
+ protected function getTranslationFields()
+ {
+ return Array ('Subject', 'HtmlBody', 'PlainTextBody');
+ }
+
+ /**
* Don't allow to enable/disable events in non-debug mode
*
* @param kEvent $event
@@ -726,4 +768,21 @@
$temp_handler->DeleteItems('system-event-subscription', '', $ids);
}
+
+ /**
+ * Updates translation state for all saved phrases
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeCopyToLive(kEvent $event)
+ {
+ parent::OnBeforeCopyToLive($event);
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $ml_helper->updateTranslationState($event);
+ }
}
\ No newline at end of file
Index: core/units/helpers/deployment_helper.php
===================================================================
--- core/units/helpers/deployment_helper.php (revision 15581)
+++ core/units/helpers/deployment_helper.php (working copy)
@@ -229,7 +229,7 @@
$this->out('Importing LanguagePack ... ');
$filename = $this->getModuleFile('english.lang');
- $language_import_helper->performImport($filename, '|0|1|2|', $this->moduleName, LANG_SKIP_EXISTING);
+ $language_import_helper->performImport($filename, '|0|1|2|', $this->moduleName);
$this->displayStatus('OK');
}
Index: core/units/helpers/language_import_helper.php
===================================================================
--- core/units/helpers/language_import_helper.php (revision 15581)
+++ core/units/helpers/language_import_helper.php (working copy)
@@ -41,12 +41,19 @@
defined('FULL_PATH') or die('restricted access!');
- define('LANG_OVERWRITE_EXISTING', 1);
- define('LANG_SKIP_EXISTING', 2);
-
class LanguageImportHelper extends kHelper {
/**
+ * Overwrite existing translations during import
+ */
+ const OVERWRITE_EXISTING = 1;
+
+ /**
+ * New translations are added as synced with other languages
+ */
+ const SYNC_ADDED = 2;
+
+ /**
* Current Language in import
*
* @var LanguagesItem
@@ -72,7 +79,7 @@
*
* @var int
*/
- var $import_mode = LANG_SKIP_EXISTING;
+ var $_importOptions = 0;
/**
* Language IDs, that were imported
@@ -155,15 +162,44 @@
}
/**
+ * Tells if given option is enabled
+ *
+ * @param int $option_bit
+ * @return bool
+ * @access protected
+ */
+ protected function hasOption($option_bit)
+ {
+ return ($this->_importOptions & $option_bit) == $option_bit;
+ }
+
+ /**
+ * Sets import option
+ *
+ * @param int $option_bit
+ * @param bool $enabled
+ * @return void
+ * @access public
+ */
+ public function setOption($option_bit, $enabled = true)
+ {
+ if ( $enabled ) {
+ $this->_importOptions |= $option_bit;
+ }
+ else {
+ $this->_importOptions = $this->_importOptions & ~$option_bit;
+ }
+ }
+
+ /**
* Performs import of given language pack (former Parse method)
*
* @param string $filename
* @param string $phrase_types
* @param Array $module_ids
- * @param int $import_mode
* @return bool
*/
- function performImport($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING)
+ function performImport($filename, $phrase_types, $module_ids)
{
// define the XML parsing routines/functions to call based on the handler path
if (!file_exists($filename) || !$phrase_types /*|| !$module_ids*/) {
@@ -184,14 +220,13 @@
// $module_ids = explode('|', substr($module_ids, 1, -1) );
$this->phrase_types_allowed = array_flip($phrase_types);
- $this->import_mode = $import_mode;
$this->_parseXML($filename);
// copy data from temp tables to live
foreach ($this->_languages as $language_id) {
- $this->_performUpgrade($language_id, 'phrases', 'PhraseKey', Array ('l%s_Translation', 'l%s_HintTranslation', 'l%s_ColumnTranslation', 'PhraseType'));
- $this->_performUpgrade($language_id, 'emailevents', 'EventId', Array ('l%s_Subject', 'Headers', 'l%s_HtmlBody', 'l%s_PlainTextBody'));
+ $this->_performUpgrade($language_id, 'phrases', 'PhraseKey', Array ('l%s_Translation', 'l%s_HintTranslation', 'l%s_ColumnTranslation', 'l%s_TranslateFrom', 'PhraseType'));
+ $this->_performUpgrade($language_id, 'emailevents', 'EventId', Array ('l%s_Subject', 'Headers', 'l%s_HtmlBody', 'l%s_PlainTextBody', 'l%s_TranslateFrom'));
$this->_performUpgrade($language_id, 'country-state', 'CountryStateId', Array ('l%s_Name'));
}
@@ -535,15 +570,15 @@
$live_records = $this->_getTableData($language_id, $prefix, $unique_field, $data_fields[0], false);
$temp_records = $this->_getTableData($language_id, $prefix, $unique_field, $data_fields[0], true);
- if (!$temp_records) {
+ if ( !$temp_records ) {
// no data for given language
- return ;
+ return;
}
// perform insert for records, that are missing in live table
$to_insert = array_diff($temp_records, $live_records);
- if ($to_insert) {
+ if ( $to_insert ) {
$to_insert = $this->Conn->qstrArray($to_insert);
$sql = 'INSERT INTO ' . $this->Application->getUnitOption($prefix, 'TableName') . '
@@ -559,7 +594,7 @@
// perform update for records, that are present in live table
$to_update = array_diff($temp_records, $to_insert);
- if ($to_update) {
+ if ( $to_update ) {
$to_update = $this->Conn->qstrArray($to_update);
$sql = 'UPDATE ' . $this->Application->getUnitOption($prefix, 'TableName') . ' live
@@ -582,19 +617,19 @@
$unique_field . ' IN (' . implode(',', $to_update) . ')',
);
- if ($this->import_mode == LANG_SKIP_EXISTING) {
+ if ( !$this->hasOption(self::OVERWRITE_EXISTING) ) {
// empty OR not set
$data_field = sprintf($data_fields[0], $language_id);
$where_clause[] = '(' . $data_field . ' = "") OR (' . $data_field . ' IS NULL)';
}
- if ($where_clause) {
+ if ( $where_clause ) {
$sql .= "\n" . 'WHERE (' . implode(') AND (', $where_clause) . ')';
}
$this->Conn->Query($sql);
- if ($this->Conn->getAffectedRows() > 0) {
+ if ( $this->Conn->getAffectedRows() > 0 ) {
// existing records were updated
$this->changedPrefixes[] = $prefix;
}
@@ -914,6 +949,9 @@
{
static $other_translations = Array ();
+ $primary_language = $this->Application->GetDefaultLanguageId();
+ $translate_from = $this->hasOption(self::SYNC_ADDED) || $primary_language == $language_id ? 0 : $primary_language;
+
if ( $this->Application->isDebugMode() ) {
$this->Application->Debugger->profileStart('L[' . $language_id . ']P', 'Language: ' . $language_id . '; Phrases Import');
}
@@ -951,12 +989,14 @@
$other_translations[$phrase_key]['l' . $other_language_id . '_Translation'] = '';
$other_translations[$phrase_key]['l' . $other_language_id . '_HintTranslation'] = '';
$other_translations[$phrase_key]['l' . $other_language_id . '_ColumnTranslation'] = '';
+ $other_translations[$phrase_key]['l' . $other_language_id . '_TranslateFrom'] = 0;
}
}
$other_translations[$phrase_key]['l' . $language_id . '_Translation'] = $translation;
$other_translations[$phrase_key]['l' . $language_id . '_HintTranslation'] = $hint_translation;
$other_translations[$phrase_key]['l' . $language_id . '_ColumnTranslation'] = $column_translation;
+ $other_translations[$phrase_key]['l' . $language_id . '_TranslateFrom'] = $translate_from;
$fields_hash = array_merge($fields_hash, $other_translations[$phrase_key]);
$this->Conn->doInsert($fields_hash, $this->_tables['phrases'], 'REPLACE', false);
@@ -981,6 +1021,9 @@
{
static $other_translations = Array ();
+ $primary_language = $this->Application->GetDefaultLanguageId();
+ $translate_from = $this->hasOption(self::SYNC_ADDED) || $primary_language == $language_id ? 0 : $primary_language;
+
if ( $this->Application->isDebugMode() ) {
$this->Application->Debugger->profileStart('L[' . $language_id . ']E', 'Language: ' . $language_id . '; Events Import');
}
@@ -1022,12 +1065,14 @@
$other_translations[$event_id]['l' . $other_language_id . '_Subject'] = '';
$other_translations[$event_id]['l' . $other_language_id . '_HtmlBody'] = '';
$other_translations[$event_id]['l' . $other_language_id . '_PlainTextBody'] = '';
+ $other_translations[$event_id]['l' . $other_language_id . '_TranslateFrom'] = 0;
}
}
$other_translations[$event_id]['l' . $language_id . '_Subject'] = $parsed['Subject'];
$other_translations[$event_id]['l' . $language_id . '_HtmlBody'] = $parsed['HtmlBody'];
$other_translations[$event_id]['l' . $language_id . '_PlainTextBody'] = $parsed['PlainTextBody'];
+ $other_translations[$event_id]['l' . $language_id . '_TranslateFrom'] = $translate_from;
if ( $parsed['Headers'] ) {
$other_translations[$event_id]['Headers'] = $parsed['Headers'];
@@ -1124,11 +1169,11 @@
WHERE PackName = ' . $this->Conn->qstr($fields_hash['PackName']);
$language_id = $this->Conn->GetOne($sql);
- if ($language_id) {
+ if ( $language_id ) {
// 2. language found -> update, when allowed
$this->lang_object->Load($language_id);
- if ($this->import_mode == LANG_OVERWRITE_EXISTING) {
+ if ( $this->hasOption(self::OVERWRITE_EXISTING) ) {
// update live language record based on data from xml
$this->lang_object->SetFieldsFromHash($fields_hash);
$this->lang_object->Update();
@@ -1139,10 +1184,10 @@
$this->lang_object->SetFieldsFromHash($fields_hash);
$this->lang_object->SetDBField('Enabled', STATUS_ACTIVE);
- if ($this->lang_object->Create()) {
+ if ( $this->lang_object->Create() ) {
$language_id = $this->lang_object->GetID();
- if (defined('IS_INSTALL') && IS_INSTALL) {
+ if ( defined('IS_INSTALL') && IS_INSTALL ) {
// language created during install becomes admin interface language
$this->lang_object->setPrimary(true, true);
}
@@ -1150,7 +1195,7 @@
}
// 4. collect ID of every processed language
- if (!in_array($language_id, $this->_languages)) {
+ if ( !in_array($language_id, $this->_languages) ) {
$this->_languages[kUtil::crc32($fields_hash['PackName'])] = $language_id;
}
Index: core/units/helpers/multilanguage_helper.php
===================================================================
--- core/units/helpers/multilanguage_helper.php (revision 15581)
+++ core/units/helpers/multilanguage_helper.php (working copy)
@@ -458,4 +458,133 @@
return (string)$phrase_type;
}
+
+ /**
+ * Allows usage of
+ *
+ * @param kEvent $event
+ * @return void
+ * @access public
+ */
+ public function replaceMLCalculatedFields(kEvent $event)
+ {
+ $editing_language = $this->getEditingLanguage();
+
+ $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields', Array ());
+ /* @var $calculated_fields Array */
+
+ foreach ($calculated_fields as $special => $fields) {
+ foreach ($fields as $field_name => $field_expression) {
+ $calculated_fields[$special][$field_name] = str_replace('%5$s', $editing_language, $field_expression);
+ }
+ }
+
+ $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields);
+ }
+
+ /**
+ * Returns language, that is being edited or current language
+ *
+ * @return int
+ * @access public
+ */
+ public function getEditingLanguage()
+ {
+ $language_id = $this->Application->GetVar('lang_id');
+
+ if ( !$language_id ) {
+ $language_id = $this->Application->GetVar('m_lang');
+ }
+
+ return $language_id;
+ }
+
+ /**
+ * Determines if we're editing phrase/e-mail event on it's source language
+ *
+ * @param int $source_language
+ * @return bool
+ * @access public
+ */
+ public function editingInSourceLanguage($source_language)
+ {
+ return $this->getSourceLanguage($source_language) == $this->getEditingLanguage();
+ }
+
+ /**
+ * Replaces source language in given label translation
+ *
+ * @param kDBItem $object
+ * @param string $label
+ * @return string
+ * @access public
+ */
+ public function replaceSourceLanguage(kDBItem $object, $label)
+ {
+ $ret = $this->Application->Phrase($label);
+ $options = $object->GetFieldOption('TranslateFromLanguage', 'options');
+ $source_language = $this->getSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+
+ return sprintf($ret, $options[$source_language]);
+ }
+
+ /**
+ * Ensures, that primary language is used, when no translation is needed
+ *
+ * @param int $source_language
+ * @return bool
+ * @access public
+ */
+ public function getSourceLanguage($source_language)
+ {
+ if ( !$source_language ) {
+ $source_language = $this->Application->GetDefaultLanguageId();
+ }
+
+ return $source_language;
+ }
+
+ /**
+ * Translation synchronization state management
+ *
+ * @param kEvent $event
+ * @return void
+ * @access public
+ * @throws InvalidArgumentException
+ */
+ public function updateTranslationState(kEvent $event)
+ {
+ if ( $event->Name != 'OnBeforeCopyToLive' ) {
+ throw new InvalidArgumentException('Unsupported "' . (string)$event . '" event');
+ }
+
+ $object = $event->getObject(Array ('skip_autoload' => true));
+ /* @var $object kDBItem */
+
+ $object->SwitchToTemp();
+ $object->Load($event->getEventParam('id'));
+
+ $save_mode = $this->Application->GetVar('translation_save_mode');
+
+ if ( $save_mode === false ) {
+ return;
+ }
+
+ $editing_language = $this->getEditingLanguage();
+
+ if ( $save_mode == TranslationSaveMode::SYNC_WITH_PRIMARY ) {
+ $object->SetDBField('l' . $editing_language . '_TranslateFrom', 0);
+ }
+ else {
+ $languages = $this->getLanguages();
+
+ foreach ($languages as $language_id) {
+ $object->SetDBField('l' . $language_id . '_TranslateFrom', $language_id == $editing_language ? 0 : $editing_language);
+ }
+ }
+
+ if ( $object->GetChangedFields() ) {
+ $object->Update();
+ }
+ }
}
Index: core/units/helpers/themes_helper.php
===================================================================
--- core/units/helpers/themes_helper.php (revision 15581)
+++ core/units/helpers/themes_helper.php (working copy)
@@ -181,7 +181,7 @@
$lang_file = $theme_path . '/' . $module_info['TemplatePath'] . '_install/english.lang';
if ( file_exists($lang_file) ) {
- $language_import_helper->performImport($lang_file, '|0|', '', LANG_SKIP_EXISTING);
+ $language_import_helper->performImport($lang_file, '|0|', '');
}
}
}
Index: core/units/languages/languages_event_handler.php
===================================================================
--- core/units/languages/languages_event_handler.php (revision 15581)
+++ core/units/languages/languages_event_handler.php (working copy)
@@ -555,13 +555,16 @@
$language_import_helper = $this->Application->recallObject('LanguageImportHelper');
/* @var $language_import_helper LanguageImportHelper */
- $language_import_helper->performImport(
- $filename,
- $object->GetDBField('PhraseType'),
- $object->GetDBField('Module'),
- $object->GetDBField('ImportOverwrite') ? LANG_OVERWRITE_EXISTING : LANG_SKIP_EXISTING
- );
+ if ( $object->GetDBField('ImportOverwrite') ) {
+ $language_import_helper->setOption(LanguageImportHelper::OVERWRITE_EXISTING);
+ }
+ if ( $object->GetDBField('ImportSynced') ) {
+ $language_import_helper->setOption(LanguageImportHelper::SYNC_ADDED);
+ }
+
+ $language_import_helper->performImport($filename, $object->GetDBField('PhraseType'), $object->GetDBField('Module'));
+
// delete uploaded language pack after import is finished
unlink($filename);
Index: core/units/logs/email_logs/email_log_eh.php
===================================================================
--- core/units/logs/email_logs/email_log_eh.php (revision 15581)
+++ core/units/logs/email_logs/email_log_eh.php (working copy)
@@ -100,7 +100,7 @@
$object = $event->getObject();
/* @var $object kDBItem */
- echo $object->GetDBField('HtmlBody');
+ echo '<html><body style="font-size: 14px;">' . $object->GetDBField('HtmlBody') . '</body></html>';
}
/**
Index: core/units/mailing_lists/mailing_list_eh.php
===================================================================
--- core/units/mailing_lists/mailing_list_eh.php (revision 15581)
+++ core/units/mailing_lists/mailing_list_eh.php (working copy)
@@ -397,6 +397,6 @@
$object = $event->getObject();
/* @var $object kDBItem */
- echo $object->GetDBField('MessageHtml');
+ echo '<html><body style="font-size: 14px;">' . $object->GetDBField('MessageHtml') . '</body></html>';
}
}
\ No newline at end of file
Index: core/units/phrases/phrase_tp.php
===================================================================
--- core/units/phrases/phrase_tp.php (revision 15581)
+++ core/units/phrases/phrase_tp.php (working copy)
@@ -58,4 +58,44 @@
return array_key_exists($module, $cache) ? $cache[$module] : 0;
}
+
+ /**
+ * Determine if primary translation should be shown
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function ShowSourceLanguage($params)
+ {
+ if ( $this->IsNewItem($params) ) {
+ return false;
+ }
+
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return !$ml_helper->editingInSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+ }
+
+ /**
+ * Shows field label with %s replaced with source translation language
+ *
+ * @param Array $params
+ * @return string
+ * @access protected
+ */
+ protected function SourceLanguageTitle($params)
+ {
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ return $ml_helper->replaceSourceLanguage($object, $params['label']);
+ }
}
\ No newline at end of file
Index: core/units/phrases/phrases_config.php
===================================================================
--- core/units/phrases/phrases_config.php (revision 15581)
+++ core/units/phrases/phrases_config.php (working copy)
@@ -55,10 +55,12 @@
'phrase_edit_single' => Array (
'prefixes' => Array ('phrases'), 'format' => '#phrases_status# #phrases_titlefield#',
- 'toolbar_buttons' => Array ('select', 'cancel', 'reset_edit', 'prev', 'next'),
+ 'toolbar_buttons' => Array ('select', 'setprimary', 'cancel', 'reset_edit', 'prev', 'next'),
),
),
+ 'CheckSimulatniousEdit' => true,
+
'PermSection' => Array ('main' => 'in-portal:phrases'),
'Sections' => Array (
@@ -69,9 +71,7 @@
'label' => 'la_title_Phrases',
'url' => Array ('t' => 'languages/phrase_list', 'pass' => 'm'),
'permissions' => Array ('view', 'add', 'edit', 'delete'),
-// 'perm_prefix' => 'lang',
'priority' => 4,
-// 'show_mode' => smSUPER_ADMIN,
'type' => stTREE,
),
),
@@ -91,9 +91,17 @@
'CalculatedFields' => Array (
'' => Array (
'PrimaryTranslation' => 'l%4$s_Translation',
+
+ 'SourceTranslation' => 'l%4$s_Translation',
+ 'SourceHintTranslation' => 'l%4$s_HintTranslation',
+ 'SourceColumnTranslation' => 'l%4$s_ColumnTranslation',
+
'CurrentTranslation' => 'l%5$s_Translation',
'CurrentHintTranslation' => 'l%5$s_HintTranslation',
'CurrentColumnTranslation' => 'l%5$s_ColumnTranslation',
+
+ 'TranslationInSync' => 'IF(l%5$s_TranslateFrom = 0, 1, 0)',
+ 'TranslateFromLanguage' => 'l%5$s_TranslateFrom',
),
),
@@ -118,6 +126,11 @@
'Translation' => Array ('type' => 'string', 'formatter' => 'kMultiLanguage', 'required' => 1, 'using_fck' => 1, 'default' => NULL, 'db_type' => 'text'),
'HintTranslation' => Array ('type' => 'string', 'formatter' => 'kMultiLanguage', 'using_fck' => 1, 'default' => NULL, 'db_type' => 'text'),
'ColumnTranslation' => Array ('type' => 'string', 'formatter' => 'kMultiLanguage', 'using_fck' => 1, 'default' => NULL, 'db_type' => 'text'),
+ 'TranslateFrom' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kMultiLanguage', 'db_type' => 'int', 'index_type' => 'int',
+ 'not_null' => 1, 'default' => 0
+ ),
'PhraseType' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_PhraseType_Front', 1 => 'la_PhraseType_Admin', 2 => 'la_PhraseType_Both'), 'use_phrases' => 1,
@@ -134,10 +147,25 @@
'VirtualFields' => Array (
'PrimaryTranslation' => Array ('type' => 'string', 'default' => ''),
+
+ 'SourceTranslation' => Array ('type' => 'string', 'default' => ''),
+ 'SourceHintTranslation' => Array ('type' => 'string', 'default' => ''),
+ 'SourceColumnTranslation' => Array ('type' => 'string', 'default' => ''),
+
'CurrentTranslation' => Array ('type' => 'string', 'default' => ''),
'CurrentHintTranslation' => Array ('type' => 'string', 'default' => ''),
'CurrentColumnTranslation' => Array ('type' => 'string', 'default' => ''),
+ 'TranslationInSync' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0,
+ ),
+ 'TranslateFromLanguage' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'Languages ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId',
+ 'default' => 0,
+ ),
// for language pack import/export
'LangFile' => Array (
'type' => 'string',
@@ -147,13 +175,14 @@
),
'ImportOverwrite' => Array (
'type' => 'int',
- 'formatter' => 'kOptionsFormatter',
- 'options' => Array(
- 0 => 'la_No',
- 1 => 'la_Yes',
- ),
- 'use_phrases' => 1, 'default' => 0,
+ 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 0,
),
+ 'ImportSynced' => Array (
+ 'type' => 'int',
+ 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1,
+ 'default' => 1,
+ ),
'DoNotEncode' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
@@ -205,11 +234,13 @@
'PhraseId' => Array ('title' => 'column:la_fld_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter', 'width' => 50),
'Phrase' => Array ('title' => 'la_col_Label', 'filter_block' => 'grid_like_filter', 'width' => 170),
'CurrentTranslation' => Array ('title' => 'column:la_fld_Phrase', 'filter_block' => 'grid_like_filter', 'width' => 180),
+ 'CurrentHintTranslation' => Array ('title' => 'la_col_HintPhrase', 'filter_block' => 'grid_like_filter', 'width' => 200, 'hidden' => 1),
+ 'CurrentColumnTranslation' => Array ('title' => 'la_col_ColumnPhrase', 'filter_block' => 'grid_like_filter', 'width' => 200, 'hidden' => 1),
'PhraseType' => Array ('title' => 'column:la_fld_Location', 'filter_block' => 'grid_multioptions_filter', 'width' => 80),
'LastChanged' => Array ('title' => 'column:la_fld_Modified', 'filter_block' => 'grid_date_range_filter', 'width' => 145),
'Module' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100),
- 'CurrentHintTranslation' => Array ('title' => 'la_col_HintPhrase', 'width' => 200, 'hidden' => 1),
- 'CurrentColumnTranslation' => Array ('title' => 'la_col_ColumnPhrase', 'width' => 200, 'hidden' => 1),
+ 'TranslationInSync' => Array ('filter_block' => 'grid_options_filter', 'width' => 100, 'hidden' => 1),
+ 'TranslateFromLanguage' => Array ('filter_block' => 'grid_multioptions_filter', 'width' => 100, 'hidden' => 1),
),
),
),
Index: core/units/phrases/phrases_event_handler.php
===================================================================
--- core/units/phrases/phrases_event_handler.php (revision 15581)
+++ core/units/phrases/phrases_event_handler.php (working copy)
@@ -381,8 +381,8 @@
*/
function translationChanged(&$object)
{
+ $translation_fields = $this->getTranslationFields();
$changed_fields = array_keys( $object->GetChangedFields() );
- $translation_fields = Array ('Translation', 'HintTranslation', 'ColumnTranslation');
foreach ($changed_fields as $changed_field) {
$changed_field = preg_replace('/^l[\d]+_/', '', $changed_field);
@@ -396,6 +396,42 @@
}
/**
+ * Returns fields, that can be translated
+ *
+ * @return Array
+ * @access protected
+ */
+ protected function getTranslationFields()
+ {
+ return Array ('Translation', 'HintTranslation', 'ColumnTranslation');
+ }
+
+ /**
+ * Put correct translation to source language fields
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnAfterItemLoad(kEvent $event)
+ {
+ parent::OnAfterItemLoad($event);
+
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $translation_fields = $this->getTranslationFields();
+ $source_language = $ml_helper->getSourceLanguage($object->GetDBField('TranslateFromLanguage'));
+
+ foreach ($translation_fields as $translation_field) {
+ $object->SetDBField('Source' . $translation_field, $object->GetDBField('l' . $source_language . '_' . $translation_field));
+ }
+ }
+
+ /**
* Changes default module to custom (when available)
*
* @param kEvent $event
@@ -406,32 +442,18 @@
{
parent::OnAfterConfigRead($event);
- if ($this->Application->findModule('Name', 'Custom')) {
+ if ( $this->Application->findModule('Name', 'Custom') ) {
$fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
$fields['Module']['default'] = 'Custom';
$this->Application->setUnitOption($event->Prefix, 'Fields', $fields);
}
- // make sure, that PrimaryTranslation column always refrers to primary language column
- $language_id = $this->Application->GetVar('lang_id');
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
- if (!$language_id) {
- $language_id = $this->Application->GetVar('m_lang');
- }
+ $ml_helper->replaceMLCalculatedFields($event);
- $primary_language_id = $this->Application->GetDefaultLanguageId();
- $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields');
-
- foreach ($calculated_fields[''] as $field_name => $field_expression) {
- $field_expression = str_replace('%5$s', $language_id, $field_expression);
- $field_expression = str_replace('%4$s', $primary_language_id, $field_expression);
-
- $calculated_fields[''][$field_name] = $field_expression;
- }
-
- $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields);
-
- if ($this->Application->GetVar('regional')) {
+ if ( $this->Application->GetVar('regional') ) {
$this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true);
}
}
@@ -517,4 +539,21 @@
)
);
}
+
+ /**
+ * Updates translation state for all saved phrases
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnBeforeCopyToLive(kEvent $event)
+ {
+ parent::OnBeforeCopyToLive($event);
+
+ $ml_helper = $this->Application->recallObject('kMultiLanguageHelper');
+ /* @var $ml_helper kMultiLanguageHelper */
+
+ $ml_helper->updateTranslationState($event);
+ }
}
\ No newline at end of file
improved_translation_interface_part1_modules.patch [^] (1,626 bytes) 2012-10-17 05:48
[Show Content]
Index: in-commerce/units/currencies/currencies_config.php
===================================================================
--- in-commerce/units/currencies/currencies_config.php (revision 15581)
+++ in-commerce/units/currencies/currencies_config.php (working copy)
@@ -86,7 +86,7 @@
'CalculatedFields' => Array (
'' => Array (
- 'Translation' => 'phr.l%4$s_Translation',
+ 'Translation' => 'phr.l%2$s_Translation',
),
),
Index: in-commerce/units/currencies/currencies_event_handler.php
===================================================================
--- in-commerce/units/currencies/currencies_event_handler.php (revision 15581)
+++ in-commerce/units/currencies/currencies_event_handler.php (working copy)
@@ -297,26 +297,4 @@
$this->Application->SetVar('passed', implode(',', $passed));
}
}
-
- /**
- * Changes default module to custom (when available)
- *
- * @param kEvent $event
- * @return void
- * @access protected
- */
- protected function OnAfterConfigRead(kEvent $event)
- {
- parent::OnAfterConfigRead($event);
-
- // make sure, that currency Translation is on current language
- $language_id = $this->Application->GetVar('m_lang');
- $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields');
-
- foreach ($calculated_fields[''] as $field_name => $field_expression) {
- $calculated_fields[''][$field_name] = str_replace('%4$s', $language_id, $field_expression);
- }
-
- $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields);
- }
}
\ No newline at end of file
|