private static function _add_locale_dropdown(&$form, $user = null) { $locales = locale::installed(); if (count($locales) > 1) { // Put "none" at the first position in the array $locales = array_merge(array("" => t("« none »")), $locales); $selected_locale = $user && $user->locale ? $user->locale : ""; $form->dropdown("locale")->label(t("Language Preference"))->options($locales)->selected($selected_locale); } }
static function fetch_updates() { $request->locales = array(); $request->messages = new stdClass(); $locales = locale::installed(); foreach ($locales as $locale => $locale_data) { $request->locales[] = $locale; } // @todo Batch requests (max request size) foreach (Database::instance()->select("key", "locale", "revision", "translation")->from("incoming_translations")->get()->as_array() as $row) { if (!isset($request->messages->{$row->key})) { $request->messages->{$row->key} = 1; } if (!empty($row->revision) && !empty($row->translation)) { if (!is_object($request->messages->{$row->key})) { $request->messages->{$row->key} = new stdClass(); } $request->messages->{$row->key}->{$row->locale} = $row->revision; } } // @todo Include messages from outgoing_translations? $request_data = json_encode($request); $url = self::_server_url() . "?q=translations/fetch"; list($response_data, $response_status) = remote::post($url, array("data" => $request_data)); if (!remote::success($response_status)) { throw new Exception("@todo TRANSLATIONS_FETCH_REQUEST_FAILED " . $response_status); } if (empty($response_data)) { log::info("translations", "Translations fetch request resulted in an empty response"); return; } $response = json_decode($response_data); // Response format (JSON payload): // [{key:<key_1>, translation: <JSON encoded translation>, rev:<rev>, locale:<locale>}, // {key:<key_2>, ...} // ] $count = count($response); log::info("translations", "Installed {$count} new / updated translation messages"); foreach ($response as $message_data) { // @todo Better input validation if (empty($message_data->key) || empty($message_data->translation) || empty($message_data->locale) || empty($message_data->rev)) { throw new Exception("@todo TRANSLATIONS_FETCH_REQUEST_FAILED: Invalid response data"); } $key = $message_data->key; $locale = $message_data->locale; $revision = $message_data->rev; $translation = serialize(json_decode($message_data->translation)); // @todo Should we normalize the incoming_translations table into messages(id, key, message) // and incoming_translations(id, translation, locale, revision)? Or just allow // incoming_translations.message to be NULL? $locale = $message_data->locale; $entry = ORM::factory("incoming_translation")->where(array("key" => $key, "locale" => $locale))->find(); if (!$entry->loaded) { // @todo Load a message key -> message (text) dict into memory outside of this loop $root_entry = ORM::factory("incoming_translation")->where(array("key" => $key, "locale" => "root"))->find(); $entry->key = $key; $entry->message = $root_entry->message; $entry->locale = $locale; } $entry->revision = $revision; $entry->translation = $translation; $entry->save(); } }
private function _languages_form() { $all_locales = locale::available(); $installed_locales = locale::installed(); $form = new Forge("admin/languages/save", "", "post", array("id" => "gLanguageSettingsForm")); $group = $form->group("choose_language")->label(t("Language settings")); $group->dropdown("locale")->options($installed_locales)->selected(module::get_var("gallery", "default_locale"))->label(t("Default language"))->rules('required'); $installation_options = array(); foreach ($all_locales as $code => $display_name) { $installation_options[$code] = array($display_name, isset($installed_locales->{$code})); } $group->checklist("installed_locales")->label(t("Installed Languages"))->options($installation_options)->rules("required"); $group->submit("save")->value(t("Save settings")); return $form; }