/** * @param LanguageSource $languageSource * @return LanguageTranslate */ private function _getTranslation($languageSource) { $languageId = Yii::$app->request->post('language_id', ''); $languageTranslate = $languageSource->getLanguageTranslates()->andWhere(['language' => $languageId])->one(); if (!$languageTranslate) { $languageTranslate = new LanguageTranslate(['id' => $languageSource->id, 'language' => $languageId]); } return $languageTranslate; }
/** * Scanning project for text not stored in database. * @return integer The number of new language elements. */ public function scanning() { $this->_scanningProject(); $languageSources = LanguageSource::find()->all(); foreach ($languageSources as $languageSource) { if (isset($this->_languageItems[$languageSource->category][$languageSource->message])) { unset($this->_languageItems[$languageSource->category][$languageSource->message]); } } $languageSource = new LanguageSource(); return $languageSource->insertLanguageItems($this->_languageItems); }
/** * Creating _languageSources array. */ private function _createLanguageSource() { $languageSources = LanguageSource::find()->all(); foreach ($languageSources as $languageSource) { $this->_languageSources[$languageSource->category][$languageSource->message] = $languageSource->id; } }
/** * Deletes an existing LanguageSource model. * If deletion is successful, the browser will be redirected to the 'list' page. * @return json */ public function run() { Yii::$app->response->format = Response::FORMAT_JSON; $ids = Yii::$app->request->post('ids'); LanguageSource::deleteAll(['id' => (array) $ids]); return []; }
/** * @param array $params Search conditions. * @return ActiveDataProvider */ public function search($params) { $translateLanguage = Yii::$app->request->get('language_id', Yii::$app->sourceLanguage); $sourceLanguage = $this->_getSourceLanguage(); $query = LanguageSource::find(); $dataProvider = new ActiveDataProvider(['query' => $query]); $dataProvider->setSort(['attributes' => ['id', 'category', 'message', 'translation' => ['asc' => ['lt.translation' => SORT_ASC], 'desc' => ['lt.translation' => SORT_DESC], 'label' => Yii::t('language', 'Translation')]]]); if (!($this->load($params) && $this->validate())) { $query->joinWith(['languageTranslate' => function ($query) use($translateLanguage) { $query->from(['lt' => LanguageTranslate::tableName()])->onCondition(['lt.language' => $translateLanguage]); }]); $query->joinWith(['languageTranslateByLanguage' => function ($query) use($sourceLanguage) { $query->from(['ts' => LanguageTranslate::tableName()])->onCondition(['ts.language' => $sourceLanguage]); }]); return $dataProvider; } $query->andFilterWhere(['id' => $this->id, 'category' => $this->category]); $query->andFilterWhere(['or', $this->createLikeExpression('message', $this->message), $this->createLikeExpression('ts.translation', $this->message)]); $query->joinWith(['languageTranslate' => function ($query) use($translateLanguage) { $query->from(['lt' => LanguageTranslate::tableName()])->onCondition(['lt.language' => $translateLanguage])->andFilterWhere($this->createLikeExpression('lt.translation', $this->translation)); }]); $query->joinWith(['languageTranslateByLanguage' => function ($query) use($sourceLanguage) { $query->from(['ts' => LanguageTranslate::tableName()])->onCondition(['ts.language' => $sourceLanguage]); }]); return $dataProvider; }
/** * @return Array[] Generate a two dimensional array of the translation data for the exportLanguages: * * ~~~ * [ * 'languages' => [], * 'languageSources' => [], * 'languageTranslations' => [], * ] * ~~~ * */ public function getExportData() { $languages = Language::findAll($this->exportLanguages); $languageSources = LanguageSource::find()->all(); $languageTranslations = LanguageTranslate::findAll(['language' => $this->exportLanguages]); $data = ['languages' => $languages, 'languageSources' => $languageSources, 'languageTranslations' => $languageTranslations]; return $data; }
/** * Creating dialogue box. * @return View */ public function run() { $languageSource = LanguageSource::findOne(['category' => Yii::$app->request->post('category', ''), 'MD5(message)' => Yii::$app->request->post('hash', '')]); if (!$languageSource) { return '<div id="translate-manager-error">' . Yii::t('language', 'Text not found in database! Please run project scan before translating!') . '</div>'; } $languageTranslate = $languageSource->getLanguageTranslateByLanguage(Yii::$app->request->post('language_id', ''))->one() ?: new \lajax\translatemanager\models\LanguageTranslate(['id' => $languageSource->id, 'language' => Yii::$app->request->post('language_id', '')]); return $this->controller->renderPartial('dialog', ['languageSource' => $languageSource, 'languageTranslate' => $languageTranslate]); }
/** * Initializing $_languageElements array. * @param array $languageSourceIds */ private function _initLanguageElements($languageSourceIds) { $languageSources = LanguageSource::findAll(['id' => $languageSourceIds]); foreach ($languageSources as $languageSource) { $this->_languageElements[$languageSource->category][$languageSource->message] = $languageSource->id; $category = Console::ansiFormat($languageSource->category, [Console::FG_RED]); $message = Console::ansiFormat($languageSource->message, [Console::FG_RED]); $this->_scanner->stdout('category: ' . $category . ', message: ' . $message); } }
/** * Returning messages in the given language * @return string */ public function run() { $languageTranslate = LanguageTranslate::findOne(['id' => Yii::$app->request->get('id', 0), 'language' => Yii::$app->request->get('language_id', '')]); if ($languageTranslate) { $translation = $languageTranslate->translation; } else { $languageSource = LanguageSource::findOne(['id' => Yii::$app->request->get('id', 0)]); $translation = $languageSource ? $languageSource->message : ''; } return $translation; }
public function search($params) { $this->_languageId = $params['language_id']; $query = LanguageSource::find()->with(['languageTranslate' => function ($query) { $query->andWhere(['language' => $this->_languageId]); }]); $dataProvider = new ActiveDataProvider(['query' => $query]); if (!($this->load($params) && $this->validate())) { return $dataProvider; } $query->andFilterWhere(['id' => $this->id]); $query->andFilterWhere(['like', 'category', $this->category])->andFilterWhere(['like', 'message', $this->message]); return $dataProvider; }
/** * Returns an ArrayDataProvider consisting of language elements. * @param array $languageSourceIds * @return ArrayDataProvider */ private function _createLanguageSourceDataProvider($languageSourceIds) { $languageSources = LanguageSource::find()->with('languageTranslates')->where(['id' => $languageSourceIds])->all(); $data = []; foreach ($languageSources as $languageSource) { $languages = []; if ($languageSource->languageTranslates) { foreach ($languageSource->languageTranslates as $languageTranslate) { $languages[] = $languageTranslate->language; } } $data[] = ['id' => $languageSource->id, 'category' => $languageSource->category, 'message' => $languageSource->message, 'languages' => implode(', ', $languages)]; } return new ArrayDataProvider(['allModels' => $data, 'pagination' => false]); }
/** * @param array $params Search conditions. * @return ActiveDataProvider */ public function search($params) { Yii::$app->session->setFlash('TM-language__id', $params['language_id']); $query = LanguageSource::find(); $dataProvider = new ActiveDataProvider(['query' => $query]); $dataProvider->setSort(['attributes' => ['id', 'category', 'message', 'translation' => ['asc' => ['translation' => SORT_ASC], 'desc' => ['translation' => SORT_DESC], 'label' => Yii::t('language', 'Translation')]]]); if (!($this->load($params) && $this->validate())) { $query->joinWith('languageTranslateByLanguage'); return $dataProvider; } $query->andFilterWhere(['id' => $this->id, 'category' => $this->category]); $query->andFilterWhere(['like', 'lower(message)', mb_strtolower($this->message, 'UTF-8')]); $query->joinWith(['languageTranslateByLanguage' => function ($query) { if ($this->translation) { $searchEmptyCommand = \Yii::$app->controller->module->searchEmptyCommand; if ($searchEmptyCommand && $this->translation == $searchEmptyCommand) { $query->andWhere(['or', ['translation' => null], ['translation' => '']]); } else { $query->andWhere(['like', 'lower(translation)', mb_strtolower($this->translation, 'UTF-8')]); } } }]); return $dataProvider; }
/** * @return \yii\db\ActiveQuery */ public function getLanguageSources() { return $this->hasMany(LanguageSource::className(), ['id' => 'id'])->viaTable(LanguageTranslate::tableName(), ['language' => 'language_id']); }
/** * Saveing new language element by category. * @param string $message Language element save in database. * @param string $category the message category. */ public static function saveMessage($message, $category = 'database') { $languageSources = \lajax\translatemanager\models\LanguageSource::find()->where(['category' => $category])->all(); $messages = []; foreach ($languageSources as $languageSource) { $messages[$languageSource->message] = $languageSource->id; } if (empty($messages[$message])) { $languageSource = new \lajax\translatemanager\models\LanguageSource(); $languageSource->category = $category; $languageSource->message = $message; $languageSource->save(); } }
/** * Import the uploaded file. Existing languages and translations will be updated, new ones will be created. * Source messages won't be updated, only created if they not exist. * @return array * @throws BadRequestHttpException * @throws Exception */ public function import() { $result = ['languages' => ['new' => 0, 'updated' => 0], 'languageSources' => ['new' => 0, 'updated' => 0], 'languageTranslations' => ['new' => 0, 'updated' => 0]]; $data = $this->parseImportFile(); /** @var Language[] $languages */ $languages = Language::find()->indexBy('language_id')->all(); foreach ($data['languages'] as $importedLanguage) { if (isset($languages[$importedLanguage['language_id']])) { $language = $languages[$importedLanguage['language_id']]; } else { $language = new Language(); } //cast integers $importedLanguage['status'] = (int) $importedLanguage['status']; $language->attributes = $importedLanguage; if (count($language->getDirtyAttributes())) { $saveType = $language->isNewRecord ? 'new' : 'updated'; if ($language->save()) { $result['languages'][$saveType]++; } else { $this->throwInvalidModelException($language); } } } /** @var LanguageSource[] $languageSources */ $languageSources = LanguageSource::find()->indexBy('id')->all(); /** @var LanguageTranslate[] $languageTranslations */ $languageTranslations = LanguageTranslate::find()->all(); /* * Create 2 dimensional array for current and imported translation, first index by LanguageSource->id * and than indexed by LanguageTranslate->language. * E.g.: [ * id => [ * language => LanguageTranslate (for $languageTranslations) / Array (for $importedLanguageTranslations) * ... * ] * ... * ] */ $languageTranslations = ArrayHelper::map($languageTranslations, 'language', function ($languageTranslation) { return $languageTranslation; }, 'id'); $importedLanguageTranslations = ArrayHelper::map($data['languageTranslations'], 'language', function ($languageTranslation) { return $languageTranslation; }, 'id'); foreach ($data['languageSources'] as $importedLanguageSource) { $languageSource = null; //check if id exist and if category and messages are matching if (isset($languageSources[$importedLanguageSource['id']]) && $languageSources[$importedLanguageSource['id']]->category == $importedLanguageSource['category'] && $languageSources[$importedLanguageSource['id']]->message == $importedLanguageSource['message']) { $languageSource = $languageSources[$importedLanguageSource['id']]; } if (is_null($languageSource)) { //no match by id, search by message foreach ($languageSources as $languageSourceSearch) { if ($languageSourceSearch->category == $importedLanguageSource['category'] && $languageSourceSearch->message == $importedLanguageSource['message']) { $languageSource = $languageSourceSearch; break; } } } if (is_null($languageSource)) { //still no match, create new $languageSource = new LanguageSource(['category' => $importedLanguageSource['category'], 'message' => $importedLanguageSource['message']]); if ($languageSource->save()) { $result['languageSources']['new']++; } else { $this->throwInvalidModelException($languageSource); } } //do we have translations for the current source? if (isset($importedLanguageTranslations[$importedLanguageSource['id']])) { //loop through the translations for the current source foreach ($importedLanguageTranslations[$importedLanguageSource['id']] as $importedLanguageTranslation) { $languageTranslate = null; //is there already a translation for this souce if (isset($languageTranslations[$languageSource->id]) && isset($languageTranslations[$languageSource->id][$importedLanguageTranslation['language']])) { $languageTranslate = $languageTranslations[$languageSource->id][$importedLanguageTranslation['language']]; } //no translation found, create a new one if (is_null($languageTranslate)) { $languageTranslate = new LanguageTranslate(); } $languageTranslate->attributes = $importedLanguageTranslation; //overwrite the id because the $languageSource->id might be different from the $importedLanguageTranslation['id'] $languageTranslate->id = $languageSource->id; if (count($languageTranslate->getDirtyAttributes())) { $saveType = $languageTranslate->isNewRecord ? 'new' : 'updated'; if ($languageTranslate->save()) { $result['languageTranslations'][$saveType]++; } else { $this->throwInvalidModelException($languageTranslate); } } } } } return $result; }
/** * @return \yii\db\ActiveQuery */ public function getLanguageSource() { return $this->hasOne(LanguageSource::className(), ['id' => 'id']); }
/** * Returns the category of LanguageSource in an associative array. * @return array */ public static function getCategories() { $languageSources = \lajax\translatemanager\models\LanguageSource::find()->select('category')->distinct()->all(); $categories = []; foreach ($languageSources as $languageSource) { $categories[$languageSource->category] = $languageSource->category; } return $categories; }
/** * Loads language elements in JavaScript category. */ private function _loadLanguageItems() { $this->_languageItems = LanguageSource::find()->joinWith(['languageTranslate' => function ($query) { $query->where(['language' => $this->_languageId]); }])->where(['category' => Scanner::CATEGORY_JAVASCRIPT])->all(); }
/** * Initialising $_languageItems and $_removableLanguageSourceIds arrays. */ private function _initLanguageArrays() { $this->_scanningProject(); $languageSources = LanguageSource::find()->all(); foreach ($languageSources as $languageSource) { if (isset($this->_languageElements[$languageSource->category][$languageSource->message])) { unset($this->_languageElements[$languageSource->category][$languageSource->message]); } else { $this->_removableLanguageSourceIds[$languageSource->id] = $languageSource->id; } } }
/** * Loads language elements in JavaScript category. */ private function _getLanguageItems() { $this->_languageItems = LanguageSource::find()->joinWith(['languageTranslate' => function ($query) { $query->where('language_translate.language = :language', [':language' => $this->_languageId]); }])->where('`category` = :category', [':category' => 'javascript'])->all(); }