summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php')
-rw-r--r--www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php173
1 files changed, 173 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php b/www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php
new file mode 100644
index 00000000..f0aa1d8b
--- /dev/null
+++ b/www/wiki/extensions/Translate/messagegroups/SandboxMessageGroup.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * This file contains an unmanaged message group implementation.
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ */
+
+/**
+ * @since 2013.06
+ * @ingroup MessageGroup
+ */
+class SandboxMessageGroup extends WikiMessageGroup {
+ /*
+ * Yes this is very ugly hack and should not be removed.
+ * @see MessageCollection::getPages()
+ */
+ protected $namespace = false;
+
+ protected $language;
+
+ /**
+ * #setLanguage must be called before calling getDefinitions.
+ */
+ public function __construct() {
+ }
+
+ public function setLanguage( $code ) {
+ $this->language = $code;
+ }
+
+ public function getId() {
+ return '!sandbox';
+ }
+
+ public function getLabel( IContextSource $context = null ) {
+ // Should not be visible
+ return 'Sandbox messages';
+ }
+
+ public function getDescription( IContextSource $context = null ) {
+ // Should not be visible
+ return 'Suggests messages to translate for sandboxed users';
+ }
+
+ public function getDefinitions() {
+ global $wgTranslateSandboxSuggestions, $wgTranslateSandboxLimit;
+
+ // This will contain the list of messages shown to the user
+ $list = [];
+
+ // Ugly
+ $store = new TranslationStashStorage( wfGetDB( DB_MASTER ) );
+ $user = RequestContext::getMain()->getUser();
+ $translations = $store->getTranslations( $user );
+
+ // Add messages the user has already translated first, so he
+ // can go back and correct them.
+ foreach ( $translations as $translation ) {
+ $title = $translation->getTitle();
+ $handle = new MessageHandle( $title );
+ $index = $title->getNamespace() . ':' . $handle->getKey();
+ $list[$index] = '';
+ }
+
+ // Always add the regular suggestions
+ foreach ( $wgTranslateSandboxSuggestions as $titleText ) {
+ $title = Title::newFromText( $titleText );
+ if ( !$title ) {
+ wfWarn( "Invalid title in \$wgTranslateSandboxSuggestions: $titleText" );
+ continue;
+ }
+
+ $index = $title->getNamespace() . ':' . $handle->getKey();
+ // This index might already exist, but that is okay
+ $list[$index] = '';
+ }
+
+ // Get some random keys
+ $all = MessageIndex::singleton()->getKeys();
+ // In case there aren't any messages
+ if ( $all === [] ) {
+ return $list;
+ }
+ $min = 0;
+ $max = count( $all ) - 1; // Indexes are zero-based
+
+ // Get some message. Will be filtered to less below.
+ for ( $i = count( $list ); $i < 100; $i++ ) {
+ $list[$all[rand( $min, $max )]] = '';
+ }
+
+ // Fetch definitions, slowly, one by one
+ $count = 0;
+
+ // Provide twice the number of messages than the limit
+ // to have a buffer in case the user skips some messages
+ $messagesToProvide = $wgTranslateSandboxLimit * 2;
+
+ foreach ( $list as $index => &$translation ) {
+ list( $ns, $page ) = explode( ':', $index, 2 );
+ $title = Title::makeTitle( $ns, "$page/{$this->language}" );
+ $handle = new MessageHandle( $title );
+
+ if ( MessageGroups::isTranslatableMessage( $handle ) ) {
+ // Modified by reference
+ $translation = $this->getMessageContent( $handle );
+ if ( $translation === null ) {
+ // Something is not in sync or badly broken. Handle gracefully.
+ unset( $list[$index] );
+ wfWarn( "No message definition for $index while preparing the sandbox" );
+
+ continue;
+ }
+ } else {
+ // This might include messages that the user has already translated
+ // or messages given in $wgTranslateSandboxSuggestions or just dated
+ // message index.
+ unset( $list[$index] );
+
+ continue;
+ }
+
+ $count++;
+
+ if ( $count === $messagesToProvide ) {
+ break;
+ }
+ }
+
+ // Remove the extra entries
+ $list = array_slice( $list, 0, $messagesToProvide );
+
+ return $list;
+ }
+
+ public function getChecker() {
+ return null;
+ }
+
+ /**
+ * Subpage language code, if any in the title, is ignored.
+ * @param MessageHandle $handle
+ * @return null|string
+ */
+ public function getMessageContent( MessageHandle $handle ) {
+ $groupId = MessageIndex::getPrimaryGroupId( $handle );
+ $group = MessageGroups::getGroup( $groupId );
+ $key = $handle->getKey();
+
+ $source = $group->getMessage( $key, $group->getSourceLanguage() );
+ if ( $source !== null ) {
+ return $source;
+ }
+
+ // Try harder
+ if ( method_exists( $group, 'getKeys' ) ) {
+ $keys = $group->getKeys();
+ } else {
+ $keys = array_keys( $group->getDefinitions() );
+ }
+ // Try to find the original key with correct case
+ foreach ( $keys as $realkey ) {
+ if ( $key === strtolower( $realkey ) ) {
+ $key = $realkey;
+ break;
+ }
+ }
+
+ return $group->getMessage( $key, $group->getSourceLanguage() );
+ }
+}