public function collectRules() { $multilanguage_support = Yii::app()->params['multilanguage_support']; if ($multilanguage_support) { $languages = Language::getList(); $languages = implode('|', array_keys($languages)); $language_pattern = "<language:({$languages})>"; } $routes = array('/<controller:\\w+>/<id:\\d+>' => '<controller>/view', '/<controller:\\w+>/<action:\\w+>/<id:\\d+>' => '<controller>/<action>', '/<controller:\\w+>/<action:\\w+>' => '<controller>/<action>'); if (Yii::app()->params['collect_routes_from_modules']) { foreach (Yii::app()->getModules() as $id => $config) { $module = Yii::app()->getModule($id); if (method_exists($module, 'routes')) { $routes = array_merge($routes, $module->routes()); } } } $multilanguage_support = Yii::app()->params['multilanguage_support']; if ($multilanguage_support) { $languages = Language::getList(); $languages = implode('|', array_keys($languages)); $language_pattern = "<language:({$languages})>"; } foreach ($routes as $pattern => $route) { unset($routes[$pattern]); $pattern = '/' . trim($pattern, '/'); if ($multilanguage_support) { $pattern = '/' . $language_pattern . $pattern; } $routes[$pattern] = $route; } $routes = array_reverse($routes); $routes['<language:(en|ru)>/<route:.*>'] = '<route>'; Yii::app()->urlManager->addRules($routes); }
protected function preFilter($filterChain) { if (!Yii::app()->params->multilanguage_support) { return true; } $request = Yii::app()->request; if ($lang = Yii::app()->request->getParam('language')) { Yii::app()->language = $lang; } Yii::app()->session['language'] = Yii::app()->language; if (Yii::app()->request->isPostRequest) { return true; } $languages = Language::getList(); $url_parts = explode('/', $_SERVER['REQUEST_URI']); if (!isset($languages[$url_parts[1]])) { $request->redirect('/' . Yii::app()->session['language'] . $_SERVER['REQUEST_URI']); } return true; }
public function actionManage() { $model = new LanguageMessage(ActiveRecord::SCENARIO_SEARCH); $model->unsetAttributes(); if (isset($_GET['LanguageMessage'])) { $model->attributes = $_GET['LanguageMessage']; } $this->render('manage', array('model' => $model, 'languages' => Language::getList())); }
public function actionChangeLanguage($set_language, $back_url) { $languages = Language::getList(); if (!isset($languages[$set_language])) { throw new CHttpException("Неизвестный системе язык: '{$set_language}'"); } Yii::app()->session['language'] = $set_language; $back_url = explode('/', base64_decode($back_url)); $back_url[1] = $set_language; $back_url = implode('/', $back_url); $this->redirect($back_url); }
public function __construct($id, $name, $visibility, $defaultLanguage) { $this->id = $id; $this->name = $name; $this->visibility = $visibility; $this->defaultLanguage = $defaultLanguage; $this->languages = array(); $languages = Language::getList(); foreach ($languages as $language) { $this->languages[$language] = new Language_Android($language); } }
public function beforeFormInit($event) { if (!$event->sender->add_elements_from_behaviors) { return true; } $elements = $event->sender->getElements(); $meta = $this->owner->meta(); $languages = Language::getList(); if (isset($meta['language']) && count($languages) > 1) { $elements['language'] = array('type' => 'dropdownlist', 'items' => $languages); } $event->sender->setElements($elements); }
public function attributeLabels() { $labels = array(); foreach ($this->meta() as $field_data) { $labels[$field_data["Field"]] = t($field_data["Comment"]); } $languages = Language::getList(); if (count($languages) > 1) { $labels['language'] = 'Язык'; } $labels['captcha'] = 'Введите код с картинки'; return $labels; }
public function execute() { $user = connectionUserModel::create()->getInfo((int) Request::post('id')); $activeLang = $user['lang']; $lang = array(); array_map(function ($a) use(&$lang, $activeLang) { if ($a['iso'] == $activeLang) { $lang = $a; } }, Language::getList()); $fieldModel = new connectionFieldsModel(); $fields = array(); $fields = array_merge($fieldModel->getGroupLocale('info', 'ru'), $fields); $fields = array_merge($fieldModel->getGroupLocale('interest', 'ru'), $fields); $this->smarty->assign('lang', $lang); $this->smarty->assign('user', $user); $this->smarty->assign('fields', $fields); }
/** * Create new page * @return Redirect */ public function postCreate() { User::onlyHas("page-create"); $parent = Input::get('parent'); $page = new Post(); $page->parent = $parent; $page->author_id = Auth::user()->id; $page->taxonomy_id = $this->taxonomy->id; $page->save(); foreach (Language::getList() as $lang) { $pageLang = new PostLang(); $pageLang->lang_id = $lang->id; $pageLang->post_id = $page->id; $pageLang->save(); } $page->ord_num = $page->id; $page->save(); Log::info("Create page #{$page->id}"); return Redirect::to('page/index/' . $page->id); }
public static function lang() { if (!is_null(self::$lang)) { return self::$lang; } self::$lang = self::$langDefault; if (Request::cookie(self::$langKeyCookie)) { $saveLang = Request::cookie(self::$langKeyCookie); } else { $saveLang = Request::getUserLang(); } $lang = array_map(function ($a) { return $a['iso']; }, Language::getList()); if (in_array($saveLang, $lang)) { self::$lang = $saveLang; } Request::cookie(self::$langKeyCookie, self::$lang); return self::$lang; }
/** * Removes all translations that don't differ from the default language * * These translations have no effect and thus only distort the progress indication * * @param int $repositoryID * @param int $defaultLanguageID */ public static function cleanLanguages($repositoryID, $defaultLanguageID) { $languages = Language::getList(); $phraseIDsToDelete = array(); foreach ($languages as $language) { if ($language != $defaultLanguageID) { $phraseIDs = self::select("SELECT id FROM phrases AS a WHERE a.repositoryID = " . intval($repositoryID) . " AND a.languageID = " . intval($language) . " AND a.payload = (SELECT payload FROM phrases AS b WHERE b.repositoryID = a.repositoryID AND b.languageID = " . intval($defaultLanguageID) . " AND b.phraseKey = a.phraseKey)"); foreach ($phraseIDs as $phraseID) { $phraseIDsToDelete[] = intval($phraseID['id']); } } } self::delete("DELETE FROM phrases WHERE id IN (" . implode(',', $phraseIDsToDelete) . ")"); }
public function getHref() { if ($this->page) { $url = $this->page->href; } else { if ($this->module_url) { $url = Yii::app()->controller->createUrl($this->module_url, ['section_id' => $this->id]); } else { $url = $this->url; } } if (!empty($url) && mb_substr($url, 0, 1, 'utf-8') != '/') { $url = '/' . $url; } if (count(Language::getList()) > 1) { $url = '/' . Yii::app()->language . $url; } //echo $url . "<br/>"; return $url; }
/** * Exports the given repository and creates a ZIP file containing XML output files * * @param Repository $repository the Repository instance to export * @param string $filename the output file name inside each language folder * @param int $groupID the group to get the output for (or Phrase::GROUP_ALL) * @param int $format the format (constant) to use for this export * @param int $minCompletion the minimum percentage of completion for languages to be eligible for exporting * @param bool $ignoreIfSameAsDefault ignore phrases which are the same as the default language * @throws Exception if the repository could not be exported */ public static function exportRepository($repository, $filename, $groupID, $format, $minCompletion = 0, $ignoreIfSameAsDefault = false) { if (self::isFilenameValid($filename)) { if ($repository instanceof Repository) { $exportSuccess = true; $randomDir = mt_rand(1000000, 9999999); $savePath = URL::getTempPath(false) . URL::encodeID($repository->getID()); self::deleteDirectoryRecursively($savePath); // delete all old output files from output directory first $savePath .= '/' . $randomDir; // navigate to random directory inside output folder if (mkdir($savePath, 0755, true)) { // if output folder could be created $languages = Language::getList(); $defaultLanguageObject = $repository->getLanguage($repository->getDefaultLanguage()); foreach ($languages as $language) { $languageObject = $repository->getLanguage($language); $languageKeys = $languageObject->getKeys(); $ignorePhrasesSameAsDefault = $ignoreIfSameAsDefault && $repository->getDefaultLanguage() != $language; if ($format == self::FORMAT_ANDROID_XML_ESCAPED_HTML) { $languageOutput = $languageObject->outputAndroidXMLEscapedHTML($groupID, $ignorePhrasesSameAsDefault, $defaultLanguageObject); $fileExtension = '.xml'; } elseif ($format == self::FORMAT_JSON) { $languageOutput = $languageObject->outputJSON($groupID, $ignorePhrasesSameAsDefault, $defaultLanguageObject); $fileExtension = '.json'; } elseif ($format == self::FORMAT_PLAINTEXT) { $languageOutput = $languageObject->outputPlaintext($groupID, $ignorePhrasesSameAsDefault, $defaultLanguageObject); $fileExtension = '.txt'; } else { $languageOutput = $languageObject->outputAndroidXML($groupID, $ignorePhrasesSameAsDefault, $defaultLanguageObject); $fileExtension = '.xml'; } if ($languageOutput->getCompleteness() >= $minCompletion) { foreach ($languageKeys as $languageKey) { if (mkdir($savePath . '/' . $languageKey . '/', 0755, true)) { if (file_put_contents($savePath . '/' . $languageKey . '/' . $filename . $fileExtension, $languageOutput->getContent()) !== false) { $exportSuccess = true; } else { // output file could not be written $exportSuccess = false; } } else { // sub-directory for language could not be created $exportSuccess = false; } } } } } else { // output folder could not be created $exportSuccess = false; } if ($exportSuccess) { $outputPath = URL::getTempPath(true) . URL::encodeID($repository->getID()) . '/' . $randomDir; if (self::zipFolder($savePath, $savePath . '/Export.zip')) { UI::redirectToURL($outputPath . '/Export.zip'); } } } else { throw new Exception('The repository must be an instance of class Repository'); } } else { throw new Exception('Invalid filename: ' . $filename); } }
public function isRootUrl($url = null) { if (!$url) { $url = $_SERVER["REQUEST_URI"]; } $languages = Language::getList(); return isset($languages[trim($url, "/")]); }
public function run() { $this->render('LanguageSwitcher', array('languages' => Language::getList())); }
} ?> <li><a href="#media" role="tab" data-toggle="tab"><?php echo varlang('media'); ?> </a></li> </ul> <div class="tab-content"> <div class="tab-pane active" id="general"> <?php echo View::make('sections.feed.tab-post-general')->with($general)->render(); ?> </div> <?php foreach (Language::getList() as $lang) { if (isset($post_langs[$lang->id])) { ?> <div class="tab-pane" id="lang<?php echo $lang->id; ?> "> <?php echo View::make('sections.feed.tab-post-lang')->with('post_lang', $post_langs[$lang->id])->with('post', $general['post']); ?> </div> <?php } } ?> <div class="tab-pane" id="media">
<?php $this->page_title = t('Просмотр страницы'); $this->tabs = ['редактировать' => $this->createUrl('update', ['id' => $model->id]), 'список страниц' => $this->createUrl('manage')]; $languages = Language::getList(); $this->widget('AdminDetailView', ['data' => $model, 'attributes' => ['title', 'url', ['name' => 'date_create', 'value' => date('d.m.Y h:i', strtotime($model->date_create))], ['label' => t('Мета-теги'), 'value' => MetaTag::model()->html($model->id, get_class($model)), 'type' => 'raw'], ['name' => 'language', 'value' => $languages[$model->language]], ['name' => 'text', 'type' => 'raw', 'value' => $model->text], ['label' => 'Тэги', 'type' => 'raw', 'value' => Tag::getString(get_class($model), $model->id)]]]);
/** * create new empty post * @param int $feed_id * @return redir */ public function getNewpost($feed_id = 0) { User::onlyHas('feedpost-edit'); $this->data['feed_id'] = $feed_id; $post = new Post(); $post->author_id = Auth::user()->id; $post->taxonomy_id = $this->taxonomy->id; $post->parent = 0; $post->save(); if ($feed_id) { $feedpost = new FeedPost(); $feedpost->post_id = $post->id; $feedpost->feed_id = $feed_id; $feedpost->save(); } foreach (Language::getList() as $lang) { $postlang = new PostLang(); $postlang->lang_id = $lang->id; $postlang->post_id = $post->id; $postlang->save(); } Log::info("Create new post #{$post->id}"); return Redirect::to('feed/editpost/' . $post->id); }
public static function getPage_Project($contents, $containers) { $page = self::getDataGET('p'); $repositoryID = self::validateID(self::getDataGET('project'), true); $languageID = self::validateID(self::getDataGET('language'), true); $isAddingMode = isset($page) && $page == 'add_phrase'; $isExportMode = isset($page) && $page == 'export'; $isImportMode = isset($page) && $page == 'import'; $repositoryData = Database::getRepositoryData($repositoryID); $languageData = Database::getLanguageData($languageID); if (empty($repositoryData)) { self::addBreadcrumbItem(URL::toProject($repositoryID), 'Project not found'); self::setTitle('Project not found'); $contents[] = new UI_Heading('Project not found', true); $contents[] = new UI_Paragraph('We\'re sorry, but we could not find the project that you requested.'); $contents[] = new UI_Paragraph('Please check if you have made any typing errors.'); } else { self::addBreadcrumbItem(URL::toProject($repositoryID), htmlspecialchars($repositoryData['name'])); Authentication::saveCachedRepository($repositoryID, $repositoryData['name']); $repository = new Repository($repositoryID, $repositoryData['name'], $repositoryData['visibility'], $repositoryData['defaultLanguage']); $role = Database::getRepositoryRole(Authentication::getUserID(), $repositoryID); $permissions = $repository->getPermissions(Authentication::getUserID(), $role); if (Authentication::getUserID() <= 0) { self::setTitle($repositoryData['name']); $contents[] = new UI_Heading(htmlspecialchars($repositoryData['name']), true); $contents[] = self::getLoginForm(); } elseif ($permissions->isInvitationMissing()) { self::setTitle($repositoryData['name']); $contents[] = new UI_Heading(htmlspecialchars($repositoryData['name']), true); $contents[] = self::getInvitationForm($repositoryID); } else { $defaultLanguage = new Language_Android($repository->getDefaultLanguage()); if ($isAddingMode) { $formTargetURL = URL::toAddPhrase($repositoryID, $languageID); self::addBreadcrumbItem($formTargetURL, 'Add phrase'); $form = new UI_Form($formTargetURL, false); $radioType = new UI_Form_Radio('Phrase type', 'add_phrase[type]'); $radioType->addOption('<abbr title="Resource type for single phrases">string</abbr>', 1, 'addPhraseTypeSelect(\'addPhraseGroup_String\');'); $radioType->addOption('<abbr title="Resource type for arrays of phrases">string-array</abbr>', 2, 'addPhraseTypeSelect(\'addPhraseGroup_StringArray\');'); $radioType->addOption('<abbr title="Resource type for quantity strings">plurals</abbr>', 3, 'addPhraseTypeSelect(\'addPhraseGroup_Plurals\');'); $form->addContent($radioType); $textPhraseKey = new UI_Form_Text('Key', 'add_phrase[key]', 'Unique identifier', false, 'This is the short string that you\'ll identify the phrase(s) with later.'); $form->addContent($textPhraseKey); $textPhraseStringValue = new UI_Form_Textarea('String', 'add_phrase[string]', 'String for ' . $defaultLanguage->getNameFull(), 'You can later translate this string to other languages.', false, '', 2, $defaultLanguage->isRTL(), '', 'addPhraseGroup_String'); $form->addContent($textPhraseStringValue); $textPhraseStringArrayValue = new UI_Form_Textarea('Item', 'add_phrase[string_array][]', 'Item for ' . $defaultLanguage->getNameFull(), 'You can later translate this item to other languages.', false, '', 2, $defaultLanguage->isRTL(), '', 'addPhraseGroup_StringArray', 'display:none;', false); $form->addContent($textPhraseStringArrayValue); $quantities = Phrase_Android_Plurals::getList(); foreach ($quantities as $quantity) { $textPhrasePluralsValue = new UI_Form_Textarea($quantity, 'add_phrase[plurals][' . $quantity . ']', 'Quantity for ' . $defaultLanguage->getNameFull(), 'You can later translate this quantity to other languages.', false, '', 2, $defaultLanguage->isRTL(), '', 'addPhraseGroup_Plurals', 'display:none;'); $form->addContent($textPhrasePluralsValue); } $buttonSubmit = new UI_Form_Button('Save phrase(s)', UI_Link::TYPE_SUCCESS); $buttonAddItem = new UI_Link('Add item', '#', UI_Link::TYPE_INFO, 'addPhraseGroup_StringArray', 'display:none;', 'addPhraseAddItem(\'add_phrase[string_array][]\'); return false;'); $buttonCancel = new UI_Link('Cancel', URL::toLanguage($repositoryID, $languageID), UI_Link::TYPE_UNIMPORTANT); $form->addContent(new UI_Form_ButtonGroup(array($buttonSubmit, $buttonAddItem, $buttonCancel))); self::setTitle('Add phrase to default language'); $contents[] = new UI_Heading('Add phrase to default language', true); $contents[] = $form; } elseif ($isExportMode) { $formTargetURL = URL::toExport($repositoryID); self::addBreadcrumbItem($formTargetURL, 'Export'); $form = new UI_Form($formTargetURL, false); $textFilename = new UI_Form_Text('Filename', 'export[filename]', 'strings', false, 'Please choose a filename (without extension) for the output files that will be exported inside each language folder.'); $textFilename->setDefaultValue('strings'); $form->addContent($textFilename); $selectGroupID = new UI_Form_Select('Phrase groups', 'export[groupID]', 'Do you want to export all phrases or only a single group?'); $selectGroupID->addOption('(All groups)', Phrase::GROUP_ALL); $selectGroupID->addOption('(Default group)', Phrase::GROUP_NONE); $phraseGroups = Database::getPhraseGroups($repositoryID, $repositoryData['defaultLanguage'], false); foreach ($phraseGroups as $phraseGroup) { $selectGroupID->addOption($phraseGroup['name'], $phraseGroup['id']); } $form->addContent($selectGroupID); $selectMinCompletion = new UI_Form_Select('Minimum completion', 'export[minCompletion]', 'You can either export all languages or only those with a given minimum completion.'); $selectMinCompletion->addOption('Export all languages', 0); $selectMinCompletion->addOption('5% completion or more', 5); $selectMinCompletion->addOption('10% completion or more', 10); $selectMinCompletion->addOption('25% completion or more', 25); $selectMinCompletion->addOption('50% completion or more', 50); $selectMinCompletion->addOption('75% completion or more', 75); $selectMinCompletion->addOption('100% completion or more', 100); $form->addContent($selectMinCompletion); $selectFormat = new UI_Form_Select('Output format', 'export[format]', 'Which output format do you want to export in? When developing for Android, you should usually keep the default choice.'); $selectFormat->addOption('Android XML', File_IO::FORMAT_ANDROID_XML); $selectFormat->addOption('Android XML with escaped HTML', File_IO::FORMAT_ANDROID_XML_ESCAPED_HTML); $selectFormat->addOption('JSON', File_IO::FORMAT_JSON); $selectFormat->addOption('Plaintext', File_IO::FORMAT_PLAINTEXT); $form->addContent($selectFormat); $ignoreIfSameAsDefault = new UI_Form_Select('Exclude defaults', 'export[ignoreIfSameAsDefault]', 'Do you want to exclude phrases which are the same as the respective phrase in the default language?'); $ignoreIfSameAsDefault->addOption('No, export a complete file for each language', 0); $ignoreIfSameAsDefault->addOption('Yes, export only what\'s necessary', 1); $form->addContent($ignoreIfSameAsDefault); $isAdmin = Repository::hasUserPermissions(Authentication::getUserID(), $repositoryID, $repositoryData, Repository::ROLE_ADMINISTRATOR); $buttonSubmit = new UI_Form_Button('Export', UI_Link::TYPE_SUCCESS); $buttonManageGroups = new UI_Link('Manage groups', URL::toEditProject($repositoryID, true), UI_Link::TYPE_UNIMPORTANT); $buttonCancel = new UI_Link('Cancel', URL::toProject($repositoryID), UI_Link::TYPE_UNIMPORTANT); if ($isAdmin) { $form->addContent(new UI_Form_ButtonGroup(array($buttonSubmit, $buttonManageGroups, $buttonCancel))); } else { $form->addContent(new UI_Form_ButtonGroup(array($buttonSubmit, $buttonCancel))); } self::setTitle('Export'); $contents[] = new UI_Heading('Export', true); $contents[] = $form; } elseif ($isImportMode) { $formTargetURL = URL::toImport($repositoryID); self::addBreadcrumbItem($formTargetURL, 'Import XML'); $form = new UI_Form($formTargetURL, false, true); $radioOverwrite = new UI_Form_Radio('Overwrite', 'import[overwrite]'); $radioOverwrite->addOption('<strong>Import only new phrases</strong> and do not overwrite any existing phrases', 0); $radioOverwrite->addOption('<strong>Import all phrases</strong> and overwrite any phrases that do already exist', 1); $form->addContent($radioOverwrite); $selectLanguage = new UI_Form_Select('Language', 'import[languageID]', 'Which language do you want to import the phrases for?', false, '', '', 'if (this.value === \'' . $repositoryData['defaultLanguage'] . '\') { $(\'.import-group-id\').show(400); } else { $(\'.import-group-id\').hide(400); }'); $selectLanguage->addOption('— Please choose —', 0); $languageIDs = Language::getList($repositoryData['defaultLanguage']); foreach ($languageIDs as $languageID) { $selectLanguage->addOption(Language_Android::getLanguageNameFull($languageID), $languageID); } $form->addContent($selectLanguage); $selectGroupID = new UI_Form_Select('Phrase group', 'import[groupID]', 'Which group do you want to import the phrases to?', false, 'import-group-id', 'display:none;'); $selectGroupID->addOption('(Default group)', Phrase::GROUP_NONE); $phraseGroups = Database::getPhraseGroups($repositoryID, $repositoryData['defaultLanguage'], false); foreach ($phraseGroups as $phraseGroup) { $selectGroupID->addOption($phraseGroup['name'], $phraseGroup['id']); } $form->addContent($selectGroupID); $fileSizeHidden = new UI_Form_Hidden('MAX_FILE_SIZE', File_IO::getMaxFileSize()); $form->addContent($fileSizeHidden); $fileXML = new UI_Form_File('XML file', 'importFileXML', 'The XML resources file that you want to extract the phrases from.'); $form->addContent($fileXML); $isAdmin = Repository::hasUserPermissions(Authentication::getUserID(), $repositoryID, $repositoryData, Repository::ROLE_ADMINISTRATOR); $buttonSubmit = new UI_Form_Button('Import XML', UI_Link::TYPE_SUCCESS); $buttonManageGroups = new UI_Link('Manage groups', URL::toEditProject($repositoryID, true), UI_Link::TYPE_UNIMPORTANT); $buttonCancel = new UI_Link('Cancel', URL::toProject($repositoryID), UI_Link::TYPE_UNIMPORTANT); if ($isAdmin) { $form->addContent(new UI_Form_ButtonGroup(array($buttonSubmit, $buttonManageGroups, $buttonCancel))); } else { $form->addContent(new UI_Form_ButtonGroup(array($buttonSubmit, $buttonCancel))); } self::setTitle('Import XML'); $contents[] = new UI_Heading('Import XML', true); $contents[] = $form; } elseif (empty($languageData)) { self::setTitle($repositoryData['name']); $heading = new UI_Heading(htmlspecialchars($repositoryData['name']), true, 1, $repository->getShareURL()); $languageTable = new UI_Table(array('Language', 'Completion')); $languageTable->setColumnPriorities(8, 4); $languages = Language::getList($defaultLanguage->getID()); $cachedLanguageProgress = Authentication::getCachedLanguageProgress($repositoryID); $newCachedLanguageProgress = array(); if (empty($cachedLanguageProgress)) { $repository->loadLanguages(false, Repository::SORT_NO_LANGUAGE, Repository::LOAD_ALL_LANGUAGES); } foreach ($languages as $languageID) { $linkURL = URL::toLanguage($repositoryID, $languageID); $nameLink = new UI_Link(Language::getLanguageNameFull($languageID), $linkURL, UI_Link::TYPE_UNIMPORTANT); if (empty($cachedLanguageProgress)) { $languageObject = $repository->getLanguage($languageID); $completeness = intval($languageObject->getCompleteness() * 100); } else { $completeness = intval($cachedLanguageProgress[$languageID]); } $progressBar = new UI_Progress($completeness); $rowClass = $languageID == $defaultLanguage->getID() ? 'active' : ''; $languageTable->addRow(array($nameLink->getHTML(), $progressBar->getHTML()), '', $rowClass); $newCachedLanguageProgress[$languageID] = $completeness; } Authentication::setCachedLanguageProgress($repositoryID, $newCachedLanguageProgress); $actionsForm = new UI_Form(URL::toProject($repositoryID), false); $actionsForm->addContent(new UI_Form_Hidden('exportXML', 1)); $actionButtons = array(); if (Repository::hasUserPermissions(Authentication::getUserID(), $repositoryID, $repositoryData, Repository::ROLE_DEVELOPER)) { $actionButtons[] = new UI_Link('Export', URL::toExport($repositoryID), UI_Link::TYPE_SUCCESS); $actionButtons[] = new UI_Link('Import XML', URL::toImport($repositoryID), UI_Link::TYPE_UNIMPORTANT); if (Repository::hasUserPermissions(Authentication::getUserID(), $repositoryID, $repositoryData, Repository::ROLE_ADMINISTRATOR)) { $actionButtons[] = new UI_Link('Edit project', URL::toEditProject($repositoryID), UI_Link::TYPE_UNIMPORTANT); } $actionButtons[] = new UI_Link('Add phrase', URL::toAddPhrase($repositoryID, $defaultLanguage->getID()), UI_Link::TYPE_UNIMPORTANT); $actionButtons[] = new UI_Link('Watch', URL::toWatchProject($repositoryID), UI_Link::TYPE_INFO); } if (!empty($actionButtons)) { $actionsForm->addContent(new UI_Form_ButtonGroup($actionButtons, true)); } $contents[] = $heading; $contents[] = $actionsForm; $contents[] = $languageTable; $contents[] = $actionsForm; } else { try { $mayMovePhrases = Repository::isRoleAllowedToMovePhrases($role); $language = new Language_Android($languageID); self::addBreadcrumbItem(URL::toLanguage($repositoryID, $languageID), $language->getNameFull()); self::setTitle($languageData->getNameFull()); $heading = new UI_Heading($languageData->getNameFull(), true); $repository->loadLanguages(false, $languageID, $languageID); $languageLeft = $repository->getLanguage($repository->getDefaultLanguage()); $languageRight = $repository->getLanguage($language->getID()); $languageLeftPhrases = $languageLeft->getPhrases(); $languageRightPhrases = $languageRight->getPhrases(); if (count($languageLeftPhrases) != count($languageRightPhrases)) { throw new Exception('Count of left language\'s phrases does not match right language\'s count of phrases'); } $phrasesTableColumnNames = array('left' => '', 'right' => ''); if ($language->getID() == $defaultLanguage->getID()) { // viewing the default language itself $phrasesTableColumnNames['left'] = 'Unique key'; $phrasesTableColumnNames['right'] = $language->getNameFull(); } else { // viewing another language that will be compared to default language $phrasesTableColumnNames['left'] = $defaultLanguage->getNameFull(); $phrasesTableColumnNames['right'] = $language->getNameFull(); } if ($mayMovePhrases) { $phrasesTable = new UI_Table(array(' ', $phrasesTableColumnNames['left'], $phrasesTableColumnNames['right'])); $phrasesTable->setColumnPriorities(1, 5, 6); } else { $phrasesTable = new UI_Table(array($phrasesTableColumnNames['left'], $phrasesTableColumnNames['right'])); $phrasesTable->setColumnPriorities(6, 6); } $translationSecret = Authentication::createSecret(); if (count($languageLeftPhrases) <= 0) { if ($mayMovePhrases) { $phrasesTable->addRow(array('', 'No phrases yet', 'No phrases yet')); } else { $phrasesTable->addRow(array('No phrases yet', 'No phrases yet')); } } else { Database::initTranslationSession($repositoryID, $languageID, Authentication::getUserID(), $translationSecret, time()); if ($language->getID() == $defaultLanguage->getID()) { // viewing the default language itself /** @var Phrase $defaultPhrase */ foreach ($languageLeftPhrases as $defaultPhrase) { $values = $defaultPhrase->getPhraseValues(); foreach ($values as $subKey => $value) { $phraseFormKey = 'updatePhrases[edits][' . URL::encodeID($defaultPhrase->getID()) . '][' . $subKey . ']'; $value = Authentication::getCachedEdit($repositoryID, $languageID, URL::encodeID($defaultPhrase->getID()), $subKey, $value); $valuePrevious = new UI_Form_Hidden(str_replace('[edits]', '[previous]', $phraseFormKey), $value); $valueEdit = new UI_Form_Textarea('', $phraseFormKey, $value, '', true, htmlspecialchars($value), UI_Form_Textarea::getOptimalRowCount($value, 2), $defaultLanguage->isRTL(), 'setUnsavedChanges(true);'); if ($mayMovePhrases) { $editPhraseLink = new UI_Link('Edit', URL::toPhraseDetails($repositoryID, $languageID, $defaultPhrase->getID()), UI_Link::TYPE_UNIMPORTANT); $editPhraseLink->setSize(UI_Link::SIZE_SMALL); $editPhraseLink->setTabIndex('-1'); $phrasesTable->addRow(array($editPhraseLink->getHTML(), Phrase_Android::getFullyQualifiedName($defaultPhrase, $subKey), $valuePrevious->getHTML() . $valueEdit->getHTML())); } else { $phrasesTable->addRow(array(Phrase_Android::getFullyQualifiedName($defaultPhrase, $subKey), $valuePrevious->getHTML() . $valueEdit->getHTML())); } } } } else { // viewing another language that will be compared to default language foreach ($languageRightPhrases as $rightPhrase) { /** @var Phrase $rightPhrase */ $defaultPhrase = $languageLeft->getPhraseByKey($rightPhrase->getPhraseKey()); $valuesLeft = $defaultPhrase->getPhraseValues(); $valuesRight = $rightPhrase->getPhraseValues(); foreach ($valuesLeft as $subKey => $valueLeft) { $valueLeftHTML = '<span dir="' . ($defaultLanguage->isRTL() ? 'rtl' : 'ltr') . '">' . nl2br(htmlspecialchars($valueLeft)) . '</span><span dir="ltr" class="small" style="display:block; color:#999; margin-top:4px;">' . Phrase_Android::getFullyQualifiedName($defaultPhrase, $subKey) . '</span>'; $phraseKey = 'updatePhrases[edits][' . URL::encodeID($defaultPhrase->getID()) . '][' . $subKey . ']'; $valuesRight[$subKey] = Authentication::getCachedEdit($repositoryID, $languageID, URL::encodeID($defaultPhrase->getID()), $subKey, $valuesRight[$subKey]); $valuePrevious = new UI_Form_Hidden(str_replace('[edits]', '[previous]', $phraseKey), $valuesRight[$subKey]); $valueEdit = new UI_Form_Textarea('', $phraseKey, $valuesRight[$subKey], '', true, htmlspecialchars($valuesRight[$subKey]), UI_Form_Textarea::getOptimalRowCount($valueLeft), $language->isRTL(), 'setUnsavedChanges(true);'); if ($mayMovePhrases) { $editPhraseLink = new UI_Link('Edit', URL::toPhraseDetails($repositoryID, $languageID, $defaultPhrase->getID()), UI_Link::TYPE_UNIMPORTANT); $editPhraseLink->setSize(UI_Link::SIZE_SMALL); $editPhraseLink->setTabIndex('-1'); $phrasesTable->addRow(array($editPhraseLink->getHTML(), $valueLeftHTML, $valuePrevious->getHTML() . $valueEdit->getHTML())); } else { $phrasesTable->addRow(array($valueLeftHTML, $valuePrevious->getHTML() . $valueEdit->getHTML())); } } } } } $formTargetURL = URL::toLanguage($repositoryID, $languageID); $addPhraseURL = URL::toAddPhrase($repositoryID, $languageID); $saveButton = new UI_Form_Button('Save changes', UI_Link::TYPE_SUCCESS, UI_Form_Button::ACTION_SUBMIT, '', '', 'setUnsavedChanges(false);'); if ($mayMovePhrases) { $formButtonList = array($saveButton, new UI_Link('Add phrase', $addPhraseURL, UI_Link::TYPE_UNIMPORTANT)); } else { $formButtonList = array($saveButton); } $formButtons = new UI_Form_ButtonGroup($formButtonList, true); $phrasesTable->setShowSearchFilter(Authentication::isUserDeveloper()); $form = new UI_Form($formTargetURL, false); $form->addContent($formButtons); $form->addContent($phrasesTable); $form->addContent(new UI_Form_Hidden('updatePhrases[secret]', $translationSecret)); $form->addContent(new UI_Form_Hidden('updatePhrases[translatorID]', Authentication::getUserID())); $form->addContent($formButtons); $contents[] = $heading; $contents[] = $form; } catch (Exception $e) { self::addBreadcrumbItem(URL::toLanguage($repositoryID, $languageID), 'Language not found'); self::setTitle('Language not found'); $contents[] = new UI_Heading('Language not found', true); $contents[] = new UI_Paragraph('We\'re sorry, but we could not find the language that you requested.'); } } } } $cell = new UI_Cell($contents); $row = new UI_Row(array($cell)); $containers[] = new UI_Container(array($row)); return new UI_Group($containers); }