summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php600
1 files changed, 600 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php b/www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php
new file mode 100644
index 00000000..c5ebb4ef
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/Lang/Lang.php
@@ -0,0 +1,600 @@
+<?php
+
+namespace SMW\Lang;
+
+/**
+ * This class provides "extraneous" language functions independent from MediaWiki
+ * to handle certain language options in a way required by Semantic MediaWiki and
+ * its registration system.
+ *
+ * @license GNU GPL v2+
+ * @since 2.4
+ *
+ * @author mwjames
+ */
+class Lang {
+
+ /**
+ * @var Lang
+ */
+ private static $instance = null;
+
+ /**
+ * @var LanguageContents
+ */
+ private $languageContents;
+
+ /**
+ * @var string
+ */
+ private $languageCode = 'en';
+
+ /**
+ * @var string
+ */
+ private $canonicalFallbackLanguageCode = 'en';
+
+ /**
+ * @var array
+ */
+ private $propertyIdByLabelMap = [];
+
+ /**
+ * @var array
+ */
+ private $dateFormatsMap = [];
+
+ /**
+ * @var array
+ */
+ private $monthMap = [];
+
+ /**
+ * @since 2.4
+ *
+ * @param LanguageContents $languageContents
+ */
+ public function __construct( LanguageContents $languageContents ) {
+ $this->languageContents = $languageContents;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @return Lang
+ */
+ public static function getInstance() {
+
+ if ( self::$instance !== null ) {
+ return self::$instance;
+ }
+
+ // $cache = ApplicationFactory::getInstance()->getCache()
+
+ $jsonContentsFileReader = new JsonContentsFileReader();
+
+ self::$instance = new self(
+ new LanguageContents(
+ $jsonContentsFileReader,
+ new FallbackFinder( $jsonContentsFileReader )
+ )
+ );
+
+ return self::$instance;
+ }
+
+ /**
+ * @since 2.4
+ */
+ public static function clear() {
+ self::$instance = null;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @return string
+ */
+ public function getCode() {
+ return $this->languageCode;
+ }
+
+ /**
+ * @deprecated since 3.0, use Lang::fetch
+ * @since 2.4
+ *
+ * @return string
+ */
+ public function fetchByLanguageCode( $languageCode ) {
+ return $this->fetch( $languageCode );
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @return string
+ */
+ public function fetch( $languageCode ) {
+
+ $this->languageCode = strtolower( trim( $languageCode ) );
+
+ if ( !$this->languageContents->isLoaded( $this->languageCode ) ) {
+ $this->languageContents->load( $this->languageCode );
+ }
+
+ $this->canonicalFallbackLanguageCode = $this->languageContents->getCanonicalFallbackLanguageCode();
+
+ return $this;
+ }
+
+ /**
+ * Function that returns an array of namespace identifiers.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getNamespaces() {
+
+ $namespaces = $this->languageContents->get(
+ 'namespace.labels',
+ $this->languageCode
+ );
+
+ $namespaces += $this->languageContents->get(
+ 'namespace.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ foreach ( $namespaces as $key => $value ) {
+ unset( $namespaces[$key] );
+
+ if ( defined( $key ) ) {
+ $namespaces[constant($key)] = $value;
+ }
+ }
+
+ return $namespaces;
+ }
+
+ /**
+ * Function that returns an array of namespace aliases, if any
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getNamespaceAliases() {
+
+ $namespaceAliases = $this->languageContents->get(
+ 'namespace.aliases',
+ $this->languageCode
+ );
+
+ $namespaceAliases += $this->languageContents->get(
+ 'namespace.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ foreach ( $namespaceAliases as $alias => $namespace ) {
+ if ( defined( $namespace ) ) {
+ $namespaceAliases[$alias] = constant( $namespace );
+ }
+ }
+
+ return $namespaceAliases;
+ }
+
+ /**
+ * Return all labels that are available as names for built-in datatypes. Those
+ * are the types that users can access via [[has type::...]] (more built-in
+ * types may exist for internal purposes but the user won't need to
+ * know this). The returned array is indexed by (internal) type ids.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getDatatypeLabels() {
+
+ $datatypeLabels = $this->languageContents->get(
+ 'datatype.labels',
+ $this->languageCode
+ );
+
+ $datatypeLabels += $this->languageContents->get(
+ 'datatype.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ return $datatypeLabels;
+ }
+
+ /**
+ * @since 2.5
+ *
+ * @param string $label
+ *
+ * @return string
+ */
+ public function findDatatypeByLabel( $label ) {
+
+ $label = mb_strtolower( $label );
+
+ $datatypeLabels = $this->getDatatypeLabels();
+ $datatypeLabels = array_flip( $datatypeLabels );
+ $datatypeLabels += $this->getDatatypeAliases();
+
+ foreach ( $datatypeLabels as $key => $id ) {
+ if ( mb_strtolower( $key ) === $label ) {
+ return $id;
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getCanonicalDatatypeLabels() {
+
+ $datatypeLabels = $this->languageContents->get(
+ 'datatype.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ $canonicalPropertyLabels = array_flip( $datatypeLabels );
+
+ return $canonicalPropertyLabels;
+ }
+
+ /**
+ * Return an array that maps aliases to internal type ids. All ids used here
+ * should also have a primary label defined in m_DatatypeLabels.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getDatatypeAliases() {
+
+ $datatypeAliases = $this->languageContents->get(
+ 'datatype.aliases',
+ $this->languageCode
+ );
+
+ $datatypeAliases += $this->languageContents->get(
+ 'datatype.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ return $datatypeAliases;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getCanonicalPropertyLabels() {
+
+ $canonicalPropertyLabels = $this->languageContents->get(
+ 'property.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ $canonicalPropertyLabels = array_flip( $canonicalPropertyLabels );
+
+ $canonicalPropertyLabels += $this->languageContents->get(
+ 'property.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ $canonicalPropertyLabels += $this->languageContents->get(
+ 'datatype.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ return $canonicalPropertyLabels;
+ }
+
+ /**
+ * Function that returns the labels for predefined properties.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getPropertyLabels() {
+
+ $propertyLabels = $this->languageContents->get(
+ 'property.labels',
+ $this->languageCode
+ );
+
+ $propertyLabels += $this->languageContents->get(
+ 'property.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ return $propertyLabels;
+ }
+
+ /**
+ * Aliases for predefined properties, if any.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getCanonicalPropertyAliases() {
+
+ $canonicalPropertyAliases = $this->languageContents->get(
+ 'property.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ // Add standard property lables from the canonical language as
+ // aliases
+ $propertyLabels = $this->languageContents->get(
+ 'property.labels',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ $canonicalPropertyAliases += array_flip( $propertyLabels );
+
+ return $canonicalPropertyAliases;
+ }
+
+ /**
+ * Aliases for predefined properties, if any.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getPropertyAliases() {
+
+ $propertyAliases = $this->languageContents->get(
+ 'property.aliases',
+ $this->languageCode
+ );
+
+ $propertyLabels = $this->languageContents->get(
+ 'property.labels',
+ $this->languageCode
+ );
+
+ $propertyAliases += array_flip( $propertyLabels );
+
+ return $propertyAliases;
+ }
+
+ /**
+ * @deprecated use getPropertyIdByLabel
+ */
+ protected function getPropertyId( $propertyLabel ) {
+
+ $list += $this->languageContents->get(
+ 'property.aliases',
+ $this->languageCode
+ );
+
+ $list += $this->languageContents->get(
+ 'property.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ return $list;
+ }
+
+ /**
+ * Function receives property name (for example, `Modificatino date') and
+ * returns a property id (for example, `_MDAT'). Property name may be
+ * localized one. If property name is not recognized, a null value returned.
+ *
+ * @since 2.4
+ *
+ * @return string|null
+ */
+ public function getPropertyIdByLabel( $label ) {
+
+ $this->initPropertyIdByLabelMap( $this->languageCode );
+
+ if ( isset( $this->propertyIdByLabelMap[$this->languageCode]['label'][$label] ) ) {
+ return $this->propertyIdByLabelMap[$this->languageCode]['label'][$label];
+ };
+
+ if ( isset( $this->propertyIdByLabelMap[$this->languageCode]['alias'][$label] ) ) {
+ return $this->propertyIdByLabelMap[$this->languageCode]['alias'][$label];
+ };
+
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return array
+ */
+ public function getPropertyLabelList() {
+
+ $this->initPropertyIdByLabelMap( $this->languageCode );
+
+ if ( isset( $this->propertyIdByLabelMap[$this->languageCode] ) ) {
+ return $this->propertyIdByLabelMap[$this->languageCode];
+ }
+
+ return [];
+ }
+
+ /**
+ * Function that returns the preferred date formats
+ *
+ * Preferred interpretations for dates with 1, 2, and 3 components. There
+ * is an array for each case, and the constants define the obvious order
+ * (e.g. SMW_YDM means "first Year, then Day, then Month). Unlisted
+ * combinations will not be accepted at all.
+ *
+ * @since 2.4
+ *
+ * @return array
+ */
+ public function getDateFormats() {
+
+ $languageCode = $this->languageCode;
+
+ if ( !isset( $this->dateFormatsMap[$languageCode] ) || $this->dateFormatsMap[$languageCode] === [] ) {
+ $this->dateFormatsMap[$languageCode] = $this->getDateFormatsByLanguageCode( $languageCode );
+ }
+
+ return $this->dateFormatsMap[$languageCode];
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param integer|null $precision
+ *
+ * @return string
+ */
+ public function getPreferredDateFormatByPrecision( $precision = null ) {
+
+ $dateOutputFormats = $this->languageContents->get(
+ 'date.precision',
+ $this->languageCode
+ );
+
+ foreach ( $dateOutputFormats as $key => $format ) {
+ if ( @constant( $key ) === $precision ) {
+ return $format;
+ }
+ }
+
+ // Fallback
+ return 'd F Y H:i:s';
+ }
+
+ /**
+ * @deprecated use findMonthNumberByLabel
+ */
+ public function findMonth( $label ) {
+ return $this->findMonthNumberByLabel( $label );
+ }
+
+ /**
+ * Function looks up a month and returns the corresponding number.
+ *
+ * @since 2.4
+ *
+ * @param string $label
+ *
+ * @return false|integer
+ */
+ public function findMonthNumberByLabel( $label ) {
+
+ $languageCode = $this->languageCode;
+
+ if ( !isset( $this->months[$languageCode] ) || $this->months[$languageCode] === [] ) {
+ $this->months[$languageCode] = $this->languageContents->get( 'date.months', $languageCode );
+ }
+
+ foreach ( $this->months[$languageCode] as $key => $value ) {
+ if ( strcasecmp( $value[0], $label ) == 0 || strcasecmp( $value[1], $label ) == 0 ) {
+ return $key + 1; // array starts with 0
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated use getMonthLabelByNumber
+ */
+ public function getMonthLabel( $number ) {
+ return $this->getMonthLabelByNumber( $number );
+ }
+
+ /**
+ * Return the name of the month with the given number.
+ *
+ * @since 2.4
+ *
+ * @param integer $number
+ *
+ * @return array
+ */
+ public function getMonthLabelByNumber( $number ) {
+
+ $languageCode = $this->languageCode;
+ $number = (int)( $number - 1 ); // array starts with 0
+
+ if ( !isset( $this->months[$languageCode] ) || $this->months[$languageCode] === [] ) {
+ $this->months[$languageCode] = $this->languageContents->get( 'date.months', $languageCode );
+ }
+
+ if ( ( ( $number >= 0 ) && ( $number <= 11 ) ) && isset( $this->months[$languageCode][$number]) ) {
+ return $this->months[$languageCode][$number][0]; // Long name
+ }
+
+ return '';
+ }
+
+ private function getDateFormatsByLanguageCode( $languageCode ) {
+
+ $dateformats = [];
+
+ foreach ( $this->languageContents->get( 'date.format', $languageCode ) as $row ) {
+ $internalNumberFormat = [];
+
+ foreach ( $row as $value ) {
+ $internalNumberFormat[] = constant( $value );
+ }
+
+ $dateformats[] = $internalNumberFormat;
+ }
+
+ return $dateformats;
+ }
+
+ private function initPropertyIdByLabelMap( $languageCode ) {
+
+ if ( isset( $this->propertyIdByLabelMap[$languageCode] ) && $this->propertyIdByLabelMap[$languageCode] !== [] ) {
+ return;
+ }
+
+ $this->propertyIdByLabelMap[$languageCode] = [];
+
+ $propertyLabels = $this->languageContents->get(
+ 'property.labels',
+ $languageCode
+ );
+
+ $propertyLabels += $this->languageContents->get(
+ 'datatype.labels',
+ $languageCode
+ );
+
+ foreach ( $propertyLabels as $id => $label ) {
+ $this->propertyIdByLabelMap[$languageCode]['label'][$label] = $id;
+ }
+
+ $propertyAliases = $this->languageContents->get(
+ 'property.aliases',
+ $languageCode
+ );
+
+ $propertyAliases += $this->languageContents->get(
+ 'property.aliases',
+ $this->canonicalFallbackLanguageCode
+ );
+
+ foreach ( $propertyAliases as $label => $id ) {
+ $this->propertyIdByLabelMap[$languageCode]['alias'][$label] = $id;
+ }
+ }
+
+}