diff options
Diffstat (limited to 'includes/classes/LibertyTranslations.php')
| -rwxr-xr-x | includes/classes/LibertyTranslations.php | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/includes/classes/LibertyTranslations.php b/includes/classes/LibertyTranslations.php new file mode 100755 index 0000000..0527b9b --- /dev/null +++ b/includes/classes/LibertyTranslations.php @@ -0,0 +1,173 @@ +<?php +/** + * @package languages + * @version $Header$ + * + * @author ? + */ + +namespace Bitweaver\Languages; +use Bitweaver\BitBase; +use Bitweaver\Liberty\LibertyBase; + + /** + * @package languages + */ + class LibertyTranslations extends LibertyBase { + public function __construct( $pContentId = null ) { + $this->mContentId = $pContentId; + parent::__construct(); + } + + public function getContentTranslations() { + global $gBitSystem, $gBitLanguage; + $ret = []; + if( BitBase::verifyId( $this->mContentId ) ) { + $translationId = $this->mDb->getOne( "SELECT `translation_id` FROM `".BIT_DB_PREFIX."i18n_content_trans_map` WHERE `content_id`=?", array( $this->mContentId ) ); + if( BitBase::verifyId( $translationId ) ) { + $query = "SELECT lc.`content_id`, lc.`title`, lc.`lang_code`, ictm.`translation_id` + FROM `".BIT_DB_PREFIX."i18n_content_trans_map` ictm + INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON( lc.`content_id`=ictm.`content_id` ) + WHERE ictm.`translation_id`=?"; + $result = $this->mDb->query( $query, array( $translationId ) ); + while( $aux = $result->fetchRow() ) { + // default to site language + if( empty( $aux['lang_code'] )) { + $aux['lang_code'] = $gBitLanguage->mLanguage; + } + $ret[$aux['lang_code']] = $aux; + } + } + } + return $ret; + } + + public function storeTranslation( $pParamHash ) { + if( $this->verify( $pParamHash ) ) { + $table = BIT_DB_PREFIX."i18n_content_trans_map"; + if( !BitBase::verifyId( $pParamHash['translation_store']['translation_id'] ?? 0 ) && is_array( $pParamHash['translation_store'] ) ) { + foreach( $pParamHash['translation_store'] as $store ) { + $result = $this->mDb->associateInsert( $table, $store ); + } + } else { + $result = $this->mDb->associateInsert( $table, $pParamHash['translation_store'] ); + } + } + } + + public function verify( array &$pParamHash ): bool { + $i = 0; + + // make sure we don't have a translation_id for this content yet + if( BitBase::verifyId( $pParamHash['from_id'] ?? 0 ) ) { + $pParamHash['translation_id'] = $this->mDb->getOne( "SELECT `translation_id` FROM `".BIT_DB_PREFIX."i18n_content_trans_map` WHERE `content_id`=?", array( $pParamHash['from_id'] ) ); + } + + // if we have this page in this translation, we should inform the user somehow. + // in theory, this shouldn't happen, but there might be a situation where we end up with 2 users translating the same page at the same time. (is this true?) + + // if we have a translation_id, we add this content to the same group of translations + if( BitBase::verifyId( $pParamHash['translation_id'] ?? 0 ) ) { + $pParamHash['translation_store']['translation_id'] = $pParamHash['translation_id']; + $pParamHash['translation_store']['content_id'] = $pParamHash['content_id']; + } elseif( BitBase::verifyId( $pParamHash['from_id'] ?? 0 ) ) { + // we have a from_id but no translation_id, this is a new entry in the translation map and we need both, the original and the new content_id entered + // we can simply use the from_id as the translation_id + $pParamHash['translation_store'][$i]['translation_id'] = $pParamHash['from_id']; + $pParamHash['translation_store'][$i]['content_id'] = $pParamHash['from_id']; + $i++; + $pParamHash['translation_store'][$i]['translation_id'] = $pParamHash['from_id']; + $pParamHash['translation_store'][$i]['content_id'] = $pParamHash['content_id']; + } + return count( $this->mErrors ) == 0; + } + + public function expunge(): bool { + if( BitBase::verifyId( $this->mContentId ) ) { + $result = $this->mDb->query( "DELETE FROM `".BIT_DB_PREFIX."i18n_content_trans_map` WHERE `content_id`=?", $this->mContentId ); + } + return true; + } +} + +// ================== service functions ================== + +function translation_content_display( &$pObject ) { + global $gBitSmarty, $gBitLanguage; + $trans = new LibertyTranslations( $pObject->mContentId ); + $translations = $trans->getContentTranslations(); + // merge this information that we can display the appropriate flags + if( count( $translations ) > 1 ) { + foreach( $translations as $key => $trans ) { + $translations[$key] = array_merge( $gBitLanguage->mLanguageList[$trans['lang_code']], $trans ); + } + $gBitSmarty->assign( 'i18nTranslations', $translations ); + } +} + +function translation_content_edit( &$pObject, &$pParamHash ) { + global $gBitLanguage, $gBitSmarty, $gBitUser; + $trans = new LibertyTranslations( $pObject->mContentId ); + $translationId = null; + $translations = $trans->getContentTranslations(); + foreach( $gBitLanguage->mLanguageList as $lang_code => $language ) { + $translationsList[$lang_code] = $language; + if( !empty( $translations[$lang_code]['content_id'] ) ) { + $translationsList[$lang_code]['content_id'] = $translations[$lang_code]['content_id']; + $translationsList[$lang_code]['title'] = $translations[$lang_code]['title']; + $translationId = $translations[$lang_code]['translation_id']; + } + } + $gBitSmarty->assign( 'translationsList', $translationsList ); + $gBitSmarty->assign( 'translationId', $translationId ); + + if( BitBase::verifyId( $_REQUEST['i18n']['from_id'] ?? 0 ) ) { + // load the content we're translating from + $transObject = LibertyBase::getLibertyObject( $_REQUEST['i18n']['from_id'] ); + $gBitSmarty->assign( "translateFrom", $transObject ); + + // attempt google translation + if( !empty( $_REQUEST['i18n']['google'] ) && !empty( $transObject->mInfo['data'] )) { + // temporarily replace \n with a string + $nl = 'nlnlnlnlnl'; + // initiate some variables + $transObject->mInfo['google_guess'] = ''; + // we need to split the strings into small chunks due to url length limitations + $strings = str_split( $transObject->mInfo['data'], 1500 ); + foreach( $strings as $string ) { + $requestUrl = "http://translate.google.com/translate_t?ie=UTF-8&oe=UTF-8&text=".urlencode( preg_replace( '/[\n]/', $nl, $string ))."&langpair=en|{$_REQUEST['i18n']['lang_code']}"; + if( $handle = fopen( $requestUrl, "r" )) { + $data = ''; + while( !feof( $handle )) { + $data .= fread( $handle, 8192 ); + } + fclose( $handle ); + preg_match_all( "!<div id=result_box[^>]*>([^<]*)</div>.*!", $data, $matches ); + if( isset( $matches[1][0] )) { + $transObject->mInfo['google_guess'] .= preg_replace( "/".preg_quote( $nl, "/" )."/", "\n", $matches[1][0] ); + } + } + } +die; + } + } +} + +// store the content +function translation_content_store( $pObject, $pParamHash ) { + // if we are creating this content and we have a from_id, we know that we're translating a page + // mInfo['content_id'] isn't set when content is created + if( empty( $pObject->mInfo['content_id'] ) && BitBase::verifyId( $_REQUEST['i18n']['from_id'] ?? 0 ) ) { + $trans = new LibertyTranslations(); + $storeHash = $_REQUEST['i18n']; + $storeHash['content_id'] = $pParamHash['content_id']; + if( !$trans->storeTranslation( $storeHash ) ) { + // error + } + } +} + +function translation_content_expunge( $pObject, $pParamHash ) { + $trans = new LibertyTranslations( $pObject->mContentId ); + $trans->expunge(); +}
\ No newline at end of file |
