summaryrefslogtreecommitdiff
path: root/includes/classes/LibertyTranslations.php
blob: ad69b0344bbb7de32d0c2c4c72bf1d0324a0846b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?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`=?", [ $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, [ $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`=?", [ $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();
}