Index: admin_templates/regional/languages_edit.tpl
===================================================================
--- admin_templates/regional/languages_edit.tpl (revision 14184)
+++ admin_templates/regional/languages_edit.tpl (working copy)
@@ -93,7 +93,7 @@
|
" name="" value="">
- " type="checkbox" id="_cb_CopyLabels" name="_cb_CopyLabels" onclick="update_checkbox(this, document.getElementById(''))">
+ " type="checkbox" id="_cb_CopyLabels" name="_cb_CopyLabels" onclick="update_checkbox(this, document.getElementById('')); reflectAutoTranslateLabels();">
" name="" id="">
@@ -102,6 +102,20 @@
|
+
+
+
+
Index: install/english.lang
===================================================================
--- install/english.lang (revision 14184)
+++ install/english.lang (working copy)
@@ -389,6 +389,7 @@
QXR0YWNobWVudA==
QXV0byBDcmVhdGUgRmlsZSBOYW1l
QXV0b21hdGljIEZpbGVuYW1l
+ VHJhbnNsYXRlIGFmdGVyIENvcHlpbmc=
QXZhaWxhYmxlIENvbHVtbnM=
QmFja2dyb3VuZA==
QmFja2dyb3VuZCBBdHRhY2htZW50
@@ -697,6 +698,7 @@
SGVhZCBGcmFtZQ==
SGlkZQ==
QWxsIEZpbGVz
+ QWxsIExhYmVscyB3aWxsIGJlIGF1dG8tdHJhbnNsYXRlZCB1c2luZyBHb29nbGUgVHJhbnNsYXRlIFNlcnZpY2Ugb25jZSBuZXcgbGFuZ3VhZ2UgaXMgY3JlYXRlZCBhbmQgbGFiZWxzIGNvcGllZC4gQXV0by10cmFuc2xhdGUgd2lsbCB3b3JrIG9ubHkgaWYgIkNvcHkgTGFiZWxzIGZyb20gdGhpcyBMYW5ndWFnZSIgb3B0aW9uIGlzIGNoZWNrZWQu
Q1NWIEZpbGVz
U2luZ2xlIElQIG9yIHJhbmdlIHJlY29yZCBwZXIgbGluZSAoZm9ybWF0czogMS4yLjMuNCBvciAxLjIuMyBvciAxLjIuMy4zMi0xLjIuMy41NCBvciAxLjIuMy4zMi8yNyBvciAxLjIuMy4zMi8yNTUuMjU1LjI1NS4yMjQp
U2luZ2xlIEVtYWlsIEV2ZW50IHBlciBsaW5lIChmb3JtYXRzOiBVU0VSLkFERCwgT1JERVIuU1VCTUlUKQ==
Index: units/languages/languages_config.php
===================================================================
--- units/languages/languages_config.php (revision 14184)
+++ units/languages/languages_config.php (working copy)
@@ -216,6 +216,7 @@
'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM ' . TABLE_PREFIX . 'Language ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId',
'default' => '',
),
+ 'AutoTranslateLabels' => Array ('type' => 'int', 'default' => 0),
),
'Grids' => Array(
Index: units/languages/languages_event_handler.php
===================================================================
--- units/languages/languages_event_handler.php (revision 14184)
+++ units/languages/languages_event_handler.php (working copy)
@@ -249,10 +249,10 @@
$object =& $event->getObject();
/* @var $object kDBItem */
- $src_language = $object->GetDBField('CopyFromLanguage');
+ $src_language_id = $object->GetDBField('CopyFromLanguage');
- if ($object->GetDBField('CopyLabels') && $src_language) {
- $dst_language = $object->GetID();
+ if ($object->GetDBField('CopyLabels') && $src_language_id) {
+ $dst_language_id = $object->GetID();
// 1. schedule data copy after OnSave event is executed
$var_name = $event->getPrefixSpecial() . '_copy_data' . $this->Application->GetVar('m_wid');
@@ -261,10 +261,25 @@
if ($pending_actions) {
$pending_actions = unserialize($pending_actions);
}
-
- $pending_actions[$src_language] = $dst_language;
+
+ $pending_actions[$src_language_id] = Array( 'target_id' => $dst_language_id );
+
+ if ( $object->GetDBField('AutoTranslateLabels') ) {
+ $live_table = $this->Application->getUnitOption($event->Prefix, 'TableName');
+ $sql = 'SELECT Locale FROM ' . $live_table . '
+ WHERE ' . $object->IDField. ' = ' . $src_language_id;
+ $src_lang_locale = $this->Conn->GetOne($sql);
+
+ if ( $src_lang_locale ) {
+ $pending_actions[$src_language_id]['source_locale'] = strstr($src_lang_locale, '-', true); // save the locale for later
+ $pending_actions[$src_language_id]['target_locale'] = strstr($object->GetDBField('Locale'), '-', true); // save the locale for later
+ }
+ }
+
$this->Application->StoreVar($var_name, serialize($pending_actions));
+
$object->SetDBField('CopyLabels', 0);
+ $object->SetDBField('AutoTranslateLabels', 0);
}
}
@@ -280,6 +295,9 @@
if ($event->status != erSUCCESS) {
return ;
}
+
+ $object =& $event->getObject();
+ /* @var $object kDBItem */
$var_name = $event->getPrefixSpecial() . '_copy_data' . $this->Application->GetVar('m_wid');
$pending_actions = $this->Application->RecallVar($var_name, Array ());
@@ -293,7 +311,9 @@
$ml_helper->createFields('phrases');
$ml_helper->createFields('emailevents');
- foreach ($pending_actions as $src_language => $dst_language) {
+ foreach ($pending_actions as $src_language => $lang_data) {
+ $dst_language = $lang_data['target_id'];
+
// phrases import
$sql = 'UPDATE ' . $this->Application->getUnitOption('phrases', 'TableName') . '
SET l' . $dst_language . '_Translation = l' . $src_language . '_Translation';
@@ -305,6 +325,14 @@
l' . $dst_language . '_Subject = l' . $src_language . '_Subject,
l' . $dst_language . '_Body = l' . $src_language . '_Body';
$this->Conn->Query($sql);
+
+ if ( isset($lang_data['source_locale']) ) {
+ // perform the translations
+ $event->setEventParam('source_locale', $lang_data['source_locale']);
+ $event->setEventParam('target_locale', $lang_data['target_locale']);
+ $event->setEventParam('target_lang_id', $dst_language);
+ $event->CallSubEvent('OnTranslateLanguagePack');
+ }
}
$this->Application->RemoveVar($var_name);
@@ -314,6 +342,58 @@
}
/**
+ * Auto-translate copied language labels with Google
+ *
+ * @param kEvent $event
+ */
+ function OnTranslateLanguagePack(&$event)
+ {
+ $lang_id = $event->getEventParam('target_lang_id');
+ $source_locale = $event->getEventParam('source_locale');
+ $target_locale = $event->getEventParam('target_locale');
+
+ $sql = 'SELECT l' . $lang_id . '_Translation, PhraseId
+ FROM ' . $this->Application->getUnitOption('phrases', 'TableName') . '
+ WHERE l' . $lang_id . '_Translation != \'\' AND l' . $lang_id . '_Translation IS NOT NULL
+ ORDER BY PhraseId';
+ $phrases_to_translate = $this->Conn->GetCol($sql, 'PhraseId');
+
+ if ( $phrases_to_translate ) {
+
+ $curl_helper =& $this->Application->recallObject('CurlHelper');
+ /* @var $curl_helper kCurlHelper */
+
+ // $this->Application->ConfigValue('l_GoogleMapsAPIKey')
+
+ $request_url = 'https://www.googleapis.com/language/translate/v2?key=AIzaSyDzfNLxl91mDRW1OPIKJfN-oETIHuzvMEY&source=' . $source_locale . '&target=' . $target_locale;
+
+ foreach ($phrases_to_translate as $phrase_id => $source) {
+
+ $curl_helper->followLocation = true;
+ $curl_helper->SetHeader('X-HTTP-Method-Override', 'GET'); // see - http://code.google.com/apis/language/translate/v2/using_rest.html#WorkingResults
+ $curl_helper->setOptions( Array (CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)') ); // otherwise FeedBurner will return HTML
+ $curl_helper->SetPostData('q=' . rawurlencode($source));
+
+ $response = $curl_helper->Send($request_url);
+
+ if ( $response ) {
+ $parsed_response = json_decode($response, true);
+
+ if ( isset($parsed_response['data']['translations'][0]) ) { // use first available translation for now
+
+ $translation = $parsed_response['data']['translations'][0]['translatedText'];
+
+ $sql = 'UPDATE ' . $this->Application->getUnitOption('phrases', 'TableName') . '
+ SET l' . $lang_id . '_Translation = ' . $this->Conn->qstr($translation) . '
+ WHERE PhraseId = ' . $phrase_id;
+ $this->Conn->Query($sql);
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Prepare temp tables for creating new item
* but does not create it. Actual create is
* done in OnPreSaveCreated