Index: admin_templates/regional/languages_edit.tpl
===================================================================
--- admin_templates/regional/languages_edit.tpl (revision 14590)
+++ admin_templates/regional/languages_edit.tpl (working copy)
@@ -58,30 +58,30 @@
<div id="scroll_container">
<table class="edit-form">
<inp2:m_RenderElement name="subsection" title="la_section_General"/>
- <inp2:m_RenderElement name="inp_id_label" prefix="lang" field="LanguageId" title="la_fld_LanguageId"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="PackName" title="la_fld_PackName"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="LocalName" title="la_fld_LocalName"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="Charset" title="la_fld_Charset"/>
+ <inp2:m_RenderElement name="inp_id_label" prefix="lang" field="LanguageId"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="PackName"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="LocalName"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="Charset"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="InputDateFormat" title="la_fld_InputDateFormat"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="InputTimeFormat" title="la_fld_InputTimeFormat"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="DateFormat" title="la_fld_DateFormat"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="TimeFormat" title="la_fld_TimeFormat"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="InputDateFormat"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="InputTimeFormat"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="DateFormat"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="TimeFormat"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="DecimalPoint" title="la_fld_DecimalPoint"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="ThousandSep" title="la_fld_ThousandSep"/>
- <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="PrimaryLang" title="la_fld_PrimaryLang"/>
- <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="AdminInterfaceLang" title="la_fld_AdminInterfaceLang"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="Priority" title="la_fld_Priority"/>
- <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="Enabled" title="la_fld_Enabled"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="UnitSystem" title="la_fld_UnitSystem"/>
- <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="Locale" title="la_fld_Locale" has_empty="1"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="DecimalPoint"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="ThousandSep"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="PrimaryLang"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="AdminInterfaceLang"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="Priority"/>
+ <inp2:m_RenderElement name="inp_edit_checkbox" prefix="lang" field="Enabled"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="UnitSystem"/>
+ <inp2:m_RenderElement name="inp_edit_options" prefix="lang" field="Locale" has_empty="1"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="IconURL" title="la_fld_IconURL"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="IconDisabledURL" title="la_fld_IconDisabledURL"/>
- <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="UserDocsUrl" title="la_fld_UserDocsUrl"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="IconURL"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="IconDisabledURL"/>
+ <inp2:m_RenderElement name="inp_edit_box" prefix="lang" field="UserDocsUrl"/>
- <inp2:m_RenderElement name="inp_edit_textarea" prefix="lang" field="FilenameReplacements" title="la_fld_FilenameReplacements" allow_html="0" control_options="{min_height: 200}" cols="50" rows="10"/>
+ <inp2:m_RenderElement name="inp_edit_textarea" prefix="lang" field="FilenameReplacements" allow_html="0" control_options="{min_height: 200}" cols="50" rows="10"/>
<inp2:m_if check="lang_IsNewMode">
<inp2:m_if check="lang_FieldVisible" field="CopyLabels">
@@ -105,6 +105,8 @@
</inp2:m_if>
</inp2:m_if>
+ <inp2:m_RenderElement name="inp_edit_checkboxes" prefix="lang" field="SynchronizationModes"/>
+
<inp2:m_RenderElement name="inp_edit_filler"/>
</table>
</div>
Index: admin_templates/regional/languages_list.tpl
===================================================================
--- admin_templates/regional/languages_list.tpl (revision 14590)
+++ admin_templates/regional/languages_list.tpl (working copy)
@@ -6,56 +6,92 @@
<table class="toolbar" height="30" cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
- <td>
- <script type="text/javascript">
- //do not rename - this function is used in default grid for double click!
- function edit()
- {
- std_edit_item('lang', 'regional/languages_edit');
- }
+ <td>
+ <script type="text/javascript">
+ //do not rename - this function is used in default grid for double click!
+ function edit() {
+ std_edit_item('lang', 'regional/languages_edit');
+ }
- var a_toolbar = new ToolBar();
- a_toolbar.AddButton( new ToolBarButton('new_item', '<inp2:m_phrase label="la_ToolTip_NewLanguage" escape="1"/>::<inp2:m_phrase label="la_Add" escape="1"/>',
+ var a_toolbar = new ToolBar();
+
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'new_item',
+ '<inp2:m_phrase label="la_ToolTip_NewLanguage" escape="1"/>::<inp2:m_phrase label="la_Add" escape="1"/>',
function() {
std_precreate_item('lang', 'regional/languages_edit')
- } ) );
+ }
+ )
+ );
a_toolbar.AddButton( new ToolBarButton('edit', '<inp2:m_phrase label="la_ToolTip_Edit" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Edit" escape="1"/>', edit) );
- a_toolbar.AddButton( new ToolBarButton('delete', '<inp2:m_phrase label="la_ToolTip_Delete" escape="1"/>',
+
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'delete',
+ '<inp2:m_phrase label="la_ToolTip_Delete" escape="1"/>',
function() {
std_delete_items('lang')
- } ) );
+ }
+ )
+ );
-
a_toolbar.AddButton( new ToolBarSeparator('sep1') );
- a_toolbar.AddButton( new ToolBarButton('setprimary', '<inp2:m_phrase label="la_ToolTip_SetPrimary" escape="1"/>', function() {
- submit_event('lang','OnSetPrimary');
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'setprimary',
+ '<inp2:m_phrase label="la_ToolTip_SetPrimary" escape="1"/>',
+ function() {
+ submit_event('lang', 'OnSetPrimary');
}
- ) );
+ )
+ );
-
- a_toolbar.AddButton( new ToolBarButton('import', '<inp2:m_phrase label="la_ToolTip_ImportLanguage" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Import" escape="1"/>', function() {
- openSelector('lang', '<inp2:m_t t="regional/languages_import" phrases.import_event="OnNew" pass="all,m,phrases.import" no_amp="1" js_escape="1"/>');
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'import',
+ '<inp2:m_phrase label="la_ToolTip_ImportLanguage" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Import" escape="1"/>',
+ function() {
+ openSelector('lang', '<inp2:m_t t="regional/languages_import" phrases.import_event="OnNew" pass="all,m,phrases.import" no_amp="1" js_escape="1"/>');
}
- ) );
+ )
+ );
- a_toolbar.AddButton( new ToolBarButton('export', '<inp2:m_phrase label="la_ToolTip_ExportLanguage" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Export" escape="1"/>', function() {
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'export',
+ '<inp2:m_phrase label="la_ToolTip_ExportLanguage" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_Export" escape="1"/>',
+ function() {
open_popup('lang', 'OnExportLanguage', 'regional/languages_export');
}
- ) );
+ )
+ );
- a_toolbar.AddButton( new ToolBarButton('refresh', '<inp2:m_phrase label="la_ToolTip_SynchronizeLanguages" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_SynchronizeLanguages" escape="1"/>', function() {
- submit_event('lang', 'OnSynchronizeLanguages');
- }
- ));
+ <inp2:m_ifnot check="lang_TotalRecords" equals_to="1">
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'refresh',
+ '<inp2:m_phrase label="la_ToolTip_SynchronizeLanguages" escape="1"/>::<inp2:m_phrase label="la_ShortToolTip_SynchronizeLanguages" escape="1"/>',
+ function() {
+ submit_event('lang', 'OnSynchronizeLanguages');
+ }
+ )
+ );
+ </inp2:m_ifnot>
a_toolbar.AddButton( new ToolBarSeparator('sep2') );
- a_toolbar.AddButton( new ToolBarButton('view', '<inp2:m_phrase label="la_ToolTip_View" escape="1"/>', function() {
+ a_toolbar.AddButton(
+ new ToolBarButton(
+ 'view',
+ '<inp2:m_phrase label="la_ToolTip_View" escape="1"/>',
+ function() {
show_viewmenu(a_toolbar,'view');
}
- ) );
+ )
+ );
a_toolbar.Render();
</script>
Index: install/english.lang
===================================================================
--- install/english.lang (revision 14614)
+++ install/english.lang (working copy)
@@ -566,6 +566,7 @@
<PHRASE Label="la_fld_SubmitNotifyEmail" Module="Core" Type="1" Hint="RW1haWwgYWRkcmVzcyB3aGVyZSBub3RpZmljYXRpb24gYWJvdXQgbmV3IHN1Ym1pc3Npb25zIHdpbGwgYmUgc2VuZCB0by4gRGVmYXVsdCBlbWFpbCBhZGRyZXNzIHdpbGwgYmUgdXNlZCBpZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsu" Column="U3VibWlzc2lvbiBOb3RpZmljYXRpb24gRW1haWw=">U3VibWlzc2lvbiBOb3RpZmljYXRpb24gRW1haWw=</PHRASE>
<PHRASE Label="la_fld_SuggestedCorrection" Module="Core" Type="1" Column="U3VnZ2VzdGVkIENvcnJlY3Rpb24=">U3VnZ2VzdGVkIENvcnJlY3Rpb24=</PHRASE>
<PHRASE Label="la_fld_SymLinkCategoryId" Module="Core" Type="1">UG9pbnRzIHRvIFNlY3Rpb24=</PHRASE>
+ <PHRASE Label="la_fld_SynchronizationModes" Module="Core" Type="1" Hint="IlRvIG90aGVycyIgLSBhbGxvdyB0cmFuc2xhdGVkIHBocmFzZXMgZnJvbSB0aGlzIGxhbmd1YWdlIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBtaXNzaW5nIHBocmFzZXMgb24gb3RoZXIgbGFuZ3VhZ2VzLiAiRnJvbSBvdGhlcnMiIC0gdXNlIHRyYW5zbGF0ZWQgcGhyYXNlcyBmcm9tIG90aGVyIGxhbmd1YWdlcyBpbnN0ZWFkIG9mIG1pc3NpbmcgcGhyYXNlcyBvbiB0aGlzIGxhbmd1YWdlLg==" Column="U3luY2hyb25pemUgTGFuZ3VhZ2U=">U3luY2hyb25pemUgTGFuZ3VhZ2U=</PHRASE>
<PHRASE Label="la_fld_TableName" Module="Core" Type="1">VGFibGUgTmFtZSBpbiBEYXRhYmFzZSA=</PHRASE>
<PHRASE Label="la_fld_Tag" Module="Core" Type="1">VGFn</PHRASE>
<PHRASE Label="la_fld_TargetId" Module="Core" Type="1" Column="SXRlbQ==">SXRlbQ==</PHRASE>
@@ -771,6 +772,8 @@
<PHRASE Label="la_opt_State" Module="Core" Type="1">U3RhdGU=</PHRASE>
<PHRASE Label="la_opt_Sub-match" Module="Core" Type="1">U3ViLW1hdGNo</PHRASE>
<PHRASE Label="la_opt_Success" Module="Core" Type="1">U3VjY2Vzcw==</PHRASE>
+ <PHRASE Label="la_opt_SynchronizeFromOthers" Module="Core" Type="1">RnJvbSBvdGhlcnM=</PHRASE>
+ <PHRASE Label="la_opt_SynchronizeToOthers" Module="Core" Type="1">VG8gb3RoZXJz</PHRASE>
<PHRASE Label="la_opt_System" Module="Core" Type="1">U3lzdGVt</PHRASE>
<PHRASE Label="la_opt_Tab" Module="Core" Type="1">VGFi</PHRASE>
<PHRASE Label="la_opt_Template" Module="Core" Type="1">VGVtcGxhdGU=</PHRASE>
Index: install/install_schema.sql
===================================================================
--- install/install_schema.sql (revision 14614)
+++ install/install_schema.sql (working copy)
@@ -147,6 +147,7 @@
FilenameReplacements text,
Locale varchar(10) NOT NULL DEFAULT 'en-US',
UserDocsUrl varchar(255) NOT NULL DEFAULT '',
+ SynchronizationModes varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (LanguageId),
KEY Enabled (Enabled),
KEY PrimaryLang (PrimaryLang),
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 14614)
+++ install/upgrades.sql (working copy)
@@ -2129,3 +2129,5 @@
ALTER TABLE FormFields
ADD UploadExtensions VARCHAR(255) NOT NULL DEFAULT '' AFTER Validation,
ADD UploadMaxSize INT NULL AFTER UploadExtensions;
+
+ALTER TABLE Language ADD SynchronizationModes VARCHAR(255) NOT NULL DEFAULT '';
\ No newline at end of file
Index: kernel/constants.php
===================================================================
--- kernel/constants.php (revision 14628)
+++ kernel/constants.php (working copy)
@@ -161,4 +161,10 @@
class UserType {
const USER = 0;
const ADMIN = 1;
+ }
+
+ class Language {
+ const SYNCHRONIZE_TO_OTHERS = 1;
+ const SYNCHRONIZE_FROM_OTHERS = 2;
+ const SYNCHRONIZE_DEFAULT = '|1|2|';
}
\ No newline at end of file
Index: units/helpers/language_import_helper.php
===================================================================
--- units/helpers/language_import_helper.php (revision 14628)
+++ units/helpers/language_import_helper.php (working copy)
@@ -734,6 +734,7 @@
'LocalName' => $language_node->Attributes['PACKNAME'],
'Encoding' => $language_node->Attributes['ENCODING'],
'Charset' => 'utf-8',
+ 'SynchronizationModes' => Language::SYNCHRONIZE_DEFAULT,
);
if ($version > 1) {
Index: units/languages/languages_config.php
===================================================================
--- units/languages/languages_config.php (revision 14590)
+++ units/languages/languages_config.php (working copy)
@@ -180,8 +180,8 @@
'options' => Array ('m/d/Y' => 'mm/dd/yyyy', 'd/m/Y' => 'dd/mm/yyyy', 'm.d.Y' => 'mm.dd.yyyy', 'd.m.Y' => 'dd.mm.yyyy'),
'not_null' => 1, 'required' => 1, 'default' => 'm/d/Y'
),
- 'InputTimeFormat' => Array (
- 'type' => 'string',
+ 'InputTimeFormat' => Array (
+ 'type' => 'string',
'formatter' => 'kOptionsFormatter',
'options' => Array ('g:i:s A' => 'g:i:s A', 'g:i A' => 'g:i A', 'H:i:s' => 'H:i:s', 'H:i' => 'H:i'),
'not_null' => '1', 'required' => 1, 'default' => 'g:i:s A',
@@ -207,6 +207,11 @@
'not_null' => 1, 'default' => 'en-US',
),
'UserDocsUrl' => Array ('type' => 'string', 'max_len' => 255, 'not_null' => 1, 'default' => ''),
+ 'SynchronizationModes' => Array (
+ 'type' => 'string', 'max_len' => 255,
+ 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_opt_SynchronizeToOthers', 2 => 'la_opt_SynchronizeFromOthers'), 'use_phrases' => 1, 'multiple' => 1,
+ 'not_null' => 1, 'default' => ''
+ ),
),
'VirtualFields' => Array (
@@ -234,7 +239,8 @@
'AdminInterfaceLang' => Array ('filter_block' => 'grid_options_filter', 'width' => 150, ),
'Charset' => Array ('filter_block' => 'grid_like_filter', 'width' => 100, ),
'Priority' => Array ('filter_block' => 'grid_like_filter', 'width' => 60, ),
- 'Enabled' => Array ('filter_block' => 'grid_options_filter', 'width' => 60, ),
+ 'Enabled' => Array ('filter_block' => 'grid_options_filter', 'width' => 80, ),
+ 'SynchronizationModes' => Array ('filter_block' => 'grid_picker_filter', 'width' => 120, 'format' => ', ', 'hidden' => 1),
),
),
Index: units/languages/languages_event_handler.php
===================================================================
--- units/languages/languages_event_handler.php (revision 14628)
+++ units/languages/languages_event_handler.php (working copy)
@@ -317,7 +317,7 @@
// create multilingual columns for phrases & email events table first (actual for 6+ language)
$ml_helper =& $this->Application->recallObject('kMultiLanguageHelper');
/* @var $ml_helper kMultiLanguageHelper */
-
+
$ml_helper->createFields('phrases');
$ml_helper->createFields('emailevents');
@@ -365,6 +365,7 @@
$primary_lang_id = $this->Conn->GetOne($sql);
$object->SetDBField('CopyFromLanguage', $primary_lang_id);
+ $object->SetDBField('SynchronizationModes', Language::SYNCHRONIZE_DEFAULT);
}
/**
@@ -617,31 +618,46 @@
* Copy missing phrases across all system languages (starting from primary)
*
* @param kEvent $event
+ * @return void
+ * @access protected
*/
- function OnSynchronizeLanguages(&$event)
+ protected function OnSynchronizeLanguages(&$event)
{
- if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) {
+ if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) {
$event->status = kEvent::erFAIL;
return;
}
+ $source_languages = $target_languages = Array ();
+
// get language list with primary language first
- $sql = 'SELECT LanguageId
+ $sql = 'SELECT SynchronizationModes, LanguageId
FROM ' . TABLE_PREFIX . 'Language
+ WHERE SynchronizationModes <> ""
ORDER BY PrimaryLang DESC';
+ $languages = $this->Conn->GetCol($sql, 'LanguageId');
- $source_langs = $this->Conn->GetCol($sql);
- $target_langs = $source_langs;
+ foreach ($languages as $language_id => $synchronization_modes) {
+ $synchronization_modes = explode('|', substr($synchronization_modes, 1, -1));
- foreach ($source_langs as $source_id) {
- foreach ($target_langs as $target_id) {
- if ($source_id == $target_id) {
+ if ( in_array(Language::SYNCHRONIZE_TO_OTHERS, $synchronization_modes) ) {
+ $source_languages[] = $language_id;
+ }
+
+ if ( in_array(Language::SYNCHRONIZE_FROM_OTHERS, $synchronization_modes) ) {
+ $target_languages[] = $language_id;
+ }
+ }
+
+ foreach ($source_languages as $source_id) {
+ foreach ($target_languages as $target_id) {
+ if ( $source_id == $target_id ) {
continue;
}
$sql = 'UPDATE ' . TABLE_PREFIX . 'Phrase
SET l' . $target_id . '_Translation = l' . $source_id . '_Translation
- WHERE (l' . $target_id . '_Translation IS NULL) OR (l' . $target_id . '_Translation = "")';
+ WHERE COALESCE(l' . $target_id . '_Translation, "") = "" AND COALESCE(l' . $source_id . '_Translation, "") <> ""';
$this->Conn->Query($sql);
}
}