diff options
| author | spiderr <spider@viovio.com> | 2011-05-03 00:00:20 -0400 |
|---|---|---|
| committer | spiderr <spider@viovio.com> | 2011-05-03 00:00:20 -0400 |
| commit | 59c411475fd0689464c9dd043b0d34ce6001c1c1 (patch) | |
| tree | c5d0bf0c4e29c22db5555a413be2bc35093c8741 | |
| parent | 0c629fd10a6ea3fc8be98a1f82de2bb16dad26cb (diff) | |
| download | languages-59c411475fd0689464c9dd043b0d34ce6001c1c1.tar.gz languages-59c411475fd0689464c9dd043b0d34ce6001c1c1.tar.bz2 languages-59c411475fd0689464c9dd043b0d34ce6001c1c1.zip | |
add auto translate for master strings; genericize auto javascript; ajax returns null when translation == masterstring
| -rw-r--r-- | admin/admin_languages_inc.php | 3 | ||||
| -rw-r--r-- | ajax_translate.php | 19 | ||||
| -rw-r--r-- | master_strings.php | 85 | ||||
| -rw-r--r-- | templates/admin_languages.tpl | 9 | ||||
| -rw-r--r-- | templates/language_master_strings.tpl | 27 | ||||
| -rw-r--r-- | templates/translate_google_ajax_inc.tpl | 44 | ||||
| -rw-r--r-- | templates/translate_strings.tpl | 53 |
7 files changed, 109 insertions, 131 deletions
diff --git a/admin/admin_languages_inc.php b/admin/admin_languages_inc.php index 85bc746..643c658 100644 --- a/admin/admin_languages_inc.php +++ b/admin/admin_languages_inc.php @@ -53,6 +53,9 @@ if( isset( $_REQUEST["prefs"] )) { } global $gBitLanguage; $gBitLanguage->setLanguage( $gBitSystem->getConfig( 'bitlanguage' )); + + $gBitSystem->storeConfig( 'google_api_key', $_REQUEST['google_api_key'] ); + } else { $gBitSmarty->assign( "language", $gBitSystem->getConfig( "language", "en" )); } diff --git a/ajax_translate.php b/ajax_translate.php index 400b658..cc0d668 100644 --- a/ajax_translate.php +++ b/ajax_translate.php @@ -7,8 +7,8 @@ $translation = NULL; if( !empty( $_REQUEST['lang'] ) && !empty( $_REQUEST['source_hash'] ) ) { if( $masterString = $gBitLanguage->getMasterString( $_REQUEST['source_hash'] ) ) { - // convert smarty to tags so it is shielded from translation, escape <> tags with htmlentities before inserting our <smarty></smarty> wrappers - $preppedMaster = preg_replace( '/\{/', '<smarty ', htmlentities( $masterString ) ); + // convert smarty to tags so it is shielded from translation + $preppedMaster = preg_replace( '/\{/', '<smarty ', $masterString ); // needs to be a full tag so we can cleanly de-tagify after translation $preppedMaster = preg_replace( '/}/', '></smarty>', $preppedMaster ); @@ -21,13 +21,14 @@ if( !empty( $_REQUEST['lang'] ) && !empty( $_REQUEST['source_hash'] ) ) { } if( !empty( $data->data->translations[0]->translatedText ) ) { $translation = urldecode( $data->data->translations[0]->translatedText ); - - //detagify - $preppedTranslation = preg_replace( '/<smarty /', '{', $translation ); - // needs to be a full tag so we can cleanly de-tagify after translation - $preppedTranslation = preg_replace( '/><\/smarty>/', '}', $preppedTranslation ); - - print json_encode( array( 'source_hash' => $_REQUEST['source_hash'], 'translation' => html_entity_decode( $preppedTranslation ) ) ); + if( $translation != $masterString ) { + //detagify + $preppedTranslation = preg_replace( '/<smarty /', '{', $translation ); + // needs to be a full tag so we can cleanly de-tagify after translation + $preppedTranslation = preg_replace( '/><\/smarty>/', '}', $preppedTranslation ); + + print json_encode( array( 'lang_code' => $_REQUEST['lang'], 'source_hash' => $_REQUEST['source_hash'], 'translation' => $preppedTranslation ) ); + } } } } diff --git a/master_strings.php b/master_strings.php index 9e139ac..c88a824 100644 --- a/master_strings.php +++ b/master_strings.php @@ -19,7 +19,11 @@ $languages = $gBitLanguage->listLanguages(); $gBitSmarty->assign_by_ref( 'languages', $languages ); $feedback = $masterMsg = array(); -if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) && is_array( $_REQUEST['source_hash'] ) ) { +if( !empty( $_REQUEST['source_hash'] ) && !is_array( $_REQUEST['source_hash'] ) ) { + $_REQUEST['source_hash'] = array( $_REQUEST['source_hash'] ); +} + +if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) ) { if( empty( $_REQUEST['confirm'] ) ) { $gBitSystem->setBrowserTitle( tra( 'Confirm Delete' ) ); $formHash['delete_master'] = TRUE; @@ -30,7 +34,7 @@ if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) & ); foreach( $_REQUEST['source_hash'] as $source_hash ) { $gBitLanguage->loadMasterStrings( $source_hash ); - $formHash['input'][] = '<input type="hidden" name="source_hash[]" value="'.$source_hash.'"/>'.$gBitLanguage->mStrings['master'][$source_hash]['source']; + $formHash['input'][] = '<input type="hidden" name="source_hash[]" value="'.$source_hash.'"/>'.htmlentities( $gBitLanguage->mStrings['master'][$source_hash]['source'] ); } $gBitSystem->confirmDialog( $formHash, $msgHash ); } else { @@ -48,54 +52,6 @@ if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) & $feedback['success'] = 'The requested master strings were successfully deleted.'; } } -} elseif( !empty( $_REQUEST['guess_translations'] ) ) { - if( is_string( $_REQUEST['source_hash'] ) ) { - $_REQUEST['source_hash'] = array( $_REQUEST['source_hash'] ); - } - $transCount = 0; - $masterStrings = array(); - foreach( $_REQUEST['source_hash'] AS $reqSourceHash ) { - $gBitLanguage->loadMasterStrings( $reqSourceHash ); - $masterStrings[$reqSourceHash] = $gBitLanguage->mStrings['master'][$reqSourceHash]; - - if( strlen( $masterStrings[$reqSourceHash]['source'] ) > 70 ) { - $masterStrings[$reqSourceHash]['textarea'] = TRUE; - } - $gBitSmarty->assign_by_ref( 'masterStrings', $masterStrings ); - $masterString = $gBitLanguage->mStrings['master'][$reqSourceHash]; - $tranArray = array( 'ar', 'bg', 'cs', 'da', 'de', 'el', 'es', 'fi', 'fr', 'hi', 'hr', 'it', 'nl', 'pt', 'ja', 'ko', 'no', 'pl', 'pt', 'ro', 'sv', 'ru', 'zh-CN' ); - - $tranStrings[$reqSourceHash] = $gBitLanguage->getTranslatedStrings( $reqSourceHash ); - foreach( $tranArray as $toLangCode ) { - $lowerLangCode = strtolower( $toLangCode ); - if( !empty( $gBitLanguage->mLanguageList[$lowerLangCode] ) && empty( $tranStrings[$reqSourceHash][$lowerLangCode] ) ) { - $requestUrl = "http://translate.google.com/translate_t?ie=UTF-8&oe=UTF-8&text=".urlencode( $masterString['source'] )."&langpair=en|$toLangCode"; - $handle = fopen( $requestUrl, "r"); - if($handle) { - $transCount++; - $contents = ''; - while (!feof($handle)) { - $contents .= fread($handle, 8192); - } - fclose($handle); - preg_match_all( "!<div id=result_box[^>]*>([^<]*)</div>.*!", $contents, $matches ); - if( isset( $matches[1][0] ) && $matches[1][0] != $gBitLanguage->mStrings['master'][$reqSourceHash]['source'] ) { - $tranStrings[$reqSourceHash][$lowerLangCode]['guessed'] = TRUE; - $tranStrings[$reqSourceHash][$lowerLangCode]['source_hash'] = $reqSourceHash; - $tranStrings[$reqSourceHash][$lowerLangCode]['trans'] = trim( $matches[1][0] ); - $tranStrings[$reqSourceHash][$lowerLangCode]['lang_code'] = $lowerLangCode; - } - } - } - } - if( $transCount > 200 ) { - // avoid abuse of google translate URL and prevent URL timeout - break; - } - } - - $gBitSmarty->assign( 'sources', $_REQUEST['source_hash'] ); - $gBitSmarty->assign_by_ref( 'tranStrings', $tranStrings ); } elseif( !empty( $_REQUEST['save_translations'] ) ) { foreach( $_REQUEST['edit_trans'] as $sourceHash => $sources ) { foreach( $sources as $langCode => $string ) { @@ -123,20 +79,6 @@ if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) & } } $masterMsg['success'][] = 'Translation strings have been updated'; - $gBitSmarty->assign_by_ref( 'masterStrings', $gBitLanguage->mStrings['master'] ); - $gBitSmarty->assign_by_ref( 'tranStrings', $tranStrings ); - $gBitSmarty->assign( 'sources', $_REQUEST['source_hash'] ); -} elseif( !empty( $_REQUEST['source_hash'] ) && empty( $_REQUEST['cancel'] ) ) { - foreach( $_REQUEST['source_hash'] as $reqSourceHash ) { - $gBitLanguage->loadMasterStrings( $reqSourceHash ); - if( strlen( $gBitLanguage->mStrings['master'][$reqSourceHash]['source'] ) > 70 ) { - $gBitLanguage->mStrings['master'][$reqSourceHash]['textarea'] = TRUE; - } - $translate[$reqSourceHash] = $gBitLanguage->getTranslatedStrings( $_REQUEST['source_hash'] ); - } - $gBitSmarty->assign_by_ref( 'masterStrings', $gBitLanguage->mStrings['master'] ); - $gBitSmarty->assign_by_ref( 'tranStrings', $translate ); - $gBitSmarty->assign( 'sources', $_REQUEST['source_hash'] ); } elseif( !empty( $_REQUEST['find'] ) && !empty( $_REQUEST['search'] ) ) { $gBitSmarty->assign_by_ref( 'masterStrings', $gBitLanguage->searchMasterStrings( $_REQUEST['find'] ) ); } else { @@ -167,6 +109,21 @@ if( !empty( $_REQUEST['delete_master'] ) && !empty( $_REQUEST['source_hash'] ) & $gBitSmarty->assign( 'char', empty( $_REQUEST['char'] ) ? '' : $_REQUEST['char'] ); $gBitSmarty->assign_by_ref( 'masterStrings', $masterStrings ); } + + +if( !empty( $_REQUEST['source_hash'] ) && empty( $_REQUEST['cancel'] ) ) { + foreach( $_REQUEST['source_hash'] as $reqSourceHash ) { + $gBitLanguage->loadMasterStrings( $reqSourceHash ); + if( strlen( $gBitLanguage->mStrings['master'][$reqSourceHash]['source'] ) > 100 ) { + $gBitLanguage->mStrings['master'][$reqSourceHash]['textarea'] = TRUE; + } + $translate[$reqSourceHash] = $gBitLanguage->getTranslatedStrings( $_REQUEST['source_hash'] ); + } + $gBitSmarty->assign_by_ref( 'masterStrings', $gBitLanguage->mStrings['master'] ); + $gBitSmarty->assign_by_ref( 'tranStrings', $translate ); + $gBitSmarty->assign( 'sources', $_REQUEST['source_hash'] ); +} + // Display the template $gBitSmarty->assign( 'masterMsg', $masterMsg ); $gBitSmarty->assign( 'feedback', $feedback ); diff --git a/templates/admin_languages.tpl b/templates/admin_languages.tpl index 6766baf..9aa9eed 100644 --- a/templates/admin_languages.tpl +++ b/templates/admin_languages.tpl @@ -23,6 +23,15 @@ </div> {/foreach} + <div class="row"> + {formlabel label="Google API Key" for="google_api_key"} + {forminput} + {biticon iname="google-favicon" ipackage="languages" iexplain="Auto-Translate"} + <input type="text" name="google_api_key" value="{$gBitSystem->getConfig('google_api_key')}" style="width:30em"/> + {formhelp note="Enter your <a href='http://www.google.com/search?q=Google+translate+API'>Google Translate API KEY</a>"} + {/forminput} + </div> + <div class="row submit"> <input type="submit" name="prefs" value="{tr}Change Settings{/tr}" /> </div> diff --git a/templates/language_master_strings.tpl b/templates/language_master_strings.tpl index 9b71246..605b096 100644 --- a/templates/language_master_strings.tpl +++ b/templates/language_master_strings.tpl @@ -1,6 +1,8 @@ {strip} <div class="floaticon">{bithelp}</div> +{include file="bitpackage:lanaguages/translate_google_ajax_inc.tpl"} + <div class="edit languages"> <div class="header"> <h1>{tr}Master Language Strings{/tr}</h1> @@ -9,7 +11,7 @@ <div class="body"> {minifind name="Search master strings" sort_mode=$sort_mode} {if $sources} - {form legend="Edit Translations"} + {form legend="Edit Translations" id="translateform"} {formfeedback hash=$masterMsg} {formfeedback warning="You will need to clear the System Cache to see the changes." link="languages/edit_languages.php/System Cache"} {tr}Translations strings may appear empty if the language is not loaded. The language will be automatically loaded when you click the edit icon.{/tr} @@ -31,13 +33,18 @@ {foreach from=$languages key=langCode item=lang} {if $langCode ne 'en'} <div class="row"> - {formlabel label=$lang.native_name no_translate=1} + <div class="formlabel"> + {$lang.native_name} + {if $gBitSystem->getConfig('google_api_key')} + <div class="autotranslate" onclick="autoTranslate('{$sourceHash}','{$langCode}')">{biticon iname="google-favicon" ipackage="languages" iexplain="Auto-Translate"} Auto</div> + {/if} + </div> {forminput} {* if results are guessed, we don't need to escape *} {if $masterStrings.$sourceHash.textarea} - <textarea name="edit_trans[{$sourceHash}][{$langCode}]" id="h_{$sourceHash}" rows="5" cols="50">{if $tranStrings.$sourceHash.$langCode.guessed}{$tranStrings.$sourceHash.$langCode.trans}{else}{$tranStrings.$sourceHash.$langCode.trans|escape|stripslashes}{/if}</textarea> + <textarea name="edit_trans[{$sourceHash}][{$langCode}]" id="{$langCode}_{$sourceHash}" lang="{$langCode}" rows="3" cols="50">{if $tranStrings.$sourceHash.$langCode.guessed}{$tranStrings.$sourceHash.$langCode.trans}{else}{$tranStrings.$sourceHash.$langCode.trans|escape|stripslashes}{/if}</textarea> {else} - <input type="text" name="edit_trans[{$sourceHash}][{$langCode}]" id="h_{$sourceHash}" value="{if $tranStrings.$sourceHash.$langCode.guessed}{$tranStrings.$sourceHash.$langCode.trans}{else}{$tranStrings.$sourceHash.$langCode.trans|escape|stripslashes}{/if}" size="45" maxlength="2048" /> + <input type="text" name="edit_trans[{$sourceHash}][{$langCode}]" id="{$langCode}_{$sourceHash}" lang="{$langCode}" value="{if $tranStrings.$sourceHash.$langCode.guessed}{$tranStrings.$sourceHash.$langCode.trans}{else}{$tranStrings.$sourceHash.$langCode.trans|escape|stripslashes}{/if}" size="45" maxlength="2048" /> {/if} {/forminput} </div> @@ -47,12 +54,15 @@ <div class="row submit"> <input type="submit" name="cancel" value="{tr}Cancel{/tr}" /> - <input type="submit" name="guess_translations" value="{tr}Guess Translations{/tr}" /> - <input type="submit" name="save_translations" value="{tr}Save{/tr}" /> + <input type="submit" name="save_translations" value="{tr}Save{/tr}" /> + <input type="submit" name="delete_master" value="{tr}Delete Master String{/tr}" /> + {if $gBitSystem->getConfig('google_api_key')} + <div class="button" onclick="return autoTranslateEmpty()">Auto Translate Empty Strings</div> + {/if} </div> <div class="row"> - {formhelp note="Guess Translations will try and get an estimated translation using google language tools. Please make sure you check the returned strings for messed up HTML."} + {formhelp note="Auto Translations will try and get an estimated translation using google language tools. Please make sure you check the returned strings for incorrect formatting."} </div> {/form} @@ -80,7 +90,7 @@ </div> {/form} - {form legend="Translations" id=formid} + {form legend="Translations" id="translateform"} {alphabar iall=1 filter_lang=$smarty.request.filter_lang filter=$smarty.request.filter} {formfeedback hash=$feedback} @@ -99,7 +109,6 @@ </ol> <div class="submit"> - <input type="submit" name="guess_translations" value="{tr}Guess Translations{/tr}" /> <input type="submit" name="delete_master" value="{tr}Delete Seleted Master Strings{/tr}" /> </div> diff --git a/templates/translate_google_ajax_inc.tpl b/templates/translate_google_ajax_inc.tpl new file mode 100644 index 0000000..5496407 --- /dev/null +++ b/templates/translate_google_ajax_inc.tpl @@ -0,0 +1,44 @@ +<script type="text/javascript">/* <![CDATA[ */ +{literal} +var autoHashArray = new Array(); +var ajax = new BitBase.SimpleAjax(); + +function autoTranslate( pElementId, pLang ) { +console.log( "auto trans " + pElementId + ", " + pLang ); + ajax.connect( "{/literal}{$smarty.const.LANGUAGES_PKG_URL}ajax_translate.php{literal}" + , "lang="+pLang+"&source_hash=" + escape( pElementId ) + , updateTranslation + , "GET" + ); +} + +function updateTranslation( pResponse ) { + if( pResponse.responseText ) { + rObj = eval('(' + pResponse.responseText + ')'); + document.getElementById( rObj.lang_code + '_' + rObj.source_hash ).value = rObj.translation; + } + if( autoHashArray.length ) { + var next = autoHashArray.pop().split('_',2); + autoTranslate( next[1], next[0] ); + } +} + +function autoTranslateEmpty() { + var elem = document.getElementById('translateform').elements; + for(var i = 0; i < elem.length; i++) { + if( elem[i].type == 'text' || elem[i].type == 'textarea' ) { + if( !elem[i].value && elem[i].id ) { + autoHashArray.push( elem[i].id ); + } + } + } + if( autoHashArray.length ) { + var next = autoHashArray.pop().split('_',2); + autoTranslate( next[1], next[0] ); + } +} + +{/literal} +/* ]]> */</script> + + diff --git a/templates/translate_strings.tpl b/templates/translate_strings.tpl index ee3af17..88a273a 100644 --- a/templates/translate_strings.tpl +++ b/templates/translate_strings.tpl @@ -1,51 +1,6 @@ {strip} <div class="floaticon">{bithelp}</div> - -<script type="text/javascript">/* <![CDATA[ */ -{literal} -var autoHashArray = new Array(); -var ajax = new BitBase.SimpleAjax(); - -function autoTranslate( pElementId ) { -console.log( "auto trans " + pElementId ); - ajax.connect( "{/literal}{$smarty.const.LANGUAGES_PKG_URL}ajax_translate.php{literal}" - , "lang={/literal}{$editLang}{literal}&source_hash=" + escape( pElementId ) - , updateTranslation - , "GET" - ); -} - -function updateTranslation( pResponse ) { -console.log( pResponse ); - if( pResponse.responseText ) { -console.log( pResponse.responseText ); - rObj = eval('(' + pResponse.responseText + ')'); -console.log( rObj ); - document.getElementById( rObj.source_hash ).value = rObj.translation; - } - if( autoHashArray.length ) { - autoTranslate( autoHashArray.pop() ); - } -} - -function autoTranslateEmpty() { - var elem = document.getElementById('translateform').elements; - for(var i = 0; i < elem.length; i++) { - if( elem[i].type == 'text' || elem[i].type == 'textarea' ) { - if( !elem[i].value && elem[i].id ) { - autoHashArray.push( elem[i].id ); - } - } - } -console.log( autoHashArray ); - if( autoHashArray.length ) { - autoTranslate( autoHashArray.pop() ); - } -} - -{/literal} -/* ]]> */</script> - +{include file="bitpackage:lanaguages/translate_google_ajax_inc.tpl"} <div class="edit languages"> <div class="header"> <h1>{tr}Edit Languages{/tr}</h1> @@ -80,15 +35,15 @@ console.log( autoHashArray ); <div class="formlabel"> <label for="{$sourceHash}">{tr}Translate{/tr}</label> {if $gBitSystem->getConfig('google_api_key')} - <div class="autotranslate" onclick="autoTranslate('{$sourceHash}')">{biticon iname="google-favicon" ipackage="languages" iexplain="Auto-Translate"} Auto</div> + <div class="autotranslate" onclick="autoTranslate('{$sourceHash}','{$editLang}')">{biticon iname="google-favicon" ipackage="languages" iexplain="Auto-Translate"} Auto</div> {/if} </div> {forminput} <a href="{$smarty.const.LANGUAGES_PKG_URL}master_strings.php?source_hash={$sourceHash}">{$tran.source|escape|nl2br}</a><br/> {if $tran.textarea} - <textarea style="font-size:medium;width:100%" name="edit_trans[{$sourceHash}]" id="{$sourceHash}" rows="5" cols="50">{$tran.trans|escape|stripslashes}</textarea> + <textarea style="font-size:medium;width:100%" name="edit_trans[{$sourceHash}]" id="{$editLang}_{$sourceHash}" lang="{$editLang}" rows="5" cols="50">{$tran.trans|escape|stripslashes}</textarea> {else} - <input style="font-size:medium;width:100%" name="edit_trans[{$sourceHash}]" id="{$sourceHash}" value="{$tran.trans|escape|stripslashes}" size="45" maxlength="255" /> + <input style="font-size:medium;width:100%" name="edit_trans[{$sourceHash}]" id="{$editLang}_{$sourceHash}" lang="{$editLang}" value="{$tran.trans|escape|stripslashes}" size="45" maxlength="255" /> {/if} {/forminput} </div> |
