示例#1
0
 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);
 }
示例#2
0
    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()));
 }
示例#4
0
 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);
 }
示例#5
0
 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);
 }
示例#7
0
 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);
 }
示例#9
0
 /**
  * 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);
 }
示例#10
0
 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;
 }
示例#11
0
 /**
  * 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) . ")");
 }
示例#12
0
 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;
 }
示例#13
0
 /**
  * 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);
     }
 }
示例#14
0
    public function isRootUrl($url = null)
    {
        if (!$url)
        {
            $url = $_SERVER["REQUEST_URI"];
        }

        $languages = Language::getList();
        return isset($languages[trim($url, "/")]);
    }
示例#15
0
 public function run()
 {
     $this->render('LanguageSwitcher', array('languages' => Language::getList()));
 }
示例#16
0
}
?>
    <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">
示例#17
0
<?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)]]]);
示例#18
0
 /**
  * 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);
 }
示例#19
0
文件: UI.php 项目: jeckel420/Localize
 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('&nbsp;', $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);
 }