diff options
author | Morris Jobke <hey@morrisjobke.de> | 2018-07-13 17:25:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-13 17:25:51 +0200 |
commit | 14314584ba88ed8d8a7c8486b61c6677a14271f2 (patch) | |
tree | a24439cf1b1c243318532322d52d89fe4530fc47 /lib | |
parent | 1801e4e03f3a0b5ef253d67c13702b0fa22578a3 (diff) | |
parent | ca6094f3900fd463449d9973589b1d49aed28b2a (diff) | |
download | nextcloud-server-14314584ba88ed8d8a7c8486b61c6677a14271f2.tar.gz nextcloud-server-14314584ba88ed8d8a7c8486b61c6677a14271f2.zip |
Merge pull request #10110 from nextcloud/feature/100500/whats-new-info-users
Display What's New info to users
Diffstat (limited to 'lib')
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 3 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 3 | ||||
-rw-r--r-- | lib/private/L10N/Factory.php | 34 | ||||
-rw-r--r-- | lib/private/L10N/LanguageIterator.php | 137 | ||||
-rw-r--r-- | lib/private/Updater/ChangesCheck.php | 11 | ||||
-rw-r--r-- | lib/public/L10N/IFactory.php | 16 | ||||
-rw-r--r-- | lib/public/L10N/ILanguageIterator.php | 74 |
7 files changed, 245 insertions, 33 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 7113f60bc68..1c67fb9327f 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -259,6 +259,7 @@ return array( 'OCP\\IUserSession' => $baseDir . '/lib/public/IUserSession.php', 'OCP\\Image' => $baseDir . '/lib/public/Image.php', 'OCP\\L10N\\IFactory' => $baseDir . '/lib/public/L10N/IFactory.php', + 'OCP\\L10N\\ILanguageIterator' => $baseDir . '/lib/public/L10N/ILanguageIterator.php', 'OCP\\LDAP\\IDeletionFlagSupport' => $baseDir . '/lib/public/LDAP/IDeletionFlagSupport.php', 'OCP\\LDAP\\ILDAPProvider' => $baseDir . '/lib/public/LDAP/ILDAPProvider.php', 'OCP\\LDAP\\ILDAPProviderFactory' => $baseDir . '/lib/public/LDAP/ILDAPProviderFactory.php', @@ -596,6 +597,7 @@ return array( 'OC\\Core\\Controller\\TwoFactorChallengeController' => $baseDir . '/core/Controller/TwoFactorChallengeController.php', 'OC\\Core\\Controller\\UserController' => $baseDir . '/core/Controller/UserController.php', 'OC\\Core\\Controller\\WalledGardenController' => $baseDir . '/core/Controller/WalledGardenController.php', + 'OC\\Core\\Controller\\WhatsNewController' => $baseDir . '/core/Controller/WhatsNewController.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => $baseDir . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => $baseDir . '/core/Migrations/Version13000Date20170705121758.php', 'OC\\Core\\Migrations\\Version13000Date20170718121200' => $baseDir . '/core/Migrations/Version13000Date20170718121200.php', @@ -793,6 +795,7 @@ return array( 'OC\\L10N\\Factory' => $baseDir . '/lib/private/L10N/Factory.php', 'OC\\L10N\\L10N' => $baseDir . '/lib/private/L10N/L10N.php', 'OC\\L10N\\L10NString' => $baseDir . '/lib/private/L10N/L10NString.php', + 'OC\\L10N\\LanguageIterator' => $baseDir . '/lib/private/L10N/LanguageIterator.php', 'OC\\L10N\\LanguageNotFoundException' => $baseDir . '/lib/private/L10N/LanguageNotFoundException.php', 'OC\\LargeFileHelper' => $baseDir . '/lib/private/LargeFileHelper.php', 'OC\\Lock\\AbstractLockingProvider' => $baseDir . '/lib/private/Lock/AbstractLockingProvider.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index ffb50df5b09..e40a5ea75db 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -289,6 +289,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\IUserSession' => __DIR__ . '/../../..' . '/lib/public/IUserSession.php', 'OCP\\Image' => __DIR__ . '/../../..' . '/lib/public/Image.php', 'OCP\\L10N\\IFactory' => __DIR__ . '/../../..' . '/lib/public/L10N/IFactory.php', + 'OCP\\L10N\\ILanguageIterator' => __DIR__ . '/../../..' . '/lib/public/L10N/ILanguageIterator.php', 'OCP\\LDAP\\IDeletionFlagSupport' => __DIR__ . '/../../..' . '/lib/public/LDAP/IDeletionFlagSupport.php', 'OCP\\LDAP\\ILDAPProvider' => __DIR__ . '/../../..' . '/lib/public/LDAP/ILDAPProvider.php', 'OCP\\LDAP\\ILDAPProviderFactory' => __DIR__ . '/../../..' . '/lib/public/LDAP/ILDAPProviderFactory.php', @@ -626,6 +627,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Core\\Controller\\TwoFactorChallengeController' => __DIR__ . '/../../..' . '/core/Controller/TwoFactorChallengeController.php', 'OC\\Core\\Controller\\UserController' => __DIR__ . '/../../..' . '/core/Controller/UserController.php', 'OC\\Core\\Controller\\WalledGardenController' => __DIR__ . '/../../..' . '/core/Controller/WalledGardenController.php', + 'OC\\Core\\Controller\\WhatsNewController' => __DIR__ . '/../../..' . '/core/Controller/WhatsNewController.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => __DIR__ . '/../../..' . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => __DIR__ . '/../../..' . '/core/Migrations/Version13000Date20170705121758.php', 'OC\\Core\\Migrations\\Version13000Date20170718121200' => __DIR__ . '/../../..' . '/core/Migrations/Version13000Date20170718121200.php', @@ -823,6 +825,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\L10N\\Factory' => __DIR__ . '/../../..' . '/lib/private/L10N/Factory.php', 'OC\\L10N\\L10N' => __DIR__ . '/../../..' . '/lib/private/L10N/L10N.php', 'OC\\L10N\\L10NString' => __DIR__ . '/../../..' . '/lib/private/L10N/L10NString.php', + 'OC\\L10N\\LanguageIterator' => __DIR__ . '/../../..' . '/lib/private/L10N/LanguageIterator.php', 'OC\\L10N\\LanguageNotFoundException' => __DIR__ . '/../../..' . '/lib/private/L10N/LanguageNotFoundException.php', 'OC\\LargeFileHelper' => __DIR__ . '/../../..' . '/lib/private/LargeFileHelper.php', 'OC\\Lock\\AbstractLockingProvider' => __DIR__ . '/../../..' . '/lib/private/Lock/AbstractLockingProvider.php', diff --git a/lib/private/L10N/Factory.php b/lib/private/L10N/Factory.php index 79495f5ff88..cc2de174509 100644 --- a/lib/private/L10N/Factory.php +++ b/lib/private/L10N/Factory.php @@ -35,6 +35,7 @@ use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; use OCP\L10N\IFactory; +use OCP\L10N\ILanguageIterator; /** * A factory that generates language instances @@ -322,35 +323,12 @@ class Factory implements IFactory { return array_search($lang, $languages) !== false; } - public function iterateLanguage(bool $reset = false): string { - static $i = 0; - if($reset) { - $i = 0; - } - switch($i) { - /** @noinspection PhpMissingBreakStatementInspection */ - case 0: - $i++; - $forcedLang = $this->config->getSystemValue('force_language', false); - if(is_string($forcedLang)) { - return $forcedLang; - } - /** @noinspection PhpMissingBreakStatementInspection */ - case 1: - $i++; - $user = $this->userSession->getUser(); - if($user instanceof IUser) { - $userLang = $this->config->getUserValue($user->getUID(), 'core', 'lang', null); - if(is_string($userLang)) { - return $userLang; - } - } - case 2: - $i++; - return $this->config->getSystemValue('default_language', 'en'); - default: - return 'en'; + public function getLanguageIterator(IUser $user = null): ILanguageIterator { + $user = $user ?? $this->userSession->getUser(); + if($user === null) { + throw new \RuntimeException('Failed to get an IUser instance'); } + return new LanguageIterator($user, $this->config); } /** diff --git a/lib/private/L10N/LanguageIterator.php b/lib/private/L10N/LanguageIterator.php new file mode 100644 index 00000000000..ba8f942c912 --- /dev/null +++ b/lib/private/L10N/LanguageIterator.php @@ -0,0 +1,137 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @author Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\L10N; + +use OCP\IConfig; +use OCP\IUser; +use OCP\L10N\ILanguageIterator; + +class LanguageIterator implements ILanguageIterator { + private $i = 0; + /** @var IConfig */ + private $config; + /** @var IUser */ + private $user; + + public function __construct(IUser $user, IConfig $config) { + $this->config = $config; + $this->user = $user; + } + + /** + * Rewind the Iterator to the first element + */ + public function rewind() { + $this->i = 0; + } + + /** + * Return the current element + * + * @since 14.0.0 + */ + public function current(): string { + switch($this->i) { + /** @noinspection PhpMissingBreakStatementInspection */ + case 0: + $forcedLang = $this->config->getSystemValue('force_language', false); + if(is_string($forcedLang)) { + return $forcedLang; + } + $this->next(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 1: + $forcedLang = $this->config->getSystemValue('force_language', false); + if(is_string($forcedLang) + && ($truncated = $this->getTruncatedLanguage($forcedLang)) !== $forcedLang + ) { + return $truncated; + } + $this->next(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 2: + $userLang = $this->config->getUserValue($this->user->getUID(), 'core', 'lang', null); + if(is_string($userLang)) { + return $userLang; + } + $this->next(); + /** @noinspection PhpMissingBreakStatementInspection */ + case 3: + $userLang = $this->config->getUserValue($this->user->getUID(), 'core', 'lang', null); + if(is_string($userLang) + && ($truncated = $this->getTruncatedLanguage($userLang)) !== $userLang + ) { + return $truncated; + } + $this->next(); + case 4: + return $this->config->getSystemValue('default_language', 'en'); + /** @noinspection PhpMissingBreakStatementInspection */ + case 5: + $defaultLang = $this->config->getSystemValue('default_language', 'en'); + if(($truncated = $this->getTruncatedLanguage($defaultLang)) !== $defaultLang) { + return $truncated; + } + $this->next(); + default: + return 'en'; + } + } + + /** + * Move forward to next element + * + * @since 14.0.0 + */ + public function next() { + ++$this->i; + } + + /** + * Return the key of the current element + * + * @since 14.0.0 + */ + public function key(): int { + return $this->i; + } + + /** + * Checks if current position is valid + * + * @since 14.0.0 + */ + public function valid(): bool { + return $this->i <= 6; + } + + protected function getTruncatedLanguage(string $lang):string { + $pos = strpos($lang, '_'); + if($pos !== false) { + $lang = substr($lang, 0, $pos); + } + return $lang; + } +} diff --git a/lib/private/Updater/ChangesCheck.php b/lib/private/Updater/ChangesCheck.php index 095f63db879..095cf396e89 100644 --- a/lib/private/Updater/ChangesCheck.php +++ b/lib/private/Updater/ChangesCheck.php @@ -48,6 +48,15 @@ class ChangesCheck { } /** + * @throws DoesNotExistException + */ + public function getChangesForVersion(string $version): array { + $version = $this->normalizeVersion($version); + $changesInfo = $this->mapper->getChanges($version); + return json_decode($changesInfo->getData(), true); + } + + /** * @throws \Exception */ public function check(string $uri, string $version): array { @@ -145,7 +154,7 @@ class ChangesCheck { * returns a x.y.z form of the provided version. Extra numbers will be * omitted, missing ones added as zeros. */ - protected function normalizeVersion(string $version): string { + public function normalizeVersion(string $version): string { $versionNumbers = array_slice(explode('.', $version), 0, 3); $versionNumbers[0] = $versionNumbers[0] ?: '0'; // deal with empty input while(count($versionNumbers) < 3) { diff --git a/lib/public/L10N/IFactory.php b/lib/public/L10N/IFactory.php index 9c006073200..1bc231e4e2e 100644 --- a/lib/public/L10N/IFactory.php +++ b/lib/public/L10N/IFactory.php @@ -21,6 +21,8 @@ */ namespace OCP\L10N; +use OCP\IUser; + /** * @since 8.2.0 */ @@ -93,10 +95,16 @@ interface IFactory { /** * iterate through language settings (if provided) in this order: * 1. returns the forced language or: - * 2. returns the user language or: - * 3. returns the system default language or: - * 4+∞. returns 'en' + * 2. if applicable, the trunk of 1 (e.g. "fu" instead of "fu_BAR" + * 3. returns the user language or: + * 4. if applicable, the trunk of 3 + * 5. returns the system default language or: + * 6. if applicable, the trunk of 5 + * 7+∞. returns 'en' + * + * Hint: in most cases findLanguage() suits you fine + * * @since 14.0.0 */ - public function iterateLanguage(bool $reset = false): string; + public function getLanguageIterator(IUser $user = null): ILanguageIterator; } diff --git a/lib/public/L10N/ILanguageIterator.php b/lib/public/L10N/ILanguageIterator.php new file mode 100644 index 00000000000..ef923dfd249 --- /dev/null +++ b/lib/public/L10N/ILanguageIterator.php @@ -0,0 +1,74 @@ +<?php +/** + * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @author Arthur Schiwon <blizzz@arthur-schiwon.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\L10N; + +/** + * Interface ILanguageIterator + * + * iterator across language settings (if provided) in this order: + * 1. returns the forced language or: + * 2. if applicable, the trunk of 1 (e.g. "fu" instead of "fu_BAR" + * 3. returns the user language or: + * 4. if applicable, the trunk of 3 + * 5. returns the system default language or: + * 6. if applicable, the trunk of 5 + * 7+∞. returns 'en' + * + * if settings are not present or truncating is not applicable, the iterator + * skips to the next valid item itself + * + * @package OCP\L10N + * + * @since 14.0.0 + */ +interface ILanguageIterator extends \Iterator { + + /** + * Return the current element + * + * @since 14.0.0 + */ + public function current(): string; + + /** + * Move forward to next element + * + * @since 14.0.0 + */ + public function next(); + + /** + * Return the key of the current element + * + * @since 14.0.0 + */ + public function key():int; + + /** + * Checks if current position is valid + * + * @since 14.0.0 + */ + public function valid():bool; +} |