if ($gitstatus != 0) { fputs(STDERR, "FATAL ERROR {$gitstatus} EXECUTING {$gitcmd}\n"); exit($gitstatus); } $tmp = make_upload_directory('amos/temp/fix-drift/' . $version->dir); $dumpfile = $tmp . '/' . $legacyname . '.php'; file_put_contents($dumpfile, implode("\n", $gitout)); $gitcomponent = mlang_component::from_phpfile($dumpfile, 'en', $version, time()); foreach ($amoscomponent->get_iterator() as $amosstring) { $gitstring = $gitcomponent->get_string($amosstring->id); if (is_null($gitstring)) { fputs(STDOUT, "<< AMOS ONLY: {$version->dir} [{$amosstring->id},{$frankenstylename}]\n"); $fixstring = clone $amosstring; $fixstring->deleted = true; $fixstring->clean_text(); $fixcomponent->add_string($fixstring); continue; } if ($gitstring->text !== $amosstring->text) { fputs(STDOUT, "!= AMOS GIT DIFF: {$version->dir} [{$amosstring->id},{$frankenstylename}]\n"); $gitstring->clean_text(); $fixcomponent->add_string($gitstring); continue; } } foreach ($gitcomponent->get_iterator() as $gitstring) { $amosstring = $amoscomponent->get_string($gitstring->id); if (is_null($amosstring)) { fputs(STDOUT, ">> GIT ONLY: {$version->dir} [{$gitstring->id},{$frankenstylename}]\n"); $gitstring->clean_text(); $fixcomponent->add_string($gitstring);
if (is_null($strenglishb) or is_null($strtranslateda) or is_null($strtranslatedb)) { continue; } // in case we will need it, decide which of the translations is the more recent if ($strtranslateda->timemodified >= $strtranslatedb->timemodified) { $strtranslatedrecent = $strtranslateda; } else { $strtranslatedrecent = $strtranslatedb; } $englishchanged = mlang_string::differ($strenglisha, $strenglishb); $translatedchanged = mlang_string::differ($strtranslateda, $strtranslatedb); // English strings have changed but translated ones have not if ($data->mode == 1) { if ($englishchanged and !$translatedchanged) { $worka->add_string($strtranslateda); $workb->add_string($strtranslatedb); $num++; } } // English strings have not changed but translated ones have if ($data->mode == 2) { if (!$englishchanged and $translatedchanged) { if ($data->action == 1) { $worka->add_string($strtranslateda); $workb->add_string($strtranslatedb); } else { $worka->add_string($strtranslatedrecent); $workb->add_string($strtranslatedrecent); } $num++; }
die; } if (!confirm_sesskey()) { header('HTTP/1.1 403 Forbidden'); die; } $stringid = optional_param('stringid', null, PARAM_ALPHANUMEXT); $text = optional_param('text', null, PARAM_RAW); if (is_null($stringid) or is_null($text)) { header('HTTP/1.1 400 Bad Request'); die; } list($lang, $originalid, $translationid) = local_amos_translator::decode_identifier($stringid); $record = $DB->get_record('amos_repository', array('id' => $originalid), 'id,stringid,component,branch', MUST_EXIST); $version = mlang_version::by_code($record->branch); $component = new mlang_component($record->component, $lang, $version); if ($version->code < mlang_version::MOODLE_20) { header('HTTP/1.1 400 Bad Request'); die; } $string = new mlang_string($record->stringid, $text); $string->clean_text(); $component->add_string($string); $stage = mlang_persistent_stage::instance_for_user($USER->id, sesskey()); $stage->add($component, true); $stage->store(); mlang_stash::autosave($stage); header('Content-Type: application/json; charset: utf-8'); $response = new stdclass(); $response->text = local_amos_renderer::add_breaks(s($string->text)); echo json_encode($response);
public function test_stage_propagate() { $version20 = mlang_version::by_branch('MOODLE_20_STABLE'); $version21 = mlang_version::by_branch('MOODLE_21_STABLE'); $version22 = mlang_version::by_branch('MOODLE_22_STABLE'); $component20en = new mlang_component('admin', 'en', $version20); $component20en->add_string(new mlang_string('foo1', 'Bar1')); $component20en->add_string(new mlang_string('foo2', 'Bar2')); $component20cs = new mlang_component('admin', 'cs', $version20); $component20cs->add_string(new mlang_string('foo1', 'TranslatedOldBar1')); $component21en = new mlang_component('admin', 'en', $version21); $component21en->add_string(new mlang_string('foo1', 'Bar1')); $component21en->add_string(new mlang_string('foo2', 'Bar2')); $component21en->add_string(new mlang_string('foo3', 'Bar3')); $component22en = new mlang_component('admin', 'en', $version22); $component22en->add_string(new mlang_string('foo1', 'Bar1')); $component22en->add_string(new mlang_string('foo2', 'Bar2')); $component22en->add_string(new mlang_string('foo3', 'NewBar3')); $stage = new mlang_stage(); $stage->add($component20en); $stage->add($component20cs); $stage->add($component21en); $stage->add($component22en); $stage->commit('Initial strings', array('source' => 'unittest'), true); $component20en->clear(); $component21en->clear(); $component22en->clear(); unset($stage); // simple usage - the user translated a string on 2.1 and want it being applied to 2.2, too $stage = new mlang_stage(); $component21cs = new mlang_component('admin', 'cs', $version21); $component21cs->add_string(new mlang_string('foo1', 'TranslatedBar1')); $stage->add($component21cs); $component21cs->clear(); $this->assertEqual($stage->propagate(array($version22)), 1); $propagatedcomponent = $stage->get_component('admin', 'cs', $version22); $this->assertNotNull($propagatedcomponent, 'The component "admin" must exist on ' . $version22->label); $this->assertTrue($propagatedcomponent->has_string('foo1')); $propagatedstring = $propagatedcomponent->get_string('foo1'); $this->assertTrue($propagatedstring->text, 'TranslatedBar1'); $stage->clear(); // the change is not propagated if the changed string is staged several times and the values // are different $stage = new mlang_stage(); $component20cs = new mlang_component('admin', 'cs', $version20); $component20cs->add_string(new mlang_string('foo2', 'TranslatedOldBar2')); $component21cs = new mlang_component('admin', 'cs', $version21); $component21cs->add_string(new mlang_string('foo2', 'TranslatedBar2')); $stage->add($component20cs); $stage->add($component21cs); $component20cs->clear(); $component21cs->clear(); $this->assertEqual($stage->propagate(array($version20, $version21, $version22)), 0); $this->assertEqual($stage->get_component('admin', 'cs', $version20)->get_string('foo2')->text, 'TranslatedOldBar2'); $this->assertEqual($stage->get_component('admin', 'cs', $version21)->get_string('foo2')->text, 'TranslatedBar2'); $this->assertNull($stage->get_component('admin', 'cs', $version22)); $stage->clear(); // but the change is propagated if the changed string is staged several times and the values // are the same $stage = new mlang_stage(); $component20cs = new mlang_component('admin', 'cs', $version20); $component20cs->add_string(new mlang_string('foo2', 'TranslatedBar2')); $component21cs = new mlang_component('admin', 'cs', $version21); $component21cs->add_string(new mlang_string('foo2', 'TranslatedBar2')); $stage->add($component20cs); $stage->add($component21cs); $component20cs->clear(); $component21cs->clear(); $this->assertEqual($stage->propagate(array($version20, $version21, $version22)), 1); $this->assertEqual($stage->get_component('admin', 'cs', $version22)->get_string('foo2')->text, 'TranslatedBar2'); $this->assertEqual($stage->get_component('admin', 'cs', $version21)->get_string('foo2')->text, 'TranslatedBar2'); $this->assertEqual($stage->get_component('admin', 'cs', $version20)->get_string('foo2')->text, 'TranslatedBar2'); $stage->clear(); // the staged string is propagated to another branch only if the English originals match // in the following test, the 2.1 translation of foo3 should not propagate to neither 2.0 // (because the string does not exist there) not 2.2 (because the English originals differ) $stage = new mlang_stage(); $component21cs = new mlang_component('admin', 'cs', $version21); $component21cs->add_string(new mlang_string('foo3', 'TranslatedBar3')); $stage->add($component21cs); $component21cs->clear(); $this->assertEqual($stage->propagate(array($version20, $version21, $version22)), 0); $this->assertNull($stage->get_component('admin', 'cs', $version20)); $this->assertNull($stage->get_component('admin', 'cs', $version22)); $stage->clear(); }
/** * Merges all strings from one component to another and fixes syntax if needed * * If the string already exists in the target component, it is skipped (even * if it is set as deleted there). Does not modify the source component. * * @param mlang_component $source component to take strings from * @param mlang_component $target component to add strings to * @return void modifies $target component */ public static function merge(mlang_component $source, mlang_component $target) { if ($source->version->code <= mlang_version::MOODLE_19) { $sourceformat = 1; } else { $sourceformat = 2; } if ($target->version->code <= mlang_version::MOODLE_19) { throw new mlang_exception('Can not merge into Moodle 1.x branches'); } else { $targetformat = 2; } foreach ($source->get_iterator() as $string) { $stringid = clean_param($string->id, PARAM_STRINGID); if (empty($stringid)) { throw new mlang_exception('Invalid string identifier ' . s($string->id)); } if (!$target->has_string($stringid)) { $text = mlang_string::fix_syntax($string->text, $targetformat, $sourceformat); $target->add_string(new mlang_string($stringid, $text)); } } }
* Register new language * * @package local-amos * @copyright 2010 David Mudrak <*****@*****.**> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config.php'; require_once dirname(dirname(__FILE__)) . '/mlanglib.php'; require_once dirname(__FILE__) . '/newlanguage_form.php'; require_login(SITEID, false); require_capability('local/amos:manage', get_system_context()); $PAGE->set_pagelayout('standard'); $PAGE->set_url('/local/amos/admin/newlanguage.php'); $PAGE->set_title('AMOS ' . get_string('newlanguage', 'local_amos')); $PAGE->set_heading('AMOS ' . get_string('newlanguage', 'local_amos')); $form = new local_amos_newlanguage_form(); if ($data = $form->get_data()) { $component = new mlang_component('langconfig', $data->langcode, mlang_version::by_code(mlang_version::MOODLE_22)); $data->langname = mlang_string::fix_syntax($data->langname); $data->langnameint = mlang_string::fix_syntax($data->langnameint); $component->add_string(new mlang_string('thislanguage', $data->langname)); $component->add_string(new mlang_string('thislanguageint', $data->langnameint)); $stage = mlang_persistent_stage::instance_for_user($USER->id, sesskey()); $stage->add($component); $stage->store(); redirect(new moodle_url('/local/amos/stage.php')); } /// Output starts here echo $OUTPUT->header(); $form->display(); echo $OUTPUT->footer();
/** * Parses the given data in Moodle PHP string format * * @param string $data definition of the associative array * @param mlang_component $component component to add strings to * @param int $format the data format on the input, defaults to the one used since 2.0 * @return void */ public function parse($data, mlang_component $component, $format = 2) { $strings = $this->extract_strings($data); foreach ($strings as $id => $text) { $text = mlang_string::fix_syntax($text, 2, $format); $component->add_string(new mlang_string($id, $text)); } }