diff options
Diffstat (limited to 'apps/theming')
246 files changed, 25981 insertions, 0 deletions
diff --git a/apps/theming/.l10nignore b/apps/theming/.l10nignore new file mode 100644 index 00000000000..578b66cb24e --- /dev/null +++ b/apps/theming/.l10nignore @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later +js/3rdparty/ diff --git a/apps/theming/README.md b/apps/theming/README.md new file mode 100644 index 00000000000..986523b61bf --- /dev/null +++ b/apps/theming/README.md @@ -0,0 +1,51 @@ +<!-- + - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +# Theming + +## Background picture requirements + +A reference to why it was very difficult to actually find good background pictures – there are quite some requirements when it comes to picking: + +- It needs to be an exceptionally good photo of course – since when chosen, people will see it every day. +- We need to have a good balance of different motives, e.g. not too many landscape pics. +- Same for a good balance of different colors. +- The photo needs to work as a background. Photos with objects focused in the middle don’t really work as they will be overlapped by the widgets and content anyway. +- Especially the top part cannot have too much differing contrast, as then it’s not possible to see the navigation icons. +- Especially the top part should be either dark-ish or light-ish, but not a shade exactly inbetween because then contrast can neither be achieved with light nor dark icons. +- We serve the pictures at 4k resolution and most of the selected images are also available in 6k or higher so it is future-proof. +- For the search of course we had to limit to CC0, CC By and CC By-Sa. Only CC0 would have been practically impossible cause there’s just not so many good ones which fit. +- Good pages to find photos are [StockSnap](https://stocksnap.io), [Wikimedia Commons](https://commons.wikimedia.org), [Openverse](https://wordpress.org/openverse/) and [Flickr (with license "commercial use & mods allowed")](https://flickr.com/search/?license=4%2C5%2C9%2C10&text=Nextcloud), sorting by interesting or downloads. Most others like Unsplash, Pexels, Pixabay, etc. meanwhile have a non-standard license. + + +## Background picture technicals +- All backgrounds are sized to maximum 3840px width (4K resolution). +- To ensure quick loading times, the image needs to be compressed, ideally to around 1 MB or less. E.g. via 90–95% quality in GIMP export. We could also explore using newer formats. +- Previews are sized to 352px width (min height 192px), which is double of the current picker grid size so it looks nice on high-res displays. Quality is also set to around 90% at export. + + +## Background picture credits + +In `img/background/`: + +- Default background: [Globe (Jenna Kim - Nextcloud GmbH, C-BY-SA-4.0)](https://nextcloud.com/trademarks/) - orginal 4k +- [Clouds (Kamil Porembiński, CC BY-SA)](https://www.flickr.com/photos/paszczak000/8715851521/) – original 4k, color modified and sky color changed to Nextcloud blue. +- [Pedra azul milky way (Eduardo Neves, CC BY-SA)](https://commons.wikimedia.org/wiki/File:Pedra_Azul_Milky_Way.jpg) – original 5k. +- [Soft floral (Hannah MacLean, CC0)](https://stocksnap.io/photo/soft-floral-XOYWCCW5PA) – original 5.5k. +- [Morning fog (Ted Moravec, Public Domain)](https://flickr.com/photos/tmoravec/52392410261) – original 3k. +- [Underwater ocean (Stefanus Martanto Setyo Husodo, CC0)](https://stocksnap.io/photo/underwater-ocean-TJA9LBH4WS) – original 5k. +- [Rhythm and blues (Zoltán Vörös, CC BY)](https://flickr.com/photos/v923z/51634409289/) – original 2k (it’s fine since the motive is blurry anyway). +- [Butterfly wing scale (Anatoly Mikhaltsov, CC BY-SA)](https://commons.wikimedia.org/wiki/File:%D0%A7%D0%B5%D1%88%D1%83%D0%B9%D0%BA%D0%B8_%D0%BA%D1%80%D1%8B%D0%BB%D0%B0_%D0%B1%D0%B0%D0%B1%D0%BE%D1%87%D0%BA%D0%B8.jpg) – original 5k, cropped to use top right and retouched away a bright spot, now 4k. +- [Cetonia aurata take off composition (Bernie, Public Domain)](https://commons.wikimedia.org/wiki/File:Cetonia_aurata_take_off_composition_05172009.jpg) – original 8k. +- [Ribbed red metal (Dejan Krsmanovic, CC BY)](https://www.flickr.com/photos/dejankrsmanovic/42971456774/) – original 5k. +- [Barents bloom (European Space Agency, CC BY-SA)](https://www.esa.int/ESA_Multimedia/Images/2016/08/Barents_bloom) – original 2k (it’s fine since the motive is blurry anyway), rotated 90° right. +- [Flippity floppity (Hannes Fritz, CC BY-SA)](http://hannes.photos/flippity-floppity) – original 4k, cropped to top left (2k) so the sharp parts are not part of the photo, looks better. +- [Roulette (Hannes Fritz, CC BY-SA)](http://hannes.photos/roulette) – original 4k. +- [Sea spray (Hannes Fritz, CC BY-SA)](http://hannes.photos/sea-spray) – original 6k. +- [New zealand fern (Bernard Spragg, CC0)](https://commons.wikimedia.org/wiki/File:NZ_Fern.(Blechnum_chambersii)_(11263534936).jpg) – original 2.5k. +- [Pink tapioca bubbles (Rawpixel, CC BY)](https://www.flickr.com/photos/byrawpixel/27665140298/in/photostream/) – original 6k. +- [Waxing crescent moon (NASA, Public Domain)](https://www.nasa.gov/image-feature/a-waxing-crescent-moon) +- [Cityscape (Tommy Chau, CC BY)](https://www.flickr.com/photos/90975693@N05/16910999368) – original 6k. +- [Lion rock hill (Tommy Chau, CC BY)](https://www.flickr.com/photos/90975693@N05/17136440246) – original 6k. +- [Yellow bricks (Lali Masriera, CC BY)](https://www.flickr.com/photos/visualpanic/3982464447) – original 4k, color modified for visibility of icons, and slightly cropped on the left so motive is centered. diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml new file mode 100644 index 00000000000..cc5aea853c6 --- /dev/null +++ b/apps/theming/appinfo/info.xml @@ -0,0 +1,43 @@ +<?xml version="1.0"?> +<!-- + - SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> + <id>theming</id> + <name>Theming</name> + <summary>Adjust the Nextcloud theme</summary> + <description>Adjust the Nextcloud theme</description> + <version>2.7.0</version> + <licence>agpl</licence> + <author>Nextcloud</author> + <namespace>Theming</namespace> + + <types> + <logging/> + </types> + + <category>customization</category> + <bugs>https://github.com/nextcloud/server/issues</bugs> + <dependencies> + <nextcloud min-version="32" max-version="32"/> + </dependencies> + + <repair-steps> + <post-migration> + <step>OCA\Theming\Migration\InitBackgroundImagesMigration</step> + </post-migration> + </repair-steps> + + <commands> + <command>OCA\Theming\Command\UpdateConfig</command> + </commands> + + <settings> + <admin>OCA\Theming\Settings\Admin</admin> + <admin-section>OCA\Theming\Settings\AdminSection</admin-section> + <personal>OCA\Theming\Settings\Personal</personal> + <personal-section>OCA\Theming\Settings\PersonalSection</personal-section> + </settings> +</info> diff --git a/apps/theming/appinfo/routes.php b/apps/theming/appinfo/routes.php new file mode 100644 index 00000000000..b0aedbbb803 --- /dev/null +++ b/apps/theming/appinfo/routes.php @@ -0,0 +1,96 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +return [ + 'routes' => [ + [ + 'name' => 'Theming#updateAppMenu', + 'url' => '/ajax/updateAppMenu', + 'verb' => 'PUT', + ], + [ + 'name' => 'Theming#updateStylesheet', + 'url' => '/ajax/updateStylesheet', + 'verb' => 'POST' + ], + [ + 'name' => 'Theming#undo', + 'url' => '/ajax/undoChanges', + 'verb' => 'POST' + ], + [ + 'name' => 'Theming#undoAll', + 'url' => '/ajax/undoAllChanges', + 'verb' => 'POST' + ], + [ + 'name' => 'Theming#uploadImage', + 'url' => '/ajax/uploadImage', + 'verb' => 'POST' + ], + [ + 'name' => 'Theming#getThemeStylesheet', + 'url' => '/theme/{themeId}.css', + 'verb' => 'GET', + ], + [ + 'name' => 'Theming#getImage', + 'url' => '/image/{key}', + 'verb' => 'GET', + ], + [ + 'name' => 'Theming#getManifest', + 'url' => '/manifest/{app}', + 'verb' => 'GET', + 'defaults' => ['app' => 'core'] + ], + [ + 'name' => 'Icon#getFavicon', + 'url' => '/favicon/{app}', + 'verb' => 'GET', + 'defaults' => ['app' => 'core'], + ], + [ + 'name' => 'Icon#getTouchIcon', + 'url' => '/icon/{app}', + 'verb' => 'GET', + 'defaults' => ['app' => 'core'], + ], + [ + 'name' => 'Icon#getThemedIcon', + 'url' => '/img/{app}/{image}', + 'verb' => 'GET', + 'requirements' => ['image' => '.+'] + ], + [ + 'name' => 'userTheme#getBackground', + 'url' => '/background', + 'verb' => 'GET', + ], + [ + 'name' => 'userTheme#setBackground', + 'url' => '/background/{type}', + 'verb' => 'POST', + ], + [ + 'name' => 'userTheme#deleteBackground', + 'url' => '/background/custom', + 'verb' => 'DELETE', + ], + ], + 'ocs' => [ + [ + 'name' => 'userTheme#enableTheme', + 'url' => '/api/v1/theme/{themeId}/enable', + 'verb' => 'PUT', + ], + [ + 'name' => 'userTheme#disableTheme', + 'url' => '/api/v1/theme/{themeId}', + 'verb' => 'DELETE', + ], + ] +]; diff --git a/apps/theming/composer/autoload.php b/apps/theming/composer/autoload.php new file mode 100644 index 00000000000..2990c5da55a --- /dev/null +++ b/apps/theming/composer/autoload.php @@ -0,0 +1,25 @@ +<?php + +// autoload.php @generated by Composer + +if (PHP_VERSION_ID < 50600) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); +} + +require_once __DIR__ . '/composer/autoload_real.php'; + +return ComposerAutoloaderInitTheming::getLoader(); diff --git a/apps/theming/composer/composer.json b/apps/theming/composer/composer.json new file mode 100644 index 00000000000..8dea35c04cb --- /dev/null +++ b/apps/theming/composer/composer.json @@ -0,0 +1,13 @@ +{ + "config" : { + "vendor-dir": ".", + "optimize-autoloader": true, + "classmap-authoritative": true, + "autoloader-suffix": "Theming" + }, + "autoload" : { + "psr-4": { + "OCA\\Theming\\": "../lib/" + } + } +} diff --git a/apps/theming/composer/composer.lock b/apps/theming/composer/composer.lock new file mode 100644 index 00000000000..62a29d36726 --- /dev/null +++ b/apps/theming/composer/composer.lock @@ -0,0 +1,18 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "d751713988987e9331980363e24189ce", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/apps/theming/composer/composer/ClassLoader.php b/apps/theming/composer/composer/ClassLoader.php new file mode 100644 index 00000000000..7824d8f7eaf --- /dev/null +++ b/apps/theming/composer/composer/ClassLoader.php @@ -0,0 +1,579 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Jordi Boggiano <j.boggiano@seld.be> + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array<string, array<string, int>> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array<string, list<string>> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list<string> + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array<string, array<string, list<string>>> + */ + private $prefixesPsr0 = array(); + /** + * @var list<string> + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array<string, string> + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array<string, bool> + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array<string, self> + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array<string, list<string>> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array<string, list<string>> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list<string> + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list<string> + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array<string, string> Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array<string, string> $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array<string, self> + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/apps/theming/composer/composer/InstalledVersions.php b/apps/theming/composer/composer/InstalledVersions.php new file mode 100644 index 00000000000..51e734a774b --- /dev/null +++ b/apps/theming/composer/composer/InstalledVersions.php @@ -0,0 +1,359 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/apps/theming/composer/composer/LICENSE b/apps/theming/composer/composer/LICENSE new file mode 100644 index 00000000000..f27399a042d --- /dev/null +++ b/apps/theming/composer/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/apps/theming/composer/composer/autoload_classmap.php b/apps/theming/composer/composer/autoload_classmap.php new file mode 100644 index 00000000000..9b53c0f9fea --- /dev/null +++ b/apps/theming/composer/composer/autoload_classmap.php @@ -0,0 +1,44 @@ +<?php + +// autoload_classmap.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'OCA\\Theming\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php', + 'OCA\\Theming\\Capabilities' => $baseDir . '/../lib/Capabilities.php', + 'OCA\\Theming\\Command\\UpdateConfig' => $baseDir . '/../lib/Command/UpdateConfig.php', + 'OCA\\Theming\\Controller\\IconController' => $baseDir . '/../lib/Controller/IconController.php', + 'OCA\\Theming\\Controller\\ThemingController' => $baseDir . '/../lib/Controller/ThemingController.php', + 'OCA\\Theming\\Controller\\UserThemeController' => $baseDir . '/../lib/Controller/UserThemeController.php', + 'OCA\\Theming\\ITheme' => $baseDir . '/../lib/ITheme.php', + 'OCA\\Theming\\IconBuilder' => $baseDir . '/../lib/IconBuilder.php', + 'OCA\\Theming\\ImageManager' => $baseDir . '/../lib/ImageManager.php', + 'OCA\\Theming\\Jobs\\MigrateBackgroundImages' => $baseDir . '/../lib/Jobs/MigrateBackgroundImages.php', + 'OCA\\Theming\\Jobs\\RestoreBackgroundImageColor' => $baseDir . '/../lib/Jobs/RestoreBackgroundImageColor.php', + 'OCA\\Theming\\Listener\\BeforePreferenceListener' => $baseDir . '/../lib/Listener/BeforePreferenceListener.php', + 'OCA\\Theming\\Listener\\BeforeTemplateRenderedListener' => $baseDir . '/../lib/Listener/BeforeTemplateRenderedListener.php', + 'OCA\\Theming\\Migration\\InitBackgroundImagesMigration' => $baseDir . '/../lib/Migration/InitBackgroundImagesMigration.php', + 'OCA\\Theming\\Migration\\Version2006Date20240905111627' => $baseDir . '/../lib/Migration/Version2006Date20240905111627.php', + 'OCA\\Theming\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php', + 'OCA\\Theming\\Service\\BackgroundService' => $baseDir . '/../lib/Service/BackgroundService.php', + 'OCA\\Theming\\Service\\JSDataService' => $baseDir . '/../lib/Service/JSDataService.php', + 'OCA\\Theming\\Service\\ThemeInjectionService' => $baseDir . '/../lib/Service/ThemeInjectionService.php', + 'OCA\\Theming\\Service\\ThemesService' => $baseDir . '/../lib/Service/ThemesService.php', + 'OCA\\Theming\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php', + 'OCA\\Theming\\Settings\\AdminSection' => $baseDir . '/../lib/Settings/AdminSection.php', + 'OCA\\Theming\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php', + 'OCA\\Theming\\Settings\\PersonalSection' => $baseDir . '/../lib/Settings/PersonalSection.php', + 'OCA\\Theming\\SetupChecks\\PhpImagickModule' => $baseDir . '/../lib/SetupChecks/PhpImagickModule.php', + 'OCA\\Theming\\Themes\\CommonThemeTrait' => $baseDir . '/../lib/Themes/CommonThemeTrait.php', + 'OCA\\Theming\\Themes\\DarkHighContrastTheme' => $baseDir . '/../lib/Themes/DarkHighContrastTheme.php', + 'OCA\\Theming\\Themes\\DarkTheme' => $baseDir . '/../lib/Themes/DarkTheme.php', + 'OCA\\Theming\\Themes\\DefaultTheme' => $baseDir . '/../lib/Themes/DefaultTheme.php', + 'OCA\\Theming\\Themes\\DyslexiaFont' => $baseDir . '/../lib/Themes/DyslexiaFont.php', + 'OCA\\Theming\\Themes\\HighContrastTheme' => $baseDir . '/../lib/Themes/HighContrastTheme.php', + 'OCA\\Theming\\Themes\\LightTheme' => $baseDir . '/../lib/Themes/LightTheme.php', + 'OCA\\Theming\\ThemingDefaults' => $baseDir . '/../lib/ThemingDefaults.php', + 'OCA\\Theming\\Util' => $baseDir . '/../lib/Util.php', +); diff --git a/apps/theming/composer/composer/autoload_namespaces.php b/apps/theming/composer/composer/autoload_namespaces.php new file mode 100644 index 00000000000..3f5c9296251 --- /dev/null +++ b/apps/theming/composer/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ +<?php + +// autoload_namespaces.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( +); diff --git a/apps/theming/composer/composer/autoload_psr4.php b/apps/theming/composer/composer/autoload_psr4.php new file mode 100644 index 00000000000..43796e5bacd --- /dev/null +++ b/apps/theming/composer/composer/autoload_psr4.php @@ -0,0 +1,10 @@ +<?php + +// autoload_psr4.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( + 'OCA\\Theming\\' => array($baseDir . '/../lib'), +); diff --git a/apps/theming/composer/composer/autoload_real.php b/apps/theming/composer/composer/autoload_real.php new file mode 100644 index 00000000000..46d1b899868 --- /dev/null +++ b/apps/theming/composer/composer/autoload_real.php @@ -0,0 +1,37 @@ +<?php + +// autoload_real.php @generated by Composer + +class ComposerAutoloaderInitTheming +{ + private static $loader; + + public static function loadClassLoader($class) + { + if ('Composer\Autoload\ClassLoader' === $class) { + require __DIR__ . '/ClassLoader.php'; + } + } + + /** + * @return \Composer\Autoload\ClassLoader + */ + public static function getLoader() + { + if (null !== self::$loader) { + return self::$loader; + } + + spl_autoload_register(array('ComposerAutoloaderInitTheming', 'loadClassLoader'), true, true); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); + spl_autoload_unregister(array('ComposerAutoloaderInitTheming', 'loadClassLoader')); + + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInitTheming::getInitializer($loader)); + + $loader->setClassMapAuthoritative(true); + $loader->register(true); + + return $loader; + } +} diff --git a/apps/theming/composer/composer/autoload_static.php b/apps/theming/composer/composer/autoload_static.php new file mode 100644 index 00000000000..184d9ed0761 --- /dev/null +++ b/apps/theming/composer/composer/autoload_static.php @@ -0,0 +1,70 @@ +<?php + +// autoload_static.php @generated by Composer + +namespace Composer\Autoload; + +class ComposerStaticInitTheming +{ + public static $prefixLengthsPsr4 = array ( + 'O' => + array ( + 'OCA\\Theming\\' => 12, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'OCA\\Theming\\' => + array ( + 0 => __DIR__ . '/..' . '/../lib', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'OCA\\Theming\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php', + 'OCA\\Theming\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php', + 'OCA\\Theming\\Command\\UpdateConfig' => __DIR__ . '/..' . '/../lib/Command/UpdateConfig.php', + 'OCA\\Theming\\Controller\\IconController' => __DIR__ . '/..' . '/../lib/Controller/IconController.php', + 'OCA\\Theming\\Controller\\ThemingController' => __DIR__ . '/..' . '/../lib/Controller/ThemingController.php', + 'OCA\\Theming\\Controller\\UserThemeController' => __DIR__ . '/..' . '/../lib/Controller/UserThemeController.php', + 'OCA\\Theming\\ITheme' => __DIR__ . '/..' . '/../lib/ITheme.php', + 'OCA\\Theming\\IconBuilder' => __DIR__ . '/..' . '/../lib/IconBuilder.php', + 'OCA\\Theming\\ImageManager' => __DIR__ . '/..' . '/../lib/ImageManager.php', + 'OCA\\Theming\\Jobs\\MigrateBackgroundImages' => __DIR__ . '/..' . '/../lib/Jobs/MigrateBackgroundImages.php', + 'OCA\\Theming\\Jobs\\RestoreBackgroundImageColor' => __DIR__ . '/..' . '/../lib/Jobs/RestoreBackgroundImageColor.php', + 'OCA\\Theming\\Listener\\BeforePreferenceListener' => __DIR__ . '/..' . '/../lib/Listener/BeforePreferenceListener.php', + 'OCA\\Theming\\Listener\\BeforeTemplateRenderedListener' => __DIR__ . '/..' . '/../lib/Listener/BeforeTemplateRenderedListener.php', + 'OCA\\Theming\\Migration\\InitBackgroundImagesMigration' => __DIR__ . '/..' . '/../lib/Migration/InitBackgroundImagesMigration.php', + 'OCA\\Theming\\Migration\\Version2006Date20240905111627' => __DIR__ . '/..' . '/../lib/Migration/Version2006Date20240905111627.php', + 'OCA\\Theming\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php', + 'OCA\\Theming\\Service\\BackgroundService' => __DIR__ . '/..' . '/../lib/Service/BackgroundService.php', + 'OCA\\Theming\\Service\\JSDataService' => __DIR__ . '/..' . '/../lib/Service/JSDataService.php', + 'OCA\\Theming\\Service\\ThemeInjectionService' => __DIR__ . '/..' . '/../lib/Service/ThemeInjectionService.php', + 'OCA\\Theming\\Service\\ThemesService' => __DIR__ . '/..' . '/../lib/Service/ThemesService.php', + 'OCA\\Theming\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php', + 'OCA\\Theming\\Settings\\AdminSection' => __DIR__ . '/..' . '/../lib/Settings/AdminSection.php', + 'OCA\\Theming\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php', + 'OCA\\Theming\\Settings\\PersonalSection' => __DIR__ . '/..' . '/../lib/Settings/PersonalSection.php', + 'OCA\\Theming\\SetupChecks\\PhpImagickModule' => __DIR__ . '/..' . '/../lib/SetupChecks/PhpImagickModule.php', + 'OCA\\Theming\\Themes\\CommonThemeTrait' => __DIR__ . '/..' . '/../lib/Themes/CommonThemeTrait.php', + 'OCA\\Theming\\Themes\\DarkHighContrastTheme' => __DIR__ . '/..' . '/../lib/Themes/DarkHighContrastTheme.php', + 'OCA\\Theming\\Themes\\DarkTheme' => __DIR__ . '/..' . '/../lib/Themes/DarkTheme.php', + 'OCA\\Theming\\Themes\\DefaultTheme' => __DIR__ . '/..' . '/../lib/Themes/DefaultTheme.php', + 'OCA\\Theming\\Themes\\DyslexiaFont' => __DIR__ . '/..' . '/../lib/Themes/DyslexiaFont.php', + 'OCA\\Theming\\Themes\\HighContrastTheme' => __DIR__ . '/..' . '/../lib/Themes/HighContrastTheme.php', + 'OCA\\Theming\\Themes\\LightTheme' => __DIR__ . '/..' . '/../lib/Themes/LightTheme.php', + 'OCA\\Theming\\ThemingDefaults' => __DIR__ . '/..' . '/../lib/ThemingDefaults.php', + 'OCA\\Theming\\Util' => __DIR__ . '/..' . '/../lib/Util.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitTheming::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitTheming::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitTheming::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/apps/theming/composer/composer/installed.json b/apps/theming/composer/composer/installed.json new file mode 100644 index 00000000000..f20a6c47c6d --- /dev/null +++ b/apps/theming/composer/composer/installed.json @@ -0,0 +1,5 @@ +{ + "packages": [], + "dev": false, + "dev-package-names": [] +} diff --git a/apps/theming/composer/composer/installed.php b/apps/theming/composer/composer/installed.php new file mode 100644 index 00000000000..1a66c7f2416 --- /dev/null +++ b/apps/theming/composer/composer/installed.php @@ -0,0 +1,23 @@ +<?php return array( + 'root' => array( + 'name' => '__root__', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'dev' => false, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css new file mode 100644 index 00000000000..41f0272f017 --- /dev/null +++ b/apps/theming/css/default.css @@ -0,0 +1,118 @@ +/** SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors */ +/** SPDX-License-Identifier: AGPL-3.0-or-later */ +:root { + --color-main-background: #ffffff; + --color-main-background-rgb: 255,255,255; + --color-main-background-translucent: rgba(var(--color-main-background-rgb), .97); + --color-main-background-blur: rgba(var(--color-main-background-rgb), .8); + --filter-background-blur: blur(25px); + --gradient-main-background: var(--color-main-background) 0%, var(--color-main-background-translucent) 85%, transparent 100%; + --color-background-hover: #f5f5f5; + /** Can be used e.g. to colorize selected table rows */ + --color-background-dark: #ededed; + /** This should only be used for elements, not as a text background! Otherwise it will not work for accessibility. */ + --color-background-darker: #dbdbdb; + --color-placeholder-light: #e6e6e6; + --color-placeholder-dark: #cccccc; + --color-main-text: #222222; + --color-text-maxcontrast: #6b6b6b; + --color-text-maxcontrast-default: #6b6b6b; + --color-text-maxcontrast-background-blur: #595959; + /** @deprecated use ` --color-main-text` instead */ + --color-text-light: var(--color-main-text); + /** @deprecated use `--color-text-maxcontrast` instead */ + --color-text-lighter: var(--color-text-maxcontrast); + --color-scrollbar: var(--color-border-maxcontrast) transparent; + --color-error: #DB0606; + --color-error-rgb: 219,6,6; + --color-error-hover: #df2525; + --color-error-text: #c20505; + --color-warning: #A37200; + --color-warning-rgb: 163,114,0; + --color-warning-hover: #8a6000; + --color-warning-text: #7f5900; + --color-success: #2d7b41; + --color-success-rgb: 45,123,65; + --color-success-hover: #428854; + --color-success-text: #286c39; + --color-info: #0071ad; + --color-info-rgb: 0,113,173; + --color-info-hover: #197fb5; + --color-info-text: #006499; + --color-favorite: #A37200; + --color-loading-light: #cccccc; + --color-loading-dark: #444444; + --color-box-shadow-rgb: 77,77,77; + --color-box-shadow: rgba(var(--color-box-shadow-rgb), 0.5); + --color-border: #ededed; + --color-border-dark: #dbdbdb; + --color-border-maxcontrast: #7d7d7d; + --font-face: system-ui, -apple-system, 'Segoe UI', Roboto, Oxygen-Sans, Cantarell, Ubuntu, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --default-font-size: 15px; + --font-size-small: 13px; + /* 1.5 x font-size for accessibility */ + --default-line-height: 1.5; + --animation-quick: 100ms; + --animation-slow: 300ms; + /** Border width for input elements such as text fields and selects */ + --border-width-input: 1px; + --border-width-input-focused: 2px; + + /* Border radii (new values) */ + --border-radius-small: 4px; /* For smaller elements */ + --border-radius-element: 8px; /* For interactive elements such as buttons, input, navigation and list items */ + --border-radius-container: 12px; /* For smaller containers like action menus */ + --border-radius-container-large: 16px; /* For larger containers like body or modals */ + + /* Border radii (deprecated) */ + --border-radius: var(--border-radius-small); + --border-radius-large: var(--border-radius-element); + --border-radius-rounded: 28px; + --border-radius-pill: 100px; + + --default-clickable-area: 34px; + --clickable-area-large: 48px; + --clickable-area-small: 24px; + --default-grid-baseline: 4px; + + --header-height: 50px; + --header-menu-item-height: 44px; + /* An alpha mask to be applied to all icons on the navigation bar (header menu). + * Icons are have a size of 20px but usually we use MDI which have a content of 16px so 2px padding top bottom, + * for better gradient we must at first begin at those 2px (10% of height) as start and stop positions. + */ + --header-menu-icon-mask: linear-gradient(var(--color-background-plain-text) 25%, color-mix(in srgb, var(--color-background-plain-text), 55% transparent) 90%) alpha; + + --navigation-width: 300px; + --sidebar-min-width: 300px; + --sidebar-max-width: 500px; + /* Border radius of the body container */ + --body-container-radius: var(--border-radius-container-large); + /* Margin of the body container */ + --body-container-margin: calc(var(--default-grid-baseline) * 2); + /* Height of the body container to fully fill the view port */ + --body-height: calc(100% - env(safe-area-inset-bottom) - var(--header-height) - var(--body-container-margin)); + --breakpoint-mobile: 1024px; + --background-invert-if-dark: no; + --background-invert-if-bright: invert(100%); + --background-image-invert-if-bright: no; + --primary-invert-if-bright: no; + --primary-invert-if-dark: invert(100%); + --color-primary: #00679e; + --color-primary-text: #ffffff; + --color-primary-hover: #3285b1; + --color-primary-light: #e5eff5; + --color-primary-light-text: #00293f; + --color-primary-light-hover: #dbe4ea; + --color-primary-element: #00679e; + --color-primary-element-hover: #005a8a; + --color-primary-element-text: #ffffff; + --color-primary-element-text-dark: #f5f5f5; + --color-primary-element-light: #e5eff5; + --color-primary-element-light-hover: #dbe4ea; + --color-primary-element-light-text: #00293f; + --gradient-primary-background: linear-gradient(40deg, var(--color-primary) 0%, var(--color-primary-hover) 100%); + --color-background-plain: #00679e; + --color-background-plain-text: #ffffff; + --image-background: url('/apps/theming/img/background/jenna-kim-the-globe.webp'); +} diff --git a/apps/theming/fonts/OpenDyslexic-Bold.otf b/apps/theming/fonts/OpenDyslexic-Bold.otf Binary files differnew file mode 100644 index 00000000000..4c492e2fcc2 --- /dev/null +++ b/apps/theming/fonts/OpenDyslexic-Bold.otf diff --git a/apps/theming/fonts/OpenDyslexic-Regular.otf b/apps/theming/fonts/OpenDyslexic-Regular.otf Binary files differnew file mode 100644 index 00000000000..1226d2ab281 --- /dev/null +++ b/apps/theming/fonts/OpenDyslexic-Regular.otf diff --git a/apps/theming/img/accessibility-dark.svg b/apps/theming/img/accessibility-dark.svg new file mode 100644 index 00000000000..ada77c8c394 --- /dev/null +++ b/apps/theming/img/accessibility-dark.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"><path d="M479.75-696q-34.75 0-59.25-24.75t-24.5-59.5q0-34.75 24.75-59.25t59.5-24.5q34.75 0 59.25 24.75t24.5 59.5q0 34.75-24.75 59.25t-59.5 24.5ZM360-108v-463q-55-4-108.5-16T144-613l18-67q78 21 157.5 32.5T480-636q81 0 160.5-11.5T798-680l18 67q-54 14-107.5 26T600-570.55V-108h-72l-9-222h-77l-10 222h-72Z"/></svg>
\ No newline at end of file diff --git a/apps/theming/img/app-dark.svg b/apps/theming/img/app-dark.svg new file mode 100644 index 00000000000..fdccfa9d15e --- /dev/null +++ b/apps/theming/img/app-dark.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"><path d="M576-48H432q-20.4 0-34.2-13.8Q384-75.6 384-96v-192q0-20.4 13.8-34.2Q411.6-336 432-336h36v-144H168q-29.7 0-50.85-21.15Q96-522.3 96-552v-156q0-29.7 21.15-50.85Q138.3-780 168-780h72v-36q0-20.4 13.8-34.2Q267.6-864 288-864h432q20.4 0 34.2 13.8Q768-836.4 768-816v144q0 20.4-13.8 34.2Q740.4-624 720-624H288q-20.4 0-34.2-13.8Q240-651.6 240-672v-36h-72v156h300q29.7 0 50.85 21.15Q540-509.7 540-480v144h36q20.4 0 34.2 13.8Q624-308.4 624-288v192q0 20.4-13.8 34.2Q596.4-48 576-48Z"/></svg>
\ No newline at end of file diff --git a/apps/theming/img/app.svg b/apps/theming/img/app.svg new file mode 100644 index 00000000000..96ed5f52d33 --- /dev/null +++ b/apps/theming/img/app.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#fff"><path d="M576-48H432q-20.4 0-34.2-13.8Q384-75.6 384-96v-192q0-20.4 13.8-34.2Q411.6-336 432-336h36v-144H168q-29.7 0-50.85-21.15Q96-522.3 96-552v-156q0-29.7 21.15-50.85Q138.3-780 168-780h72v-36q0-20.4 13.8-34.2Q267.6-864 288-864h432q20.4 0 34.2 13.8Q768-836.4 768-816v144q0 20.4-13.8 34.2Q740.4-624 720-624H288q-20.4 0-34.2-13.8Q240-651.6 240-672v-36h-72v156h300q29.7 0 50.85 21.15Q540-509.7 540-480v144h36q20.4 0 34.2 13.8Q624-308.4 624-288v192q0 20.4-13.8 34.2Q596.4-48 576-48Z"/></svg>
\ No newline at end of file diff --git a/apps/theming/img/background/anatoly-mikhaltsov-butterfly-wing-scale.jpg b/apps/theming/img/background/anatoly-mikhaltsov-butterfly-wing-scale.jpg Binary files differnew file mode 100644 index 00000000000..36b0a0675de --- /dev/null +++ b/apps/theming/img/background/anatoly-mikhaltsov-butterfly-wing-scale.jpg diff --git a/apps/theming/img/background/bernard-spragg-new-zealand-fern.jpg b/apps/theming/img/background/bernard-spragg-new-zealand-fern.jpg Binary files differnew file mode 100644 index 00000000000..c4df0d673b0 --- /dev/null +++ b/apps/theming/img/background/bernard-spragg-new-zealand-fern.jpg diff --git a/apps/theming/img/background/bernie-cetonia-aurata-take-off-composition.jpg b/apps/theming/img/background/bernie-cetonia-aurata-take-off-composition.jpg Binary files differnew file mode 100644 index 00000000000..a299a44ff8c --- /dev/null +++ b/apps/theming/img/background/bernie-cetonia-aurata-take-off-composition.jpg diff --git a/apps/theming/img/background/dejan-krsmanovic-ribbed-red-metal.jpg b/apps/theming/img/background/dejan-krsmanovic-ribbed-red-metal.jpg Binary files differnew file mode 100644 index 00000000000..586f6c13149 --- /dev/null +++ b/apps/theming/img/background/dejan-krsmanovic-ribbed-red-metal.jpg diff --git a/apps/theming/img/background/eduardo-neves-pedra-azul.jpg b/apps/theming/img/background/eduardo-neves-pedra-azul.jpg Binary files differnew file mode 100644 index 00000000000..937da4e2c5e --- /dev/null +++ b/apps/theming/img/background/eduardo-neves-pedra-azul.jpg diff --git a/apps/theming/img/background/european-space-agency-barents-bloom.jpg b/apps/theming/img/background/european-space-agency-barents-bloom.jpg Binary files differnew file mode 100644 index 00000000000..700fa236052 --- /dev/null +++ b/apps/theming/img/background/european-space-agency-barents-bloom.jpg diff --git a/apps/theming/img/background/hannah-maclean-soft-floral.jpg b/apps/theming/img/background/hannah-maclean-soft-floral.jpg Binary files differnew file mode 100644 index 00000000000..aacfe101756 --- /dev/null +++ b/apps/theming/img/background/hannah-maclean-soft-floral.jpg diff --git a/apps/theming/img/background/hannes-fritz-flippity-floppity.jpg b/apps/theming/img/background/hannes-fritz-flippity-floppity.jpg Binary files differnew file mode 100644 index 00000000000..73302a4ccc3 --- /dev/null +++ b/apps/theming/img/background/hannes-fritz-flippity-floppity.jpg diff --git a/apps/theming/img/background/hannes-fritz-roulette.jpg b/apps/theming/img/background/hannes-fritz-roulette.jpg Binary files differnew file mode 100644 index 00000000000..b2406d21cb6 --- /dev/null +++ b/apps/theming/img/background/hannes-fritz-roulette.jpg diff --git a/apps/theming/img/background/hannes-fritz-sea-spray.jpg b/apps/theming/img/background/hannes-fritz-sea-spray.jpg Binary files differnew file mode 100644 index 00000000000..adab409139e --- /dev/null +++ b/apps/theming/img/background/hannes-fritz-sea-spray.jpg diff --git a/apps/theming/img/background/jenna-kim-the-globe-dark.webp b/apps/theming/img/background/jenna-kim-the-globe-dark.webp Binary files differnew file mode 100644 index 00000000000..bd3b0dafa2c --- /dev/null +++ b/apps/theming/img/background/jenna-kim-the-globe-dark.webp diff --git a/apps/theming/img/background/jenna-kim-the-globe.webp b/apps/theming/img/background/jenna-kim-the-globe.webp Binary files differnew file mode 100644 index 00000000000..909a87615eb --- /dev/null +++ b/apps/theming/img/background/jenna-kim-the-globe.webp diff --git a/apps/theming/img/background/kamil-porembinski-clouds.jpg b/apps/theming/img/background/kamil-porembinski-clouds.jpg Binary files differnew file mode 100644 index 00000000000..e9ddb7bdfeb --- /dev/null +++ b/apps/theming/img/background/kamil-porembinski-clouds.jpg diff --git a/apps/theming/img/background/lali-masriera-yellow-bricks.jpg b/apps/theming/img/background/lali-masriera-yellow-bricks.jpg Binary files differnew file mode 100644 index 00000000000..b32c3e56168 --- /dev/null +++ b/apps/theming/img/background/lali-masriera-yellow-bricks.jpg diff --git a/apps/theming/img/background/nasa-waxing-crescent-moon.jpg b/apps/theming/img/background/nasa-waxing-crescent-moon.jpg Binary files differnew file mode 100644 index 00000000000..281f1dc53f7 --- /dev/null +++ b/apps/theming/img/background/nasa-waxing-crescent-moon.jpg diff --git a/apps/theming/img/background/preview/anatoly-mikhaltsov-butterfly-wing-scale.jpg b/apps/theming/img/background/preview/anatoly-mikhaltsov-butterfly-wing-scale.jpg Binary files differnew file mode 100644 index 00000000000..a749442979f --- /dev/null +++ b/apps/theming/img/background/preview/anatoly-mikhaltsov-butterfly-wing-scale.jpg diff --git a/apps/theming/img/background/preview/bernard-spragg-new-zealand-fern.jpg b/apps/theming/img/background/preview/bernard-spragg-new-zealand-fern.jpg Binary files differnew file mode 100644 index 00000000000..49844a6e243 --- /dev/null +++ b/apps/theming/img/background/preview/bernard-spragg-new-zealand-fern.jpg diff --git a/apps/theming/img/background/preview/bernie-cetonia-aurata-take-off-composition.jpg b/apps/theming/img/background/preview/bernie-cetonia-aurata-take-off-composition.jpg Binary files differnew file mode 100644 index 00000000000..08fd5cf1c21 --- /dev/null +++ b/apps/theming/img/background/preview/bernie-cetonia-aurata-take-off-composition.jpg diff --git a/apps/theming/img/background/preview/dejan-krsmanovic-ribbed-red-metal.jpg b/apps/theming/img/background/preview/dejan-krsmanovic-ribbed-red-metal.jpg Binary files differnew file mode 100644 index 00000000000..b4430b2485c --- /dev/null +++ b/apps/theming/img/background/preview/dejan-krsmanovic-ribbed-red-metal.jpg diff --git a/apps/theming/img/background/preview/eduardo-neves-pedra-azul.jpg b/apps/theming/img/background/preview/eduardo-neves-pedra-azul.jpg Binary files differnew file mode 100644 index 00000000000..e62eb04f954 --- /dev/null +++ b/apps/theming/img/background/preview/eduardo-neves-pedra-azul.jpg diff --git a/apps/theming/img/background/preview/european-space-agency-barents-bloom.jpg b/apps/theming/img/background/preview/european-space-agency-barents-bloom.jpg Binary files differnew file mode 100644 index 00000000000..d23a07e5364 --- /dev/null +++ b/apps/theming/img/background/preview/european-space-agency-barents-bloom.jpg diff --git a/apps/theming/img/background/preview/hannah-maclean-soft-floral.jpg b/apps/theming/img/background/preview/hannah-maclean-soft-floral.jpg Binary files differnew file mode 100644 index 00000000000..e349a926260 --- /dev/null +++ b/apps/theming/img/background/preview/hannah-maclean-soft-floral.jpg diff --git a/apps/theming/img/background/preview/hannes-fritz-flippity-floppity.jpg b/apps/theming/img/background/preview/hannes-fritz-flippity-floppity.jpg Binary files differnew file mode 100644 index 00000000000..2c6a91f1b2e --- /dev/null +++ b/apps/theming/img/background/preview/hannes-fritz-flippity-floppity.jpg diff --git a/apps/theming/img/background/preview/hannes-fritz-roulette.jpg b/apps/theming/img/background/preview/hannes-fritz-roulette.jpg Binary files differnew file mode 100644 index 00000000000..4d69e579210 --- /dev/null +++ b/apps/theming/img/background/preview/hannes-fritz-roulette.jpg diff --git a/apps/theming/img/background/preview/hannes-fritz-sea-spray.jpg b/apps/theming/img/background/preview/hannes-fritz-sea-spray.jpg Binary files differnew file mode 100644 index 00000000000..08b24f5be91 --- /dev/null +++ b/apps/theming/img/background/preview/hannes-fritz-sea-spray.jpg diff --git a/apps/theming/img/background/preview/jenna-kim-the-globe.jpg b/apps/theming/img/background/preview/jenna-kim-the-globe.jpg Binary files differnew file mode 100644 index 00000000000..3b98d2828cd --- /dev/null +++ b/apps/theming/img/background/preview/jenna-kim-the-globe.jpg diff --git a/apps/theming/img/background/preview/kamil-porembinski-clouds.jpg b/apps/theming/img/background/preview/kamil-porembinski-clouds.jpg Binary files differnew file mode 100644 index 00000000000..3a38a78922e --- /dev/null +++ b/apps/theming/img/background/preview/kamil-porembinski-clouds.jpg diff --git a/apps/theming/img/background/preview/lali-masriera-yellow-bricks.jpg b/apps/theming/img/background/preview/lali-masriera-yellow-bricks.jpg Binary files differnew file mode 100644 index 00000000000..01861cf001a --- /dev/null +++ b/apps/theming/img/background/preview/lali-masriera-yellow-bricks.jpg diff --git a/apps/theming/img/background/preview/nasa-waxing-crescent-moon.jpg b/apps/theming/img/background/preview/nasa-waxing-crescent-moon.jpg Binary files differnew file mode 100644 index 00000000000..8c46e372ad0 --- /dev/null +++ b/apps/theming/img/background/preview/nasa-waxing-crescent-moon.jpg diff --git a/apps/theming/img/background/preview/rawpixel-pink-tapioca-bubbles.jpg b/apps/theming/img/background/preview/rawpixel-pink-tapioca-bubbles.jpg Binary files differnew file mode 100644 index 00000000000..483c710c1ed --- /dev/null +++ b/apps/theming/img/background/preview/rawpixel-pink-tapioca-bubbles.jpg diff --git a/apps/theming/img/background/preview/stefanus-martanto-setyo-husodo-underwater-ocean.jpg b/apps/theming/img/background/preview/stefanus-martanto-setyo-husodo-underwater-ocean.jpg Binary files differnew file mode 100644 index 00000000000..97485bc1fcc --- /dev/null +++ b/apps/theming/img/background/preview/stefanus-martanto-setyo-husodo-underwater-ocean.jpg diff --git a/apps/theming/img/background/preview/ted-moravec-morning-fog.jpg b/apps/theming/img/background/preview/ted-moravec-morning-fog.jpg Binary files differnew file mode 100644 index 00000000000..5af76d89f1a --- /dev/null +++ b/apps/theming/img/background/preview/ted-moravec-morning-fog.jpg diff --git a/apps/theming/img/background/preview/tommy-chau-already.jpg b/apps/theming/img/background/preview/tommy-chau-already.jpg Binary files differnew file mode 100644 index 00000000000..46976b0292d --- /dev/null +++ b/apps/theming/img/background/preview/tommy-chau-already.jpg diff --git a/apps/theming/img/background/preview/tommy-chau-lion-rock-hill.jpg b/apps/theming/img/background/preview/tommy-chau-lion-rock-hill.jpg Binary files differnew file mode 100644 index 00000000000..59a3e131871 --- /dev/null +++ b/apps/theming/img/background/preview/tommy-chau-lion-rock-hill.jpg diff --git a/apps/theming/img/background/preview/zoltan-voros-rhythm-and-blues.jpg b/apps/theming/img/background/preview/zoltan-voros-rhythm-and-blues.jpg Binary files differnew file mode 100644 index 00000000000..aba4672f7ad --- /dev/null +++ b/apps/theming/img/background/preview/zoltan-voros-rhythm-and-blues.jpg diff --git a/apps/theming/img/background/rawpixel-pink-tapioca-bubbles.jpg b/apps/theming/img/background/rawpixel-pink-tapioca-bubbles.jpg Binary files differnew file mode 100644 index 00000000000..3b96469ee2c --- /dev/null +++ b/apps/theming/img/background/rawpixel-pink-tapioca-bubbles.jpg diff --git a/apps/theming/img/background/stefanus-martanto-setyo-husodo-underwater-ocean.jpg b/apps/theming/img/background/stefanus-martanto-setyo-husodo-underwater-ocean.jpg Binary files differnew file mode 100644 index 00000000000..c124a3ebfd9 --- /dev/null +++ b/apps/theming/img/background/stefanus-martanto-setyo-husodo-underwater-ocean.jpg diff --git a/apps/theming/img/background/ted-moravec-morning-fog.jpg b/apps/theming/img/background/ted-moravec-morning-fog.jpg Binary files differnew file mode 100644 index 00000000000..d79c1c15a87 --- /dev/null +++ b/apps/theming/img/background/ted-moravec-morning-fog.jpg diff --git a/apps/theming/img/background/tommy-chau-already.jpg b/apps/theming/img/background/tommy-chau-already.jpg Binary files differnew file mode 100644 index 00000000000..8d9cc45101f --- /dev/null +++ b/apps/theming/img/background/tommy-chau-already.jpg diff --git a/apps/theming/img/background/tommy-chau-lion-rock-hill.jpg b/apps/theming/img/background/tommy-chau-lion-rock-hill.jpg Binary files differnew file mode 100644 index 00000000000..f1247dd9c62 --- /dev/null +++ b/apps/theming/img/background/tommy-chau-lion-rock-hill.jpg diff --git a/apps/theming/img/background/zoltan-voros-rhythm-and-blues.jpg b/apps/theming/img/background/zoltan-voros-rhythm-and-blues.jpg Binary files differnew file mode 100644 index 00000000000..02577ae47a4 --- /dev/null +++ b/apps/theming/img/background/zoltan-voros-rhythm-and-blues.jpg diff --git a/apps/theming/img/dark-highcontrast.jpg b/apps/theming/img/dark-highcontrast.jpg Binary files differnew file mode 100644 index 00000000000..67ca457445d --- /dev/null +++ b/apps/theming/img/dark-highcontrast.jpg diff --git a/apps/theming/img/dark.jpg b/apps/theming/img/dark.jpg Binary files differnew file mode 100644 index 00000000000..403fb085cfb --- /dev/null +++ b/apps/theming/img/dark.jpg diff --git a/apps/theming/img/default-source.svg b/apps/theming/img/default-source.svg new file mode 100644 index 00000000000..89711e2a0c8 --- /dev/null +++ b/apps/theming/img/default-source.svg @@ -0,0 +1,13 @@ +<svg width="800" height="500" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> + <!-- Use this file to generate the default.jpg theme preview --> + + <!-- Half rectangle light mask --> + <defs><mask id="a"><path d="M0 0h800L0 500Z" fill="#fff"/></mask></defs> + <!-- Dark and light images link --> + <image width="800" height="500" xlink:href="dark.jpg"/> + <image width="800" height="500" xlink:href="light.jpg" mask="url(#a)" fill="#fff"/> + <!-- White opacity layer --> + <path fill="#fff" opacity=".35" d="M0 0h800v500H0z"/> + <!-- Moon/sun icon --> + <path d="M358.82 162.36a58 58 0 0 0-26.63 48.81c0 20.6 10.74 38.6 26.9 48.81A48.85 48.85 0 0 1 310 211.17a48.82 48.81 0 0 1 48.82-48.81m102.69 13.3 12.7 12.7L336 326.55l-12.7-12.7 138.2-138.18m-54.85 21.57-13.14-8.26-12.78 8.88 3.73-15.1-12.34-9.4 15.53-1.06 5.15-14.65 5.95 14.47 15.35.27-11.98 10.02 4.53 14.83m-29.3 32.04-10.29-6.48-9.94 6.92 3.02-11.72-9.68-7.36 12.07-.8 4-11.45 4.53 11.27 12.07.27-9.32 7.72 3.55 11.63m83.52 35.14a48.82 48.81 0 0 1-48.82 48.82 48.7 48.7 0 0 1-28.93-9.5l68.25-68.25a48.7 48.7 0 0 1 9.5 28.93m-39.06 58.4 24.59-10.2-2.13 29.73-22.46-19.53m38.44-23.96 10.2-24.59L490 296.82l-29.73 2.04m10.2-44.02-10.11-24.68L490 232.3l-19.53 22.55m-92.75 57.78 24.59 10.2-22.46 19.44z" stroke="#000"/> +</svg> diff --git a/apps/theming/img/default.jpg b/apps/theming/img/default.jpg Binary files differnew file mode 100644 index 00000000000..ac94f9f94ae --- /dev/null +++ b/apps/theming/img/default.jpg diff --git a/apps/theming/img/light-highcontrast.jpg b/apps/theming/img/light-highcontrast.jpg Binary files differnew file mode 100644 index 00000000000..39d3bfd6a94 --- /dev/null +++ b/apps/theming/img/light-highcontrast.jpg diff --git a/apps/theming/img/light.jpg b/apps/theming/img/light.jpg Binary files differnew file mode 100644 index 00000000000..aa758da908b --- /dev/null +++ b/apps/theming/img/light.jpg diff --git a/apps/theming/img/opendyslexic.jpg b/apps/theming/img/opendyslexic.jpg Binary files differnew file mode 100644 index 00000000000..75a91c86642 --- /dev/null +++ b/apps/theming/img/opendyslexic.jpg diff --git a/apps/theming/js/theming.js b/apps/theming/js/theming.js new file mode 100644 index 00000000000..d5b589a72d9 --- /dev/null +++ b/apps/theming/js/theming.js @@ -0,0 +1,5 @@ +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +OCA.Theming = OCP.InitialState.loadState('theming', 'data') diff --git a/apps/theming/l10n/.gitkeep b/apps/theming/l10n/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/apps/theming/l10n/.gitkeep diff --git a/apps/theming/l10n/ar.js b/apps/theming/l10n/ar.js new file mode 100644 index 00000000000..5448c47f589 --- /dev/null +++ b/apps/theming/l10n/ar.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "هذا الاسم أطول مما يجب", + "The given web address is too long" : "هذا العنوان أطول مما يجب", + "The given web address is not a valid URL" : "عنوان الويب هذا ليس عنوان URL صحيح", + "The given legal notice address is too long" : "هذه الملاحظة القانونية أطول مما يجب", + "The given legal notice address is not a valid URL" : "عنوان الملاحظة القانونية هذه ليس عنوان URL صحيح", + "The given privacy policy address is too long" : "عنوان سياسة الخصوصية هذا أطول مما يجب", + "The given privacy policy address is not a valid URL" : "عنوان سياسة الخصوصية هذا ليس عنوان URL صحيح", + "The given slogan is too long" : "هذه الشارة slogan أطول مما يجب", + "The given color is invalid" : "هذا اللون غير صحيح", + "Disable-user-theming should be true or false" : "\"إيقاف سمات المستخدم\" Disable-user-theming يجب أن تكون إمّا صح أو خطأ", + "Saved" : "تم الحفظ", + "Invalid app given" : "التطبيق المُعطى غير صحيح", + "Invalid type for setting \"defaultApp\" given" : "النوع المُعطى للإعدادات \"defaultApp\" غير صحيح", + "Invalid setting key" : "مفتاح الإعدادات غير صحيح", + "The file was uploaded" : "الملف تم رفعه", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم الملف المرفوع قد تجاوز upload_max_filesize الموجودة في ملف php.ini ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم الملف الذي تريد رفعه أعلى مما MAX_FILE_SIZE يسمح به نموذج HTML.", + "The file was only partially uploaded" : "الملف قد رُفع جزءا منه فقط", + "No file was uploaded" : "لم يتم رفع أي ملف", + "Missing a temporary folder" : "المجلد المؤقت غير موجود", + "Could not write file to disk" : "لم يستطع كتابة ملف للقرص", + "A PHP extension stopped the file upload" : "اضافة البي اچ بي PHP اوقفت رفع الملف", + "No file uploaded" : "لم يتم رفع الملف", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "أنت تستخدم الآن سمة مُخصّصة. إعدادات تطبيق السمات يمكن أن تتجاوز مميزات السمة التي تستخدمها.", + "Theming" : "تخصيص القالب", + "Appearance and accessibility" : "المظهر وسهولة الوصول ", + "PHP Imagick module" : "جزئية PHP Imagick ", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "وحدة PHP ـ \"imahick\" غير مُفعّلة بالرغم من تفعيل تطبيق الثيمات theming. حتى يتم توليد الأيقونة الأساسية favicon بشكل صحيح يتوجب تنصيب و تفعيل هذه الوحدة.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "جزئية PHP Imagick في هذا الخادوم لا تدعم خاصية SVG. لتوافق أفضل، يُنصح بتثبيتها", + "Dark theme with high contrast mode" : "سمة داكنة مع وضعية تباين عالي", + "Enable dark high contrast mode" : "تفعيل وضعية التباين العالي الدّاكن", + "Similar to the high contrast mode, but with dark colours." : "مُماثلة لوضعية التباين العالي، لكن بألوان داكنة", + "Dark theme" : "سمة داكنة", + "Enable dark theme" : "تفعيل السمة الداكنة", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "سمة داكنة تريح عينيك من خلال تقليل اللمعان والسطوع بشكل عام", + "System default theme" : "سمة النظام التلقائية", + "Enable the system default" : "تمكين سمة النظام التلقائية", + "Using the default system appearance." : "إستخدام المظهر التلقائي للنظام", + "Dyslexia font" : "خط خاص بالمصابين بعسر القراءة", + "Enable dyslexia font" : "تفعيل الخط الخاص بالمصابين بعسر القراءة", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة على تفادي الأخطاء لمن يعانون من عسر القراءة.", + "High contrast mode" : "وضع تباين الألوان العالي", + "Enable high contrast mode" : "تفعيل وضع تباين الألوان العالي", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.", + "Light theme" : "سمة فاتحة", + "Enable the default light theme" : "تمكين السمة التلقائية الفاتحة", + "The default light appearance." : "المظهر الفاتح التلقائي.", + "Legal notice" : "ملاحظة قانونية", + "Privacy policy" : "سياسة الخصوصية", + "Adjust the Nextcloud theme" : "تعديل سمة نكست كلاود", + "Name" : "الاسم", + "Web link" : "رابط الويب", + "a safe home for all your data" : "مكان آمن لكل معلوماتك", + "Slogan" : "الشعار", + "Primary color" : "اللون الأساسي", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "يستعمل اللون الأساسي لإبراز بعض العناصر مثل الأزرار الهامة. و قد يتم ضبطه قليلاً اعتماداً على مخطط الألوان الحالي.", + "Legal notice link" : "رابط الإشعار القانوني", + "Privacy policy link" : "رابط سياسة الخصوصية", + "Header logo" : "شعار رأس الصفحة", + "Upload new header logo" : "تحميل شعار رأسية جديد", + "Favicon" : "الأيقونة المفضلة Favicon", + "Upload new favicon" : "تحميل أيقونة Favicon جديدة", + "User settings" : "إعدادات المستخدم", + "Disable user theming" : "إيقاف تحكم المستخدم في تعديل السمات والمظهر", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "على الرغم من أنه يمكنك تحديد وتخصيص الخادوم الخاص بك، فإنه يمكن للمستخدمين تغيير صور خلفيات شاشاتهم وألوانهم. إذا كنت تريد فرض التخصيص الخاص بك ، فيمكنك التبديل إلى هذا.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "السمات تجعل من الممكن بسهولة تخصيص الشكل والمظهر للموقع والتطبيقات التابعة له. سيكون هذا مرئياً لجميع المستخدمين.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "بدلاً من صورة الخلفية، يمكنك أيضًا تكوين لون خلفية عادي. إذا كنت تستخدم صورة خلفية، فإن تغيير هذا اللون سيؤثر على لون أيقونات قائمة التطبيقات.", + "Background color" : "لون الخلفية", + "Upload new logo" : "رفع شعار جديد", + "Logo" : "صورة الشعار", + "Upload new background and login image" : "إرفع صورة جديدة للخلفية و لتسجيل الدخول", + "Background and login image" : "صورة الخلفية و تسجيل الدخول", + "Advanced options" : "الخيارات المتقدمة", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "قم بتثبيت ImageMagick و التي هي امتداد لـ PHP مع دعم صور SVG لإنشاء الرموز المفضلة تلقائيًا بناءً على الشعار واللون اللذيْن تمّ تحميلهما.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "يعد الوصول الشامل أمرًا مهمًا للغاية بالنسبة لنا. نتبع معايير الويب ونتأكد من أن كل شيء قابل للاستخدام أيضًا بدون ماوس؛ ويدعم البرامج المساعدة مثل برامج قراءة الشاشة. نحن نرغب في أن نكون متوافقين مع{linkstart} قواعد تسهيل الوصول لمحتوى الوِب {linkend} الإصدار 2.1 على المستوى AA، مع تيمة التباين العالي حتى في المستوى AA .", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "إذا واجهك أيّ إشكالٍ، فلا تتردد في الإبلاغ عنه على {issuetracker} تطبيقنا لمتابعة الإشكالات {linkend}. وإذا كنت ترغب في المشاركة، فانتقل إلى {designteam} فريق التصميم لدينا {linkend}!", + "Unable to apply the setting." : "يتعذّر تطبيق الإعدادات.", + "Appearance and accessibility settings" : "إعدادات المظهر وسهولة الوصول", + "Misc accessibility options" : "خيارات متفرقة للوصول", + "Enable blur background filter (may increase GPU load)" : "تمكين فلتر تضبيب الخلفية (يمكن أن يتسبب في زيادة العبء على المعالج الرسومي GPU)", + "Customization has been disabled by your administrator" : "التخصيص معطل من قبل المسؤول", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "يستعمل اللون الأساسي لإبراز بعض العناصر مثل الأزرار الهامة. و قد يتم ضبطه قليلا تلبية لمتطلبات سهولة الوصول.", + "Background and color" : "الخلفية و الألوان", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "الخلفية يمكن تعيين صورة لها من مجموعة تلقائية أو صورة مرفوعة خصيصاً أو لون واحد سائد.", + "Keyboard shortcuts" : "اختصارات لوحة المفاتيح", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "في بعض الحالات، يمكن أن تتداخل اختصارات لوحة المفاتيح مع أدوات تسهيل الوصول. للسماح بالتركيز على أداتك بشكل صحيح، يُمكنك تعطيل جميع اختصارات لوحة المفاتيح هنا. سيؤدي هذا أيضًا إلى تعطيل جميع الاختصارات المتاحة في التطبيقات.", + "Disable all keyboard shortcuts" : "إيقاف كل اختصارات لوحة المفاتيح", + "Current selected app: {app}, position {position} of {total}" : "التطبيق المُحدّد حاليّاً: {app}, الموضع {position} من {total}", + "Move up" : "نقلٌ للأعلي", + "Move down" : "نقلٌ للأسفل", + "Select a background from your files" : "إختر خلفية من ملفاتك", + "Select background" : "إختَر الخلفية", + "No background has been selected" : "لم يتم اختيار أي خلفية بعد", + "Custom background" : "خلفية مخصصة", + "Plain background" : "خلفية بلون فقط", + "Default background" : "الخلفية التلقائية", + "Theme selection is enforced" : "تم فرض اختيار السمة", + "Could not set the app order" : "تعذّر تعيين ترتيب التطبيق", + "Could not reset the app order" : "تعذّرت إعادة تعيين ترتيب التطبيق", + "Navigation bar settings" : "إعدادات شريط التنقل", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "يمكنك تهيئة ترتيب التطبيق المستخدم لشريط التنقل. سيكون الإدخال الأول هو التطبيق الافتراضي الذي يتم فتحه بعد تسجيل الدخول أو عند النقر على الشعار.", + "The default app can not be changed because it was configured by the administrator." : "لا يمكن تغيير التطبيق الافتراضي لأنه تم تكوينه بواسطة مسؤول النظام.", + "The app order was changed, to see it in action you have to reload the page." : "ترتيب التطبيق تمّ تغييره. لرؤية أثر التغيير، يتوجب إعادة تحميل الصفحة.", + "Reset default app order" : "إعادة التعيين إلى الترتيب التلقائي للتطبيق", + "Could not set primary color" : "فشل تحديد اللون الأساسي", + "Reset primary color" : "إعادة تعيين اللون الأساسي", + "Could not set global default apps" : "تعذّر تعيين التطبيقات التلقائية العامة", + "Default app" : "التطبيق التلقائي", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "التطبيق التلقائي هو التطبيق الذي يتم فتحه بمجرد الدخول أو بمجرد النقر على الشعار في الصفحة الرئيسية.", + "Use custom default app" : "استخدام تطبيق افتراضي مخصص", + "Global default app" : "التطبيق التلقائي العام", + "Global default apps" : "التطبيقات التلقائية العامة", + "Default app priority" : "أولوية التطبيق الافتراضية", + "If an app is not enabled for a user, the next app with lower priority is used." : "إذا لم يتم تمكين أحد التطبيقات لمستخدم ما، فسيتم استخدام التطبيق التالي ذي الأولوية الأقل.", + "Select a custom color" : "إختر لوناً مُخصّصاً", + "Reset to default" : "اعادة تعيين الافتراضيات", + "Upload" : "تحميل", + "Remove background image" : "إزالة صورة الخلفية", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} توجيهات تسهيل إستعمال محتوى الويب {linkend} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.", + ". Unable to apply the setting." : ". غير قادر على تطبيق الإعداد." +}, +"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/theming/l10n/ar.json b/apps/theming/l10n/ar.json new file mode 100644 index 00000000000..a1c36610926 --- /dev/null +++ b/apps/theming/l10n/ar.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "هذا الاسم أطول مما يجب", + "The given web address is too long" : "هذا العنوان أطول مما يجب", + "The given web address is not a valid URL" : "عنوان الويب هذا ليس عنوان URL صحيح", + "The given legal notice address is too long" : "هذه الملاحظة القانونية أطول مما يجب", + "The given legal notice address is not a valid URL" : "عنوان الملاحظة القانونية هذه ليس عنوان URL صحيح", + "The given privacy policy address is too long" : "عنوان سياسة الخصوصية هذا أطول مما يجب", + "The given privacy policy address is not a valid URL" : "عنوان سياسة الخصوصية هذا ليس عنوان URL صحيح", + "The given slogan is too long" : "هذه الشارة slogan أطول مما يجب", + "The given color is invalid" : "هذا اللون غير صحيح", + "Disable-user-theming should be true or false" : "\"إيقاف سمات المستخدم\" Disable-user-theming يجب أن تكون إمّا صح أو خطأ", + "Saved" : "تم الحفظ", + "Invalid app given" : "التطبيق المُعطى غير صحيح", + "Invalid type for setting \"defaultApp\" given" : "النوع المُعطى للإعدادات \"defaultApp\" غير صحيح", + "Invalid setting key" : "مفتاح الإعدادات غير صحيح", + "The file was uploaded" : "الملف تم رفعه", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم الملف المرفوع قد تجاوز upload_max_filesize الموجودة في ملف php.ini ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم الملف الذي تريد رفعه أعلى مما MAX_FILE_SIZE يسمح به نموذج HTML.", + "The file was only partially uploaded" : "الملف قد رُفع جزءا منه فقط", + "No file was uploaded" : "لم يتم رفع أي ملف", + "Missing a temporary folder" : "المجلد المؤقت غير موجود", + "Could not write file to disk" : "لم يستطع كتابة ملف للقرص", + "A PHP extension stopped the file upload" : "اضافة البي اچ بي PHP اوقفت رفع الملف", + "No file uploaded" : "لم يتم رفع الملف", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "أنت تستخدم الآن سمة مُخصّصة. إعدادات تطبيق السمات يمكن أن تتجاوز مميزات السمة التي تستخدمها.", + "Theming" : "تخصيص القالب", + "Appearance and accessibility" : "المظهر وسهولة الوصول ", + "PHP Imagick module" : "جزئية PHP Imagick ", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "وحدة PHP ـ \"imahick\" غير مُفعّلة بالرغم من تفعيل تطبيق الثيمات theming. حتى يتم توليد الأيقونة الأساسية favicon بشكل صحيح يتوجب تنصيب و تفعيل هذه الوحدة.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "جزئية PHP Imagick في هذا الخادوم لا تدعم خاصية SVG. لتوافق أفضل، يُنصح بتثبيتها", + "Dark theme with high contrast mode" : "سمة داكنة مع وضعية تباين عالي", + "Enable dark high contrast mode" : "تفعيل وضعية التباين العالي الدّاكن", + "Similar to the high contrast mode, but with dark colours." : "مُماثلة لوضعية التباين العالي، لكن بألوان داكنة", + "Dark theme" : "سمة داكنة", + "Enable dark theme" : "تفعيل السمة الداكنة", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "سمة داكنة تريح عينيك من خلال تقليل اللمعان والسطوع بشكل عام", + "System default theme" : "سمة النظام التلقائية", + "Enable the system default" : "تمكين سمة النظام التلقائية", + "Using the default system appearance." : "إستخدام المظهر التلقائي للنظام", + "Dyslexia font" : "خط خاص بالمصابين بعسر القراءة", + "Enable dyslexia font" : "تفعيل الخط الخاص بالمصابين بعسر القراءة", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic خط مجاني مصمم للمساعدة على تفادي الأخطاء لمن يعانون من عسر القراءة.", + "High contrast mode" : "وضع تباين الألوان العالي", + "Enable high contrast mode" : "تفعيل وضع تباين الألوان العالي", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "وضع تباين الألوان العالي يساعدك على التنقل في الموقع بسهولة. الجودة المرئية سوف تقل بينما الوضوح سيزداد.", + "Light theme" : "سمة فاتحة", + "Enable the default light theme" : "تمكين السمة التلقائية الفاتحة", + "The default light appearance." : "المظهر الفاتح التلقائي.", + "Legal notice" : "ملاحظة قانونية", + "Privacy policy" : "سياسة الخصوصية", + "Adjust the Nextcloud theme" : "تعديل سمة نكست كلاود", + "Name" : "الاسم", + "Web link" : "رابط الويب", + "a safe home for all your data" : "مكان آمن لكل معلوماتك", + "Slogan" : "الشعار", + "Primary color" : "اللون الأساسي", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "يستعمل اللون الأساسي لإبراز بعض العناصر مثل الأزرار الهامة. و قد يتم ضبطه قليلاً اعتماداً على مخطط الألوان الحالي.", + "Legal notice link" : "رابط الإشعار القانوني", + "Privacy policy link" : "رابط سياسة الخصوصية", + "Header logo" : "شعار رأس الصفحة", + "Upload new header logo" : "تحميل شعار رأسية جديد", + "Favicon" : "الأيقونة المفضلة Favicon", + "Upload new favicon" : "تحميل أيقونة Favicon جديدة", + "User settings" : "إعدادات المستخدم", + "Disable user theming" : "إيقاف تحكم المستخدم في تعديل السمات والمظهر", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "على الرغم من أنه يمكنك تحديد وتخصيص الخادوم الخاص بك، فإنه يمكن للمستخدمين تغيير صور خلفيات شاشاتهم وألوانهم. إذا كنت تريد فرض التخصيص الخاص بك ، فيمكنك التبديل إلى هذا.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "السمات تجعل من الممكن بسهولة تخصيص الشكل والمظهر للموقع والتطبيقات التابعة له. سيكون هذا مرئياً لجميع المستخدمين.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "بدلاً من صورة الخلفية، يمكنك أيضًا تكوين لون خلفية عادي. إذا كنت تستخدم صورة خلفية، فإن تغيير هذا اللون سيؤثر على لون أيقونات قائمة التطبيقات.", + "Background color" : "لون الخلفية", + "Upload new logo" : "رفع شعار جديد", + "Logo" : "صورة الشعار", + "Upload new background and login image" : "إرفع صورة جديدة للخلفية و لتسجيل الدخول", + "Background and login image" : "صورة الخلفية و تسجيل الدخول", + "Advanced options" : "الخيارات المتقدمة", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "قم بتثبيت ImageMagick و التي هي امتداد لـ PHP مع دعم صور SVG لإنشاء الرموز المفضلة تلقائيًا بناءً على الشعار واللون اللذيْن تمّ تحميلهما.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "يعد الوصول الشامل أمرًا مهمًا للغاية بالنسبة لنا. نتبع معايير الويب ونتأكد من أن كل شيء قابل للاستخدام أيضًا بدون ماوس؛ ويدعم البرامج المساعدة مثل برامج قراءة الشاشة. نحن نرغب في أن نكون متوافقين مع{linkstart} قواعد تسهيل الوصول لمحتوى الوِب {linkend} الإصدار 2.1 على المستوى AA، مع تيمة التباين العالي حتى في المستوى AA .", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "إذا واجهك أيّ إشكالٍ، فلا تتردد في الإبلاغ عنه على {issuetracker} تطبيقنا لمتابعة الإشكالات {linkend}. وإذا كنت ترغب في المشاركة، فانتقل إلى {designteam} فريق التصميم لدينا {linkend}!", + "Unable to apply the setting." : "يتعذّر تطبيق الإعدادات.", + "Appearance and accessibility settings" : "إعدادات المظهر وسهولة الوصول", + "Misc accessibility options" : "خيارات متفرقة للوصول", + "Enable blur background filter (may increase GPU load)" : "تمكين فلتر تضبيب الخلفية (يمكن أن يتسبب في زيادة العبء على المعالج الرسومي GPU)", + "Customization has been disabled by your administrator" : "التخصيص معطل من قبل المسؤول", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "يستعمل اللون الأساسي لإبراز بعض العناصر مثل الأزرار الهامة. و قد يتم ضبطه قليلا تلبية لمتطلبات سهولة الوصول.", + "Background and color" : "الخلفية و الألوان", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "الخلفية يمكن تعيين صورة لها من مجموعة تلقائية أو صورة مرفوعة خصيصاً أو لون واحد سائد.", + "Keyboard shortcuts" : "اختصارات لوحة المفاتيح", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "في بعض الحالات، يمكن أن تتداخل اختصارات لوحة المفاتيح مع أدوات تسهيل الوصول. للسماح بالتركيز على أداتك بشكل صحيح، يُمكنك تعطيل جميع اختصارات لوحة المفاتيح هنا. سيؤدي هذا أيضًا إلى تعطيل جميع الاختصارات المتاحة في التطبيقات.", + "Disable all keyboard shortcuts" : "إيقاف كل اختصارات لوحة المفاتيح", + "Current selected app: {app}, position {position} of {total}" : "التطبيق المُحدّد حاليّاً: {app}, الموضع {position} من {total}", + "Move up" : "نقلٌ للأعلي", + "Move down" : "نقلٌ للأسفل", + "Select a background from your files" : "إختر خلفية من ملفاتك", + "Select background" : "إختَر الخلفية", + "No background has been selected" : "لم يتم اختيار أي خلفية بعد", + "Custom background" : "خلفية مخصصة", + "Plain background" : "خلفية بلون فقط", + "Default background" : "الخلفية التلقائية", + "Theme selection is enforced" : "تم فرض اختيار السمة", + "Could not set the app order" : "تعذّر تعيين ترتيب التطبيق", + "Could not reset the app order" : "تعذّرت إعادة تعيين ترتيب التطبيق", + "Navigation bar settings" : "إعدادات شريط التنقل", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "يمكنك تهيئة ترتيب التطبيق المستخدم لشريط التنقل. سيكون الإدخال الأول هو التطبيق الافتراضي الذي يتم فتحه بعد تسجيل الدخول أو عند النقر على الشعار.", + "The default app can not be changed because it was configured by the administrator." : "لا يمكن تغيير التطبيق الافتراضي لأنه تم تكوينه بواسطة مسؤول النظام.", + "The app order was changed, to see it in action you have to reload the page." : "ترتيب التطبيق تمّ تغييره. لرؤية أثر التغيير، يتوجب إعادة تحميل الصفحة.", + "Reset default app order" : "إعادة التعيين إلى الترتيب التلقائي للتطبيق", + "Could not set primary color" : "فشل تحديد اللون الأساسي", + "Reset primary color" : "إعادة تعيين اللون الأساسي", + "Could not set global default apps" : "تعذّر تعيين التطبيقات التلقائية العامة", + "Default app" : "التطبيق التلقائي", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "التطبيق التلقائي هو التطبيق الذي يتم فتحه بمجرد الدخول أو بمجرد النقر على الشعار في الصفحة الرئيسية.", + "Use custom default app" : "استخدام تطبيق افتراضي مخصص", + "Global default app" : "التطبيق التلقائي العام", + "Global default apps" : "التطبيقات التلقائية العامة", + "Default app priority" : "أولوية التطبيق الافتراضية", + "If an app is not enabled for a user, the next app with lower priority is used." : "إذا لم يتم تمكين أحد التطبيقات لمستخدم ما، فسيتم استخدام التطبيق التالي ذي الأولوية الأقل.", + "Select a custom color" : "إختر لوناً مُخصّصاً", + "Reset to default" : "اعادة تعيين الافتراضيات", + "Upload" : "تحميل", + "Remove background image" : "إزالة صورة الخلفية", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "الوصول الشامل مهم جدا بالنسبة لنا. نحن نتبع معايير ويب صارمة ونتأكد من أن كل شيء يمكن إستعماله حتى دون الحاجة للفأرة أو إلى أي برامج مساعدة مثل برامج قراءة الشاشة. هدفنا أن نكون متوافقين مع {guidelines} توجيهات تسهيل إستعمال محتوى الويب {linkend} 2.1 بمستوى AA، ومتوافقين مع مظهر تباين الألوان العالي بمستوى يصل حتى إلى AAA.", + ". Unable to apply the setting." : ". غير قادر على تطبيق الإعداد." +},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ast.js b/apps/theming/l10n/ast.js new file mode 100644 index 00000000000..34c922f78c1 --- /dev/null +++ b/apps/theming/l10n/ast.js @@ -0,0 +1,110 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "El nome apurríu ye mui llongu", + "The given web address is too long" : "La direición web apurrida ye mui llonga", + "The given web address is not a valid URL" : "La direición web apurrida nun ye una URL válida", + "The given legal notice address is too long" : "La direición apurrida del avisu llegal ye mui llonga", + "The given legal notice address is not a valid URL" : "La direición apurrida del avisu llegal nun ye una URL válida", + "The given privacy policy address is too long" : "La direición apurrida de la política de privacidá ye mui llonga", + "The given privacy policy address is not a valid URL" : "La direición apurrida de la política de privacidá nun ye una URL válida", + "The given slogan is too long" : "L'eslogan apurríu ye mui llongu", + "The given color is invalid" : "El color apurríu ye inválidu", + "Disable-user-theming should be true or false" : "«Disable-user-theming» ha ser «true» o «false»", + "Saved" : "Guardóse", + "Invalid app given" : "Apurrióse una aplicación inválida", + "Invalid type for setting \"defaultApp\" given" : "Apurrióse un tipu inválidu pa la opción «defaultApp»", + "Invalid setting key" : "La clave de la opción ye inválida", + "The file was uploaded" : "Xubióse'l ficheru", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu supera la direutiva «upload_max_filesize» del ficheru php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu supera la direutiva «MAX_FILE_SIZE» que s'especificó nel formulariu HTML", + "The file was only partially uploaded" : "El ficheru xubióse parcialmente", + "No file was uploaded" : "Nun se xubió nengún ficheru", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "Nun se pudo escribir el ficheru nel discu", + "A PHP extension stopped the file upload" : "Una estensión PHP paró la xuba de ficheros", + "No file uploaded" : "Nun se xubió nengún ficheru", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Yá tas usando un estilu personalizáu. Ye posible que se sobrescriba la configuración de l'aplicación «Estilu».", + "Theming" : "Estilu", + "Appearance and accessibility" : "Aspeutu y accesibilidá", + "PHP Imagick module" : "Módulu Imagick de PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El módulu de PHP «imagick» nun ta activáu magar que l'aplicación d'estilos lo ta. Pa que la xeneración de favíconos funcione correutamente, tienes d'instalar y activar esti módulu.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulu de PHP «imagick» d'esta instancia nun ye compatible con SVG. Pa consiguir la mayor compatibilidá, ye aconseyable que instales una versión del módulu compatible.", + "Dark theme with high contrast mode" : "Estilu escuru col mou de contraste altu", + "Enable dark high contrast mode" : "Activar el mou de contraste altu escuru", + "Similar to the high contrast mode, but with dark colours." : "Aseméyase al mou de contraste altu mas con colores escuros.", + "Dark theme" : "Estilu escuru", + "Enable dark theme" : "Activar l'estilu escuru", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un estilu escuru qu'ayuda a los güeyos pente l'amenorgamientu xeneral de la lluminosidá y brillu.", + "System default theme" : "Estilu predetermináu del sistema", + "Enable the system default" : "Activar la configuración predeterminada del sistema", + "Using the default system appearance." : "L'aspeutu de la configuración predeterminada ta n'usu.", + "Dyslexia font" : "Fonte pa persones dislexiques", + "Enable dyslexia font" : "Activa la fonte pa persones dislexiques", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ye una fonte gratuita diseñada p'amenorgar dalgunos de los errores de llectura más comunes que produz la dislexia.", + "High contrast mode" : "Mou de contraste altu", + "Enable high contrast mode" : "Activar el mou de contraste altu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un mou de contraste altu acencella la navegación. La calidá visual va amenorgar mas la claridá visual va aumentar.", + "Light theme" : "Tema claru", + "Enable the default light theme" : "Activar l'estilu claru predetermináu", + "The default light appearance." : "L'aspeutu claru predetermináu.", + "Legal notice" : "Avisu llegal", + "Privacy policy" : "Política de privacidá", + "Adjust the Nextcloud theme" : "Axustar l'estilu de Nextcloud", + "Name" : "Nome", + "Web link" : "Enllaz web", + "a safe home for all your data" : "un llugar seguru pa los datos personales", + "Slogan" : "Eslogan", + "Legal notice link" : "Enllaz del avisu llegal", + "Privacy policy link" : "Enllaz de la política de privacidá", + "Header logo" : "Logotipu de la testera", + "Upload new header logo" : "Xubir un logotipu nuevu pa la testera", + "Favicon" : "Favicon", + "Upload new favicon" : "Xubir un favicon", + "User settings" : "Configuración del usuariu", + "Disable user theming" : "Desactivar l'estilu de los usuarios", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Magar que puedas seleicionar y personalizar la instancia, los usuarios puen camudar los sos fondos y colores. Si quies imponer la to personalización, pues activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los estilos posibiliten personalizar fácilmente l'aspeutu de la instancia y los veceros compatibles. Esta función va ser visible pa tolos usuarios.", + "Upload new logo" : "Xubir un logotipu nuevu", + "Logo" : "Logotipu", + "Upload new background and login image" : "Xubir una imaxe nueva pal fondu y la páxina d'aniciar la sesión", + "Background and login image" : "Imaxe pal fondu y la páxina d'aniciar la sesión", + "Advanced options" : "Opciones avanzaes", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instala la estensión de PHP ImageMagick con compatibilidá pa imáxenes SVG y xenerar favicons basaos nel logotipu xubíu y nos colores", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si atopes dalgún problema, nun duldes n'informar d'él nel {issuetracker}rexistrador de problemes{linkend}. Y si quies andechar, ¡xúnite al {designteam}equipu de diseñu{linkend}!", + "Appearance and accessibility settings" : "Configuración del aspeutu y l'accesibilidá", + "Customization has been disabled by your administrator" : "L'alministración desactivó la personalización", + "Keyboard shortcuts" : "Atayos del tecláu", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En dalgunos casos, los atayos del tecláu pues interfirir coles ferramientes d'accesibilidá. Pa permitir enfocales correutamente, pues desactivar tolos atayos del tecláu equí. Esta aición tamién va desactivar tolos atayos disponibles nes aplicaciones.", + "Disable all keyboard shortcuts" : "Desactivar tolos atayos del tecláu", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleicionada anguaño: {app}, posición {position} de {total}", + "Move up" : "Xubir", + "Move down" : "Baxar", + "Select a background from your files" : "Seleiciona un fondu dende los ficheros", + "Select background" : "Selecionar un fondu", + "No background has been selected" : "Nun se seleicionó nengún fondu", + "Custom background" : "Fondu personalizáu", + "Default background" : "Fondu predetermináu", + "Theme selection is enforced" : "La seleición del estilu ta impuesta", + "Could not set the app order" : "Nun se pudo afitar l'orde de les aplicaciones", + "Could not reset the app order" : "Nun se pudo restaurar l'orde de les aplicaciones", + "Navigation bar settings" : "Configuración de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pues confgurar l'orde de les aplicaciones usaes pa la barra de navegación. La primer entrada va ser l'aplicación predeterminada, ábrese dempués d'aniciar la sesión o cuando calques nel logotipu.", + "The default app can not be changed because it was configured by the administrator." : "Nun se pue camudar l'aplicación predeterminada porque l'alministración configuróla", + "The app order was changed, to see it in action you have to reload the page." : "L'orde de les aplicaciones caducó, pa velu n'aición tienes de volver cargar la páxina.", + "Reset default app order" : "Reaniciar l'orde de les aplicaciones predeterminaes", + "Could not set global default apps" : "Nun se pudieron afitar les aplicaciones predeterminaes globales", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'aplicación predetrrminada ye l'aplicación, por exemplu, que s'abre dempués d'aniciar la sesión o cuando se calca'l logotipu del menú", + "Use custom default app" : "Usar una aplicación predeterminada personalizada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicaciones predeterminaes globales", + "Default app priority" : "Prioridá d'aplicación predeterminada", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación nun ta activada pa un usuariu, úsase l'aplicación siguiente cola prioridá más baxa.", + "Select a custom color" : "Seleicionar un color personalizáu", + "Reset to default" : "Reafitar los valores", + "Upload" : "Xunir", + "Remove background image" : "Quitar la imaxe del fondu", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accesu universal ye mui importante pa nós. Siguimos los estándares web y comprobamos que too se pueda usar tamién ensin el mur y con programes d'asistencia, como los llectores de pantalla. Queremos cumplir les {guidelines}Pautes d'accesibilidá del conteníu web{linkend} 2.1 nel nivel AA y col estilu de contraste altu nel nivel AAA." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/ast.json b/apps/theming/l10n/ast.json new file mode 100644 index 00000000000..501a08173a6 --- /dev/null +++ b/apps/theming/l10n/ast.json @@ -0,0 +1,108 @@ +{ "translations": { + "The given name is too long" : "El nome apurríu ye mui llongu", + "The given web address is too long" : "La direición web apurrida ye mui llonga", + "The given web address is not a valid URL" : "La direición web apurrida nun ye una URL válida", + "The given legal notice address is too long" : "La direición apurrida del avisu llegal ye mui llonga", + "The given legal notice address is not a valid URL" : "La direición apurrida del avisu llegal nun ye una URL válida", + "The given privacy policy address is too long" : "La direición apurrida de la política de privacidá ye mui llonga", + "The given privacy policy address is not a valid URL" : "La direición apurrida de la política de privacidá nun ye una URL válida", + "The given slogan is too long" : "L'eslogan apurríu ye mui llongu", + "The given color is invalid" : "El color apurríu ye inválidu", + "Disable-user-theming should be true or false" : "«Disable-user-theming» ha ser «true» o «false»", + "Saved" : "Guardóse", + "Invalid app given" : "Apurrióse una aplicación inválida", + "Invalid type for setting \"defaultApp\" given" : "Apurrióse un tipu inválidu pa la opción «defaultApp»", + "Invalid setting key" : "La clave de la opción ye inválida", + "The file was uploaded" : "Xubióse'l ficheru", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu supera la direutiva «upload_max_filesize» del ficheru php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu supera la direutiva «MAX_FILE_SIZE» que s'especificó nel formulariu HTML", + "The file was only partially uploaded" : "El ficheru xubióse parcialmente", + "No file was uploaded" : "Nun se xubió nengún ficheru", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "Nun se pudo escribir el ficheru nel discu", + "A PHP extension stopped the file upload" : "Una estensión PHP paró la xuba de ficheros", + "No file uploaded" : "Nun se xubió nengún ficheru", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Yá tas usando un estilu personalizáu. Ye posible que se sobrescriba la configuración de l'aplicación «Estilu».", + "Theming" : "Estilu", + "Appearance and accessibility" : "Aspeutu y accesibilidá", + "PHP Imagick module" : "Módulu Imagick de PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El módulu de PHP «imagick» nun ta activáu magar que l'aplicación d'estilos lo ta. Pa que la xeneración de favíconos funcione correutamente, tienes d'instalar y activar esti módulu.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulu de PHP «imagick» d'esta instancia nun ye compatible con SVG. Pa consiguir la mayor compatibilidá, ye aconseyable que instales una versión del módulu compatible.", + "Dark theme with high contrast mode" : "Estilu escuru col mou de contraste altu", + "Enable dark high contrast mode" : "Activar el mou de contraste altu escuru", + "Similar to the high contrast mode, but with dark colours." : "Aseméyase al mou de contraste altu mas con colores escuros.", + "Dark theme" : "Estilu escuru", + "Enable dark theme" : "Activar l'estilu escuru", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un estilu escuru qu'ayuda a los güeyos pente l'amenorgamientu xeneral de la lluminosidá y brillu.", + "System default theme" : "Estilu predetermináu del sistema", + "Enable the system default" : "Activar la configuración predeterminada del sistema", + "Using the default system appearance." : "L'aspeutu de la configuración predeterminada ta n'usu.", + "Dyslexia font" : "Fonte pa persones dislexiques", + "Enable dyslexia font" : "Activa la fonte pa persones dislexiques", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ye una fonte gratuita diseñada p'amenorgar dalgunos de los errores de llectura más comunes que produz la dislexia.", + "High contrast mode" : "Mou de contraste altu", + "Enable high contrast mode" : "Activar el mou de contraste altu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un mou de contraste altu acencella la navegación. La calidá visual va amenorgar mas la claridá visual va aumentar.", + "Light theme" : "Tema claru", + "Enable the default light theme" : "Activar l'estilu claru predetermináu", + "The default light appearance." : "L'aspeutu claru predetermináu.", + "Legal notice" : "Avisu llegal", + "Privacy policy" : "Política de privacidá", + "Adjust the Nextcloud theme" : "Axustar l'estilu de Nextcloud", + "Name" : "Nome", + "Web link" : "Enllaz web", + "a safe home for all your data" : "un llugar seguru pa los datos personales", + "Slogan" : "Eslogan", + "Legal notice link" : "Enllaz del avisu llegal", + "Privacy policy link" : "Enllaz de la política de privacidá", + "Header logo" : "Logotipu de la testera", + "Upload new header logo" : "Xubir un logotipu nuevu pa la testera", + "Favicon" : "Favicon", + "Upload new favicon" : "Xubir un favicon", + "User settings" : "Configuración del usuariu", + "Disable user theming" : "Desactivar l'estilu de los usuarios", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Magar que puedas seleicionar y personalizar la instancia, los usuarios puen camudar los sos fondos y colores. Si quies imponer la to personalización, pues activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los estilos posibiliten personalizar fácilmente l'aspeutu de la instancia y los veceros compatibles. Esta función va ser visible pa tolos usuarios.", + "Upload new logo" : "Xubir un logotipu nuevu", + "Logo" : "Logotipu", + "Upload new background and login image" : "Xubir una imaxe nueva pal fondu y la páxina d'aniciar la sesión", + "Background and login image" : "Imaxe pal fondu y la páxina d'aniciar la sesión", + "Advanced options" : "Opciones avanzaes", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instala la estensión de PHP ImageMagick con compatibilidá pa imáxenes SVG y xenerar favicons basaos nel logotipu xubíu y nos colores", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si atopes dalgún problema, nun duldes n'informar d'él nel {issuetracker}rexistrador de problemes{linkend}. Y si quies andechar, ¡xúnite al {designteam}equipu de diseñu{linkend}!", + "Appearance and accessibility settings" : "Configuración del aspeutu y l'accesibilidá", + "Customization has been disabled by your administrator" : "L'alministración desactivó la personalización", + "Keyboard shortcuts" : "Atayos del tecláu", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En dalgunos casos, los atayos del tecláu pues interfirir coles ferramientes d'accesibilidá. Pa permitir enfocales correutamente, pues desactivar tolos atayos del tecláu equí. Esta aición tamién va desactivar tolos atayos disponibles nes aplicaciones.", + "Disable all keyboard shortcuts" : "Desactivar tolos atayos del tecláu", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleicionada anguaño: {app}, posición {position} de {total}", + "Move up" : "Xubir", + "Move down" : "Baxar", + "Select a background from your files" : "Seleiciona un fondu dende los ficheros", + "Select background" : "Selecionar un fondu", + "No background has been selected" : "Nun se seleicionó nengún fondu", + "Custom background" : "Fondu personalizáu", + "Default background" : "Fondu predetermináu", + "Theme selection is enforced" : "La seleición del estilu ta impuesta", + "Could not set the app order" : "Nun se pudo afitar l'orde de les aplicaciones", + "Could not reset the app order" : "Nun se pudo restaurar l'orde de les aplicaciones", + "Navigation bar settings" : "Configuración de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pues confgurar l'orde de les aplicaciones usaes pa la barra de navegación. La primer entrada va ser l'aplicación predeterminada, ábrese dempués d'aniciar la sesión o cuando calques nel logotipu.", + "The default app can not be changed because it was configured by the administrator." : "Nun se pue camudar l'aplicación predeterminada porque l'alministración configuróla", + "The app order was changed, to see it in action you have to reload the page." : "L'orde de les aplicaciones caducó, pa velu n'aición tienes de volver cargar la páxina.", + "Reset default app order" : "Reaniciar l'orde de les aplicaciones predeterminaes", + "Could not set global default apps" : "Nun se pudieron afitar les aplicaciones predeterminaes globales", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'aplicación predetrrminada ye l'aplicación, por exemplu, que s'abre dempués d'aniciar la sesión o cuando se calca'l logotipu del menú", + "Use custom default app" : "Usar una aplicación predeterminada personalizada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicaciones predeterminaes globales", + "Default app priority" : "Prioridá d'aplicación predeterminada", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación nun ta activada pa un usuariu, úsase l'aplicación siguiente cola prioridá más baxa.", + "Select a custom color" : "Seleicionar un color personalizáu", + "Reset to default" : "Reafitar los valores", + "Upload" : "Xunir", + "Remove background image" : "Quitar la imaxe del fondu", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accesu universal ye mui importante pa nós. Siguimos los estándares web y comprobamos que too se pueda usar tamién ensin el mur y con programes d'asistencia, como los llectores de pantalla. Queremos cumplir les {guidelines}Pautes d'accesibilidá del conteníu web{linkend} 2.1 nel nivel AA y col estilu de contraste altu nel nivel AAA." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/bg.js b/apps/theming/l10n/bg.js new file mode 100644 index 00000000000..abf27362f89 --- /dev/null +++ b/apps/theming/l10n/bg.js @@ -0,0 +1,87 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Името е прекалено дълго", + "The given web address is too long" : "Въведеният уеб адрес е твърде дълъг", + "The given web address is not a valid URL" : "Въведеният уеб адрес не е валиден URL адрес", + "The given legal notice address is too long" : "Въведеният адрес за юридическо уведомление е твърде дълъг", + "The given legal notice address is not a valid URL" : "Въведеният адрес за юридическо уведомление не е валиден URL адрес", + "The given privacy policy address is too long" : "Въведеният адрес на политиката за поверителност е твърде дълъг", + "The given privacy policy address is not a valid URL" : "Въведеният адрес на политиката за поверителност не е валиден URL адрес", + "The given slogan is too long" : "Избраният лозунг е твърде дълъг", + "The given color is invalid" : "Избраният цвят е невалиден", + "Disable-user-theming should be true or false" : "Опцията Деактивиране - на - тематични - настройки, би трябвало да е вярна или невярна", + "Saved" : "Запазено", + "The file was uploaded" : "Файлът е качен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава директивата upload_max_filesize в php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.", + "The file was only partially uploaded" : "Файлът е качен частично", + "No file was uploaded" : "Нито един файл не е качен", + "Missing a temporary folder" : "Липсва временна папка", + "Could not write file to disk" : " Файлът не можа да бъде записан на диск", + "A PHP extension stopped the file upload" : "PHP разширение спря качването на файла", + "No file uploaded" : "Няма качен файл", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Вече използвате персонализирана тема. Настройките на приложението за теми могат да бъдат презаписани от това.", + "Theming" : "Теми", + "Appearance and accessibility" : "Изглед и достъпност", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP модулът \"imagick\" не е активиран, въпреки че приложението за теми е активирано. За да работи правилно генерирането на аватари тип favicon, трябва да инсталирате и активирате този модул.", + "Dark theme with high contrast mode" : "Тъмна тема с режим на висок контраст", + "Enable dark high contrast mode" : "Активиране на тъмен режим с висок контраст", + "Similar to the high contrast mode, but with dark colours." : "Подобно на режима с висок контраст, но с тъмни цветове.", + "Dark theme" : "Tъмна Tема", + "Enable dark theme" : "Активиране на тъмна тема", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Тъмна тема, която да улесни очите ви, като намали общата осветеност и яркост.", + "System default theme" : "Системна тема по подразбиране", + "Enable the system default" : "Активиране на системата по подразбиране", + "Using the default system appearance." : "Използване на изглед на системата по подразбиране.", + "Dyslexia font" : "Шрифт за дислексия", + "Enable dyslexia font" : "Активирай шрифт за дислексия", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е безплатен шрифт, предназначен за смекчаване на някои от често срещаните грешки при четенето, причинени от дислексия.", + "High contrast mode" : "Висок контраст", + "Enable high contrast mode" : "Активиране на режим с висок контраст", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим с висок контраст за улесняване на навигацията ви. Визуалното качество ще бъде намалено, но яснотата ще се увеличи.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Активиране на светлата тема по подразбиране", + "The default light appearance." : "Светъл изглед по подразбиране.", + "Legal notice" : "Правна информация", + "Privacy policy" : "Политика за поверителност", + "Adjust the Nextcloud theme" : "Коригиране на темата на Nextcloud", + "Name" : "Име", + "Web link" : "URL", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "Slogan" : "Лозунг", + "Legal notice link" : "Връзка за правна информация", + "Privacy policy link" : "Връзка към политиката за поверителност", + "Header logo" : "Главно лого", + "Upload new header logo" : "Качване на ново лого на заглавката", + "Favicon" : "Фавиконка", + "Upload new favicon" : "Качване на нов фавикон", + "User settings" : "Потребителски настройки", + "Disable user theming" : "Деактивиране на тематичните настройки на потребителите", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Въпреки че можете да изберете и персонализирате вашият екземпляр, потребителите могат да променят своя фон и цветове. Ако искате да наложите персонализирането си, можете да включите тази опция.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Чрез темите можете бързо и лесно за персонализирате вида на Nextcloud. Промените ще бъдат видими за всички потребители.", + "Upload new logo" : "Качване на ново лого", + "Logo" : "Лого", + "Upload new background and login image" : "Качване на нов фон и изображение за вход", + "Background and login image" : "Изображение за фон и вход", + "Advanced options" : "Допълнителни опции", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирайте разширението Imagemagick PHP с поддръжка за SVG изображения, за да генерирате автоматично фавикони въз основа на каченото лого и цвят.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ако откриете някакви проблеми, не се колебайте да ги съобщите на {issuetracker}, нашият тракер на проблеми {linkend}. И ако искате да се включите, елате да се присъедините {designteam} към нашия дизайнерски екип {linkend}!", + "Customization has been disabled by your administrator" : "Възможността за персонализация е била деактивирана от вашия администратор", + "Keyboard shortcuts" : "Бързи клавиши", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "В някои случаи бързите клавишни комбинации могат да пречат на инструментите за достъпност. За да се позволи правилно фокусиране върху инструмента, можете да деактивирате всички клавишни комбинации тук. Това ще деактивира и всички налични преки пътища в приложенията.", + "Disable all keyboard shortcuts" : "Деактивиране на всички бързи клавишни комбинации", + "Move up" : "Преместване нагоре", + "Move down" : "Преместване надолу", + "Select a background from your files" : "Избор на фон от вашите файлове", + "Custom background" : "Персонализиран фон", + "Plain background" : "Обикновен фон", + "Default background" : "Фон по подразбиране", + "Theme selection is enforced" : "Изборът на тема е приложен", + "Select a custom color" : "Избор на персонализиран цвят", + "Reset to default" : "Настройки по подразбиране", + "Upload" : "Качване", + "Remove background image" : "Премахни фоновото изображение", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универсалният достъп е много важен за нас. Следваме уеб стандартите и проверяваме, за да направим всичко използваемо и без мишка, и помощен софтуер, като екранни четци. Ние се стремим да бъдем съобразени с {guidelines}Насоки за достъпност на уеб съдържанието {linkend} 2.1 на ниво АА, с темата за висок контраст дори на ниво AAA." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/bg.json b/apps/theming/l10n/bg.json new file mode 100644 index 00000000000..d9b981ce49f --- /dev/null +++ b/apps/theming/l10n/bg.json @@ -0,0 +1,85 @@ +{ "translations": { + "The given name is too long" : "Името е прекалено дълго", + "The given web address is too long" : "Въведеният уеб адрес е твърде дълъг", + "The given web address is not a valid URL" : "Въведеният уеб адрес не е валиден URL адрес", + "The given legal notice address is too long" : "Въведеният адрес за юридическо уведомление е твърде дълъг", + "The given legal notice address is not a valid URL" : "Въведеният адрес за юридическо уведомление не е валиден URL адрес", + "The given privacy policy address is too long" : "Въведеният адрес на политиката за поверителност е твърде дълъг", + "The given privacy policy address is not a valid URL" : "Въведеният адрес на политиката за поверителност не е валиден URL адрес", + "The given slogan is too long" : "Избраният лозунг е твърде дълъг", + "The given color is invalid" : "Избраният цвят е невалиден", + "Disable-user-theming should be true or false" : "Опцията Деактивиране - на - тематични - настройки, би трябвало да е вярна или невярна", + "Saved" : "Запазено", + "The file was uploaded" : "Файлът е качен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размерът на каченият файл надвишава директивата upload_max_filesize в php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.", + "The file was only partially uploaded" : "Файлът е качен частично", + "No file was uploaded" : "Нито един файл не е качен", + "Missing a temporary folder" : "Липсва временна папка", + "Could not write file to disk" : " Файлът не можа да бъде записан на диск", + "A PHP extension stopped the file upload" : "PHP разширение спря качването на файла", + "No file uploaded" : "Няма качен файл", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Вече използвате персонализирана тема. Настройките на приложението за теми могат да бъдат презаписани от това.", + "Theming" : "Теми", + "Appearance and accessibility" : "Изглед и достъпност", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP модулът \"imagick\" не е активиран, въпреки че приложението за теми е активирано. За да работи правилно генерирането на аватари тип favicon, трябва да инсталирате и активирате този модул.", + "Dark theme with high contrast mode" : "Тъмна тема с режим на висок контраст", + "Enable dark high contrast mode" : "Активиране на тъмен режим с висок контраст", + "Similar to the high contrast mode, but with dark colours." : "Подобно на режима с висок контраст, но с тъмни цветове.", + "Dark theme" : "Tъмна Tема", + "Enable dark theme" : "Активиране на тъмна тема", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Тъмна тема, която да улесни очите ви, като намали общата осветеност и яркост.", + "System default theme" : "Системна тема по подразбиране", + "Enable the system default" : "Активиране на системата по подразбиране", + "Using the default system appearance." : "Използване на изглед на системата по подразбиране.", + "Dyslexia font" : "Шрифт за дислексия", + "Enable dyslexia font" : "Активирай шрифт за дислексия", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е безплатен шрифт, предназначен за смекчаване на някои от често срещаните грешки при четенето, причинени от дислексия.", + "High contrast mode" : "Висок контраст", + "Enable high contrast mode" : "Активиране на режим с висок контраст", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим с висок контраст за улесняване на навигацията ви. Визуалното качество ще бъде намалено, но яснотата ще се увеличи.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Активиране на светлата тема по подразбиране", + "The default light appearance." : "Светъл изглед по подразбиране.", + "Legal notice" : "Правна информация", + "Privacy policy" : "Политика за поверителност", + "Adjust the Nextcloud theme" : "Коригиране на темата на Nextcloud", + "Name" : "Име", + "Web link" : "URL", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "Slogan" : "Лозунг", + "Legal notice link" : "Връзка за правна информация", + "Privacy policy link" : "Връзка към политиката за поверителност", + "Header logo" : "Главно лого", + "Upload new header logo" : "Качване на ново лого на заглавката", + "Favicon" : "Фавиконка", + "Upload new favicon" : "Качване на нов фавикон", + "User settings" : "Потребителски настройки", + "Disable user theming" : "Деактивиране на тематичните настройки на потребителите", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Въпреки че можете да изберете и персонализирате вашият екземпляр, потребителите могат да променят своя фон и цветове. Ако искате да наложите персонализирането си, можете да включите тази опция.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Чрез темите можете бързо и лесно за персонализирате вида на Nextcloud. Промените ще бъдат видими за всички потребители.", + "Upload new logo" : "Качване на ново лого", + "Logo" : "Лого", + "Upload new background and login image" : "Качване на нов фон и изображение за вход", + "Background and login image" : "Изображение за фон и вход", + "Advanced options" : "Допълнителни опции", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирайте разширението Imagemagick PHP с поддръжка за SVG изображения, за да генерирате автоматично фавикони въз основа на каченото лого и цвят.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ако откриете някакви проблеми, не се колебайте да ги съобщите на {issuetracker}, нашият тракер на проблеми {linkend}. И ако искате да се включите, елате да се присъедините {designteam} към нашия дизайнерски екип {linkend}!", + "Customization has been disabled by your administrator" : "Възможността за персонализация е била деактивирана от вашия администратор", + "Keyboard shortcuts" : "Бързи клавиши", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "В някои случаи бързите клавишни комбинации могат да пречат на инструментите за достъпност. За да се позволи правилно фокусиране върху инструмента, можете да деактивирате всички клавишни комбинации тук. Това ще деактивира и всички налични преки пътища в приложенията.", + "Disable all keyboard shortcuts" : "Деактивиране на всички бързи клавишни комбинации", + "Move up" : "Преместване нагоре", + "Move down" : "Преместване надолу", + "Select a background from your files" : "Избор на фон от вашите файлове", + "Custom background" : "Персонализиран фон", + "Plain background" : "Обикновен фон", + "Default background" : "Фон по подразбиране", + "Theme selection is enforced" : "Изборът на тема е приложен", + "Select a custom color" : "Избор на персонализиран цвят", + "Reset to default" : "Настройки по подразбиране", + "Upload" : "Качване", + "Remove background image" : "Премахни фоновото изображение", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универсалният достъп е много важен за нас. Следваме уеб стандартите и проверяваме, за да направим всичко използваемо и без мишка, и помощен софтуер, като екранни четци. Ние се стремим да бъдем съобразени с {guidelines}Насоки за достъпност на уеб съдържанието {linkend} 2.1 на ниво АА, с темата за висок контраст дори на ниво AAA." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ca.js b/apps/theming/l10n/ca.js new file mode 100644 index 00000000000..208be5cd13b --- /dev/null +++ b/apps/theming/l10n/ca.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "El nom proporcionat és massa llarg", + "The given web address is too long" : "L'adreça web proporcionada és massa llarga", + "The given web address is not a valid URL" : "L'adreça web proporcionada no és un URL vàlid", + "The given legal notice address is too long" : "L'adreça d'avís legal proporcionada és massa llarga", + "The given legal notice address is not a valid URL" : "L'adreça d'avís legal proporcionada no és un URL vàlid", + "The given privacy policy address is too long" : "L'adreça de política de privadesa és massa llarga", + "The given privacy policy address is not a valid URL" : "L'adreça de la política de privadesa proporcionada no és un URL vàlid", + "The given slogan is too long" : "L'eslògan proporcionat és massa llarg", + "The given color is invalid" : "El color proporcionat no és vàlid", + "Disable-user-theming should be true or false" : "Disable-user-theming ha de ser «true» o «false»", + "Saved" : "S'ha desat", + "Invalid app given" : "S'ha indicat una aplicació no vàlida", + "Invalid type for setting \"defaultApp\" given" : "S'ha indicat un tipus no vàlid per al paràmetre «defaultApp»", + "Invalid setting key" : "La clau de paràmetre no és vàlida", + "The file was uploaded" : "S'ha pujat el fitxer", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer pujat supera la directiva upload_max_filesize del fitxer php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer pujat supera la directiva MAX_FILE_SIZE especificada en el formulari HTML", + "The file was only partially uploaded" : "El fitxer només s'ha pujat parcialment", + "No file was uploaded" : "No s'ha pujat cap fitxer", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No s’ha pogut escriure el fitxer en el disc", + "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer", + "No file uploaded" : "No s'ha pujat cap fitxer", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ja utilitzeu un tema personalitzat. És possible que aquest tema substitueixi els paràmetres de l'aplicació Aparença.", + "Theming" : "Aparença", + "Appearance and accessibility" : "Aparença i accessibilitat", + "PHP Imagick module" : "Mòdul Imagick del PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El mòdul del PHP «imagick» no està habilitat però l'aplicació Temes sí. Perquè la generació d'icones de lloc funcioni correctament, cal instal·lar i habilitar aquest mòdul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El mòdul «imagick» del PHP d'aquesta instància no és compatible amb SVG. Per a millorar la compatibilitat, es recomana instal·lar-lo.", + "Dark theme with high contrast mode" : "Tema fosc amb mode de contrast alt", + "Enable dark high contrast mode" : "Habilita el mode fosc de contrast alt", + "Similar to the high contrast mode, but with dark colours." : "Similar al mode de contrast alt, però amb colors foscos.", + "Dark theme" : "Tema fosc", + "Enable dark theme" : "Habilita el tema fosc", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema fosc que alleuja els ulls reduint la lluminositat i la brillantor generals.", + "System default theme" : "Tema per defecte del sistema", + "Enable the system default" : "Habilita el tema per defecte del sistema", + "Using the default system appearance." : "S'està utilitzant l'aparença per defecte del sistema.", + "Dyslexia font" : "Lletra per a la dislèxia", + "Enable dyslexia font" : "Habilita la lletra per a la dislèxia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic és una lletra gratuïta dissenyada per a mitigar alguns dels errors de lectura habituals causats per la dislèxia.", + "High contrast mode" : "Mode de contrast alt", + "Enable high contrast mode" : "Habilita el mode de contrast alt", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mode de contrast alt per a facilitar la navegació. La qualitat visual es reduirà, però s'incrementarà la claredat.", + "Light theme" : "Tema clar", + "Enable the default light theme" : "Habilita el tema clar per defecte", + "The default light appearance." : "Aparença clara per defecte.", + "Legal notice" : "Avís legal", + "Privacy policy" : "Política de privadesa", + "Adjust the Nextcloud theme" : "Ajusteu el tema del Nextcloud", + "Name" : "Nom", + "Web link" : "Enllaç web", + "a safe home for all your data" : "un lloc segur per a totes les vostres dades", + "Slogan" : "Eslògan", + "Primary color" : "Color primari", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primari s'utilitza per ressaltar elements com els botons importants. Pot ser que s'ajusti lleugerament en funció de l'esquema de color actual.", + "Legal notice link" : "Enllaç a l'avís legal", + "Privacy policy link" : "Enllaç a la política de privadesa", + "Header logo" : "Logotip de capçalera", + "Upload new header logo" : "Puja un logotip de capçalera nou", + "Favicon" : "Icona de web", + "Upload new favicon" : "Puja una icona de web nova", + "User settings" : "Paràmetres de l'usuari", + "Disable user theming" : "Inhabilita els temes d'usuari", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Tot i que podeu seleccionar i personalitzar la instància, els usuaris poden canviar el fons i els colors. Si voleu forçar la vostra personalització, podeu activar-ho.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Els temes us permeten personalitzar fàcilment l'aspecte de la instància i dels clients compatibles. Serà visible per a tots els usuaris.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En lloc d'una imatge de fons, també podeu configurar un color de fons normal. Si utilitzeu una imatge de fons, canviar aquest color influirà en el color de les icones del menú de l'aplicació.", + "Background color" : "Color de fons", + "Upload new logo" : "Puja un logotip nou", + "Logo" : "Logotip", + "Upload new background and login image" : "Puja una imatge de fons i inici de sessió nova", + "Background and login image" : "Imatge de fons i d'inici de sessió", + "Advanced options" : "Paràmetres avançats", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instal·leu l'extensió del PHP d'ImageMagick compatible amb imatges SVG per a generar automàticament icones de web a partir del logotip i del color pujats.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui utilitzar també sense ratolí i programari d'assistència com ara lectors de pantalla. Pretenem complir les {linkstart}Directrius d'accessibilitat de contingut web{linkend} 2.1 a nivell AA, amb el tema d'alt contrast fins i tot a nivell AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si trobeu cap problema, no dubteu a informar-ne en el {issuetracker}nostre seguiment de problemes{linkend}. A més, si voleu participar, uniu-vos al {designteam}nostre equip de disseny{linkend}!", + "Unable to apply the setting." : "No es pot aplicar el paràmetre.", + "Appearance and accessibility settings" : "Paràmetres d'aparença i accessibilitat", + "Misc accessibility options" : "Diverses opcions d'accessibilitat", + "Enable blur background filter (may increase GPU load)" : "Habilita el filtre de fons borrós (pot augmentar la càrrega de la GPU)", + "Customization has been disabled by your administrator" : "L'administrador ha inhabilitat la personalització", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Estableix un color primari per ressaltar els elements importants. El color utilitzat per a elements com els botons primaris pot variar una mica a mesura que s'ajusta per complir els requisits d'accessibilitat.", + "Background and color" : "Fons i color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fons es pot configurar amb una imatge del conjunt per defecte, una imatge personalitzada carregada o un color normal.", + "Keyboard shortcuts" : "Dreceres de teclat", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En alguns casos, les dreceres de teclat poden interferir amb les eines d'accessibilitat. Per a permetre centrar-vos correctament en la vostra eina, podeu inhabilitar totes les dreceres de teclat aquí. Això també inhabilitarà totes les dreceres disponibles en les aplicacions.", + "Disable all keyboard shortcuts" : "Inhabilita totes les dreceres de teclat", + "Current selected app: {app}, position {position} of {total}" : "Aplicació seleccionada actualment: {app}, posició {position}/{total}", + "Move up" : "Mou amunt", + "Move down" : "Mou avall", + "Select a background from your files" : "Seleccioneu un fons dels fitxers", + "Select background" : "Selecciona un fons", + "No background has been selected" : "No s'ha seleccionat cap fons", + "Custom background" : "Fons personalitzat", + "Plain background" : "Fons senzill", + "Default background" : "Fons per defecte", + "Theme selection is enforced" : "Es força la selecció de tema", + "Could not set the app order" : "No s'ha pogut definir l'ordre de les aplicacions", + "Could not reset the app order" : "No s'ha pogut reinicialitzar l'ordre de les aplicacions", + "Navigation bar settings" : "Paràmetres de la barra de navegació", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Podeu configurar l'ordre de les aplicacions en la barra de navegació. La primera entrada serà l'aplicació per defecte, que s'obrirà després d'iniciar la sessió o en fer clic en el logotip.", + "The default app can not be changed because it was configured by the administrator." : "No es pot canviar l'aplicació per defecte perquè l'ha configurat l'administrador.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordre de les aplicacions ha canviat. Per a veure els canvis, cal que torneu a carregar la pàgina.", + "Reset default app order" : "Reinicialitza l'ordre de les aplicacions per defecte", + "Could not set primary color" : "No s'ha pogut establir el color primari", + "Reset primary color" : "Restableix el color primari", + "Could not set global default apps" : "No s'han pogut definir les aplicacions per defecte globals", + "Default app" : "Aplicació per defecte", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'aplicació per defecte és l'aplicació que s'obre després d'iniciar la sessió o quan feu clic en el logotip del menú.", + "Use custom default app" : "Utilitza una aplicació per defecte personalitzada", + "Global default app" : "Aplicació per defecte global", + "Global default apps" : "Aplicacions per defecte globals", + "Default app priority" : "Prioritat de l'aplicació per defecte", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si un usuari no té habilitada una aplicació, s'utilitza l'aplicació següent amb una prioritat inferior.", + "Select a custom color" : "Selecciona un color personalitzat", + "Reset to default" : "Reinicialitza els valors per defecte", + "Upload" : "Puja", + "Remove background image" : "Suprimeix la imatge de fons", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui utilitzar també sense el ratolí i amb programes d'assistència, com ara els lectors de pantalla. Volem complir les {guidelines}Pautes d'accessibilitat del contingut web{linkend} 2.1 a nivell AA i amb el tema de contrast alt fins i tot a nivell AAA.", + ". Unable to apply the setting." : ". No es pot aplicar el paràmetre." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/ca.json b/apps/theming/l10n/ca.json new file mode 100644 index 00000000000..795adcd8e68 --- /dev/null +++ b/apps/theming/l10n/ca.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "El nom proporcionat és massa llarg", + "The given web address is too long" : "L'adreça web proporcionada és massa llarga", + "The given web address is not a valid URL" : "L'adreça web proporcionada no és un URL vàlid", + "The given legal notice address is too long" : "L'adreça d'avís legal proporcionada és massa llarga", + "The given legal notice address is not a valid URL" : "L'adreça d'avís legal proporcionada no és un URL vàlid", + "The given privacy policy address is too long" : "L'adreça de política de privadesa és massa llarga", + "The given privacy policy address is not a valid URL" : "L'adreça de la política de privadesa proporcionada no és un URL vàlid", + "The given slogan is too long" : "L'eslògan proporcionat és massa llarg", + "The given color is invalid" : "El color proporcionat no és vàlid", + "Disable-user-theming should be true or false" : "Disable-user-theming ha de ser «true» o «false»", + "Saved" : "S'ha desat", + "Invalid app given" : "S'ha indicat una aplicació no vàlida", + "Invalid type for setting \"defaultApp\" given" : "S'ha indicat un tipus no vàlid per al paràmetre «defaultApp»", + "Invalid setting key" : "La clau de paràmetre no és vàlida", + "The file was uploaded" : "S'ha pujat el fitxer", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El fitxer pujat supera la directiva upload_max_filesize del fitxer php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer pujat supera la directiva MAX_FILE_SIZE especificada en el formulari HTML", + "The file was only partially uploaded" : "El fitxer només s'ha pujat parcialment", + "No file was uploaded" : "No s'ha pujat cap fitxer", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No s’ha pogut escriure el fitxer en el disc", + "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer", + "No file uploaded" : "No s'ha pujat cap fitxer", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ja utilitzeu un tema personalitzat. És possible que aquest tema substitueixi els paràmetres de l'aplicació Aparença.", + "Theming" : "Aparença", + "Appearance and accessibility" : "Aparença i accessibilitat", + "PHP Imagick module" : "Mòdul Imagick del PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El mòdul del PHP «imagick» no està habilitat però l'aplicació Temes sí. Perquè la generació d'icones de lloc funcioni correctament, cal instal·lar i habilitar aquest mòdul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El mòdul «imagick» del PHP d'aquesta instància no és compatible amb SVG. Per a millorar la compatibilitat, es recomana instal·lar-lo.", + "Dark theme with high contrast mode" : "Tema fosc amb mode de contrast alt", + "Enable dark high contrast mode" : "Habilita el mode fosc de contrast alt", + "Similar to the high contrast mode, but with dark colours." : "Similar al mode de contrast alt, però amb colors foscos.", + "Dark theme" : "Tema fosc", + "Enable dark theme" : "Habilita el tema fosc", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema fosc que alleuja els ulls reduint la lluminositat i la brillantor generals.", + "System default theme" : "Tema per defecte del sistema", + "Enable the system default" : "Habilita el tema per defecte del sistema", + "Using the default system appearance." : "S'està utilitzant l'aparença per defecte del sistema.", + "Dyslexia font" : "Lletra per a la dislèxia", + "Enable dyslexia font" : "Habilita la lletra per a la dislèxia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic és una lletra gratuïta dissenyada per a mitigar alguns dels errors de lectura habituals causats per la dislèxia.", + "High contrast mode" : "Mode de contrast alt", + "Enable high contrast mode" : "Habilita el mode de contrast alt", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mode de contrast alt per a facilitar la navegació. La qualitat visual es reduirà, però s'incrementarà la claredat.", + "Light theme" : "Tema clar", + "Enable the default light theme" : "Habilita el tema clar per defecte", + "The default light appearance." : "Aparença clara per defecte.", + "Legal notice" : "Avís legal", + "Privacy policy" : "Política de privadesa", + "Adjust the Nextcloud theme" : "Ajusteu el tema del Nextcloud", + "Name" : "Nom", + "Web link" : "Enllaç web", + "a safe home for all your data" : "un lloc segur per a totes les vostres dades", + "Slogan" : "Eslògan", + "Primary color" : "Color primari", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primari s'utilitza per ressaltar elements com els botons importants. Pot ser que s'ajusti lleugerament en funció de l'esquema de color actual.", + "Legal notice link" : "Enllaç a l'avís legal", + "Privacy policy link" : "Enllaç a la política de privadesa", + "Header logo" : "Logotip de capçalera", + "Upload new header logo" : "Puja un logotip de capçalera nou", + "Favicon" : "Icona de web", + "Upload new favicon" : "Puja una icona de web nova", + "User settings" : "Paràmetres de l'usuari", + "Disable user theming" : "Inhabilita els temes d'usuari", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Tot i que podeu seleccionar i personalitzar la instància, els usuaris poden canviar el fons i els colors. Si voleu forçar la vostra personalització, podeu activar-ho.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Els temes us permeten personalitzar fàcilment l'aspecte de la instància i dels clients compatibles. Serà visible per a tots els usuaris.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En lloc d'una imatge de fons, també podeu configurar un color de fons normal. Si utilitzeu una imatge de fons, canviar aquest color influirà en el color de les icones del menú de l'aplicació.", + "Background color" : "Color de fons", + "Upload new logo" : "Puja un logotip nou", + "Logo" : "Logotip", + "Upload new background and login image" : "Puja una imatge de fons i inici de sessió nova", + "Background and login image" : "Imatge de fons i d'inici de sessió", + "Advanced options" : "Paràmetres avançats", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instal·leu l'extensió del PHP d'ImageMagick compatible amb imatges SVG per a generar automàticament icones de web a partir del logotip i del color pujats.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui utilitzar també sense ratolí i programari d'assistència com ara lectors de pantalla. Pretenem complir les {linkstart}Directrius d'accessibilitat de contingut web{linkend} 2.1 a nivell AA, amb el tema d'alt contrast fins i tot a nivell AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si trobeu cap problema, no dubteu a informar-ne en el {issuetracker}nostre seguiment de problemes{linkend}. A més, si voleu participar, uniu-vos al {designteam}nostre equip de disseny{linkend}!", + "Unable to apply the setting." : "No es pot aplicar el paràmetre.", + "Appearance and accessibility settings" : "Paràmetres d'aparença i accessibilitat", + "Misc accessibility options" : "Diverses opcions d'accessibilitat", + "Enable blur background filter (may increase GPU load)" : "Habilita el filtre de fons borrós (pot augmentar la càrrega de la GPU)", + "Customization has been disabled by your administrator" : "L'administrador ha inhabilitat la personalització", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Estableix un color primari per ressaltar els elements importants. El color utilitzat per a elements com els botons primaris pot variar una mica a mesura que s'ajusta per complir els requisits d'accessibilitat.", + "Background and color" : "Fons i color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fons es pot configurar amb una imatge del conjunt per defecte, una imatge personalitzada carregada o un color normal.", + "Keyboard shortcuts" : "Dreceres de teclat", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En alguns casos, les dreceres de teclat poden interferir amb les eines d'accessibilitat. Per a permetre centrar-vos correctament en la vostra eina, podeu inhabilitar totes les dreceres de teclat aquí. Això també inhabilitarà totes les dreceres disponibles en les aplicacions.", + "Disable all keyboard shortcuts" : "Inhabilita totes les dreceres de teclat", + "Current selected app: {app}, position {position} of {total}" : "Aplicació seleccionada actualment: {app}, posició {position}/{total}", + "Move up" : "Mou amunt", + "Move down" : "Mou avall", + "Select a background from your files" : "Seleccioneu un fons dels fitxers", + "Select background" : "Selecciona un fons", + "No background has been selected" : "No s'ha seleccionat cap fons", + "Custom background" : "Fons personalitzat", + "Plain background" : "Fons senzill", + "Default background" : "Fons per defecte", + "Theme selection is enforced" : "Es força la selecció de tema", + "Could not set the app order" : "No s'ha pogut definir l'ordre de les aplicacions", + "Could not reset the app order" : "No s'ha pogut reinicialitzar l'ordre de les aplicacions", + "Navigation bar settings" : "Paràmetres de la barra de navegació", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Podeu configurar l'ordre de les aplicacions en la barra de navegació. La primera entrada serà l'aplicació per defecte, que s'obrirà després d'iniciar la sessió o en fer clic en el logotip.", + "The default app can not be changed because it was configured by the administrator." : "No es pot canviar l'aplicació per defecte perquè l'ha configurat l'administrador.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordre de les aplicacions ha canviat. Per a veure els canvis, cal que torneu a carregar la pàgina.", + "Reset default app order" : "Reinicialitza l'ordre de les aplicacions per defecte", + "Could not set primary color" : "No s'ha pogut establir el color primari", + "Reset primary color" : "Restableix el color primari", + "Could not set global default apps" : "No s'han pogut definir les aplicacions per defecte globals", + "Default app" : "Aplicació per defecte", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'aplicació per defecte és l'aplicació que s'obre després d'iniciar la sessió o quan feu clic en el logotip del menú.", + "Use custom default app" : "Utilitza una aplicació per defecte personalitzada", + "Global default app" : "Aplicació per defecte global", + "Global default apps" : "Aplicacions per defecte globals", + "Default app priority" : "Prioritat de l'aplicació per defecte", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si un usuari no té habilitada una aplicació, s'utilitza l'aplicació següent amb una prioritat inferior.", + "Select a custom color" : "Selecciona un color personalitzat", + "Reset to default" : "Reinicialitza els valors per defecte", + "Upload" : "Puja", + "Remove background image" : "Suprimeix la imatge de fons", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui utilitzar també sense el ratolí i amb programes d'assistència, com ara els lectors de pantalla. Volem complir les {guidelines}Pautes d'accessibilitat del contingut web{linkend} 2.1 a nivell AA i amb el tema de contrast alt fins i tot a nivell AAA.", + ". Unable to apply the setting." : ". No es pot aplicar el paràmetre." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/cs.js b/apps/theming/l10n/cs.js new file mode 100644 index 00000000000..906dad2f4fa --- /dev/null +++ b/apps/theming/l10n/cs.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Daný název je příliš dlouhý", + "The given web address is too long" : "Daná webová adresa je příliš dlouhá", + "The given web address is not a valid URL" : "Daná webová adresa není platné URL", + "The given legal notice address is too long" : "Daná adresa právního upozornění je příliš dlouhá", + "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platné URL", + "The given privacy policy address is too long" : "Daná adresa prohlášení o zásadách ochrany osobních údajů je příliš dlouhá", + "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o zásadách ochrany soukromí není platné URL", + "The given slogan is too long" : "Daný slogan je příliš dlouhý", + "The given color is invalid" : "Daná barva není platná", + "Disable-user-theming should be true or false" : "Volba „Vypnout opatřování vzhledem uživateli“ by měla být ano nebo ne", + "Saved" : "Uloženo", + "Invalid app given" : "Zadána neplatná aplikace", + "Invalid type for setting \"defaultApp\" given" : "Zadán neplatný typ nastavení pro „defaultApp", + "Invalid setting key" : "Neplatný klíč nastavení", + "The file was uploaded" : "Soubor byl nahrán", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavený direktivou upload_max_filesize v php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Velikost nahrávaného souboru překračuje limit, nastavený direktivou MAX_FILE_SIZE, zadanou v HTML formuláři", + "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", + "No file was uploaded" : "Nebyl nahrán žádný soubor", + "Missing a temporary folder" : "Chybí složka pro dočasné soubory", + "Could not write file to disk" : "Soubor se nedaří zapsat na datové úložiště", + "A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru", + "No file uploaded" : "Nenahrán žádný soubor", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Už používáte svůj vlastní motiv vzhledu. Nastavení aplikace pro změnu motivu vzhledu tím mohou být přepsána.", + "Theming" : "Motiv vzhledu", + "Appearance and accessibility" : "Vzhled a zpřístupnění", + "PHP Imagick module" : "PHP modul Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Ačkoli je zapnutá aplikace pro opatřování motivem vzhledu, není zapnutý PHP modul „imagick“. Aby vytváření ikon webů správně fungovalo, je zapotřebí tento modul nainstalovat a zapnout.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modul „imagick“ na této instanci nemá podporu pro SVG. Aby byla zajištěna lepší kompatibilita, doporučuje se ji nainstalovat.", + "Dark theme with high contrast mode" : "Tmavý motiv vzhledu s režimem vysokého kontrastu", + "Enable dark high contrast mode" : "Používat tmavý režim s vysokým kontrastem", + "Similar to the high contrast mode, but with dark colours." : "Podobné režimu s vysokým kontrastem, ale s tmavými barvami.", + "Dark theme" : "Tmavý motiv vzhledu", + "Enable dark theme" : "Používat tmavý motiv vzhledu", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tmavý motiv vzhledu pro ulevení vašim očím pomocí omezení celkové svítivosti a jasu.", + "System default theme" : "Výchozí systémový vzhled", + "Enable the system default" : "Použít systémový výchozí", + "Using the default system appearance." : "Používá se výchozí systémový vzhled.", + "Dyslexia font" : "Písmo pro dyslektiky", + "Enable dyslexia font" : "Používat písmo pro dyslektiky", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je bezplatné písmo (font) navržené tak, aby odpomáhalo od některých běžných chybování při čtení, způsobených dyslexií.", + "High contrast mode" : "Režim s vysokým kontrastem", + "Enable high contrast mode" : "Zapnout režim s vysokým kontrastem", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Režim s vysokým kontrastem pro usnadnění orientace při pohybu po aplikaci. Vizuální kvalita bude snížena, zato zřetelnost se zlepší.", + "Light theme" : "Světlý motiv vzhledu", + "Enable the default light theme" : "Používat výchozí světlý vzhled", + "The default light appearance." : "Výchozí světlý vzhled.", + "Legal notice" : "Právní upozornění", + "Privacy policy" : "Zásady ochrany soukromí", + "Adjust the Nextcloud theme" : "Upravit motiv vzhledu Nextcloud", + "Name" : "Název", + "Web link" : "Webový odkaz", + "a safe home for all your data" : "bezpečný domov pro všechna vaše data", + "Slogan" : "Slogan", + "Primary color" : "Primární barva", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Hlavní barva slouží pro zvýraznění prvků jako jsou důležitá tlačítka. Může být mírně přizpůsobena podle stávajícího schématu barev.", + "Legal notice link" : "Odkaz na právní upozornění", + "Privacy policy link" : "Odkaz na zásady ochrany osobních údajů", + "Header logo" : "Logo pro záhlaví", + "Upload new header logo" : "Nahrát nové logo pro záhlaví", + "Favicon" : "ikona webu", + "Upload new favicon" : "Nahrát novou ikonu webu", + "User settings" : "Nastavení pro uživatele", + "Disable user theming" : "Vypnout opatřování vzhledem uživateli", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Ačkoli je možné vybrat a přizpůsobit si svou instanci, uživatelé si mohou změnit pozadí a barvy. Pokud chcete vámi nastavené přizpůsobení vynutit, můžete toto zapnout.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motivy umožňují jednoduše přizpůsobit vzhled a dojem z vaší instance a podporovaných klientů. Projeví se všem uživatelům.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Namísto obrázku je na pozadí také možné nastavit jednolitou barvu. Pokud použijete obrázek na pozadí, změna této barvy ovlivní barvu ikon nabídky aplikací.", + "Background color" : "Barva pozadí", + "Upload new logo" : "Nahrát nové logo", + "Logo" : "Logo", + "Upload new background and login image" : "Nahrát nový obrázek na pozadí a přihlašovací obrazovku", + "Background and login image" : "Obrázek na pozadí a přihlašovací obrazovce", + "Advanced options" : "Pokročilé předvolby", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainstalujte rozšíření ImageMagick PHP s podporou SVG obrázků, které automaticky vytváří favicon na základě nahraného loga a barvy.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Přístupnost pro všechny je pro nás velmi důležitá. Splňujeme webové standardy a zajišťujeme, aby všechno bylo použitelné i bez myši a s asistenčním softwarem, jako například čtečkami obrazovky. Máme za cíl být v souladu s doporučeními {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 na úrovni AA, při použití motivu vzhledu s vysokým kontrastem dokonce na úrovni AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Pokud naleznete jakékoli problémy, neváhejte s jejich nahlášením do {issuetracker}našeho systému pro správu hlášení{linkend}. A pokud se chcete zapojit, přidejte se k {designteam}týmu našich designérů{linkend}!", + "Unable to apply the setting." : "Nastavení nebylo možné uplatnit.", + "Appearance and accessibility settings" : "Nastavení vzhledu a zpřístupnění", + "Misc accessibility options" : "Ostatní předvolby pro přístupnost", + "Enable blur background filter (may increase GPU load)" : "Zapnout filtr rozmazávající pozadí (může zvýšit vytížení výpočetní jednotky pro grafiku)", + "Customization has been disabled by your administrator" : "Přizpůsobení si bylo vypnuto správcem", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Nastavte hlavní barvu pro zvýraznění důležitých prvků. Barva slouží pro prvky jako například hlavní tlačítka a může se trochu lišit, protože je přizpůsobována aby plnila požadavky na zpřístupnění pro postižené.", + "Background and color" : "Pozadí a barva", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Jako pozadí je možné nastavit obrázek z výchozí sady, uživatelsky určený nahraný obrázek, nebo jednolitá barva.", + "Keyboard shortcuts" : "Klávesové zkratky", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V některých případech mohou klávesové zkratky kolidovat s těmi v rámci nástrojů pro zpřístupnění. Aby tyto nástroje fungovaly správně, je možné zde vypnout veškeré klávesové zkratky pro Nextcloud. Toto také vypne veškeré klávesové zkratky v Nextcloud aplikacích.", + "Disable all keyboard shortcuts" : "Vypnout veškeré klávesové zkratky", + "Current selected app: {app}, position {position} of {total}" : "Nyní vybraná aplikace: {app}, pozice {position} z {total}", + "Move up" : "Přesunout výše", + "Move down" : "Přesunout dolů", + "Select a background from your files" : "Vyberte obrázek na pozadí ze svých souborů", + "Select background" : "Vybrat pozadí", + "No background has been selected" : "Nevybráno žádné pozadí", + "Custom background" : "Uživatelsky určený obrázek na pozadí", + "Plain background" : "Jednolité pozadí", + "Default background" : "Výchozí obrázek na pozadí", + "Theme selection is enforced" : "Výběr motivu vzhledu je vynucen", + "Could not set the app order" : "Nepodařilo se nastavit pořadí aplikací", + "Could not reset the app order" : "Nepodařilo se vrátit pořadí aplikací na výchozí", + "Navigation bar settings" : "Nastavení pruhu navigace", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pořadí v liště navigace je možné nastavit. První položkou bude výchozí aplikace, otevíranou po přihlášení se nebo při kliknutí na logo.", + "The default app can not be changed because it was configured by the administrator." : "Výchozí aplikace nebude změněna protože byla nastavená správcem.", + "The app order was changed, to see it in action you have to reload the page." : "Pořadí aplikací bylo změněno – aby se projevilo, je třeba stránku načíst znovu.", + "Reset default app order" : "Vrátit pořadí aplikací na výchozí", + "Could not set primary color" : "Nepodařilo se nastavit primární barvu", + "Reset primary color" : "Vrátit nastavení primární barvy na výchozí hodnotu", + "Could not set global default apps" : "Nepodařilo se nastavit globálně výchozí aplikace", + "Default app" : "Výchozí aplikace", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Výchozí aplikace je ta, která je např. otevřena po přihlášení se nebo po kliknutí na logo v nabídce.", + "Use custom default app" : "Použít uživatelsky určenou výchozí aplikaci", + "Global default app" : "Globálně výchozí aplikace", + "Global default apps" : "Globálně výchozí aplikace", + "Default app priority" : "Priorita výchozí aplikace", + "If an app is not enabled for a user, the next app with lower priority is used." : "Pokud aplikace není pro daného uživatele zapnutá, bude použita hned další aplikace v pořadí priority.", + "Select a custom color" : "Vybrat uživatelsky určenou barvu", + "Reset to default" : "Vrátit zpět na výchozí hodnoty", + "Upload" : "Nahrát", + "Remove background image" : "Odebrat obrázek z pozadí", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Přístupnost pro všechny je pro nás velmi důležitá. Splňujeme webové standardy a zajišťujeme, aby všechno bylo použitelné i bez myši a s asistenčním software, jako například čtečkami obrazovky. Máme za cíl být v souladu s doporučeními {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 na úrovni AA, při použití motivu vzhledu s vysokým kontrastem dokonce na úrovni AAA.", + ". Unable to apply the setting." : ". Nastavení nebylo možné uplatnit." +}, +"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/theming/l10n/cs.json b/apps/theming/l10n/cs.json new file mode 100644 index 00000000000..5161f215194 --- /dev/null +++ b/apps/theming/l10n/cs.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Daný název je příliš dlouhý", + "The given web address is too long" : "Daná webová adresa je příliš dlouhá", + "The given web address is not a valid URL" : "Daná webová adresa není platné URL", + "The given legal notice address is too long" : "Daná adresa právního upozornění je příliš dlouhá", + "The given legal notice address is not a valid URL" : "Daná adresa právního upozornění není platné URL", + "The given privacy policy address is too long" : "Daná adresa prohlášení o zásadách ochrany osobních údajů je příliš dlouhá", + "The given privacy policy address is not a valid URL" : "Daná adresa prohlášení o zásadách ochrany soukromí není platné URL", + "The given slogan is too long" : "Daný slogan je příliš dlouhý", + "The given color is invalid" : "Daná barva není platná", + "Disable-user-theming should be true or false" : "Volba „Vypnout opatřování vzhledem uživateli“ by měla být ano nebo ne", + "Saved" : "Uloženo", + "Invalid app given" : "Zadána neplatná aplikace", + "Invalid type for setting \"defaultApp\" given" : "Zadán neplatný typ nastavení pro „defaultApp", + "Invalid setting key" : "Neplatný klíč nastavení", + "The file was uploaded" : "Soubor byl nahrán", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Velikost nahrávaného souboru překračuje limit nastavený direktivou upload_max_filesize v php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Velikost nahrávaného souboru překračuje limit, nastavený direktivou MAX_FILE_SIZE, zadanou v HTML formuláři", + "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", + "No file was uploaded" : "Nebyl nahrán žádný soubor", + "Missing a temporary folder" : "Chybí složka pro dočasné soubory", + "Could not write file to disk" : "Soubor se nedaří zapsat na datové úložiště", + "A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru", + "No file uploaded" : "Nenahrán žádný soubor", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Už používáte svůj vlastní motiv vzhledu. Nastavení aplikace pro změnu motivu vzhledu tím mohou být přepsána.", + "Theming" : "Motiv vzhledu", + "Appearance and accessibility" : "Vzhled a zpřístupnění", + "PHP Imagick module" : "PHP modul Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Ačkoli je zapnutá aplikace pro opatřování motivem vzhledu, není zapnutý PHP modul „imagick“. Aby vytváření ikon webů správně fungovalo, je zapotřebí tento modul nainstalovat a zapnout.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modul „imagick“ na této instanci nemá podporu pro SVG. Aby byla zajištěna lepší kompatibilita, doporučuje se ji nainstalovat.", + "Dark theme with high contrast mode" : "Tmavý motiv vzhledu s režimem vysokého kontrastu", + "Enable dark high contrast mode" : "Používat tmavý režim s vysokým kontrastem", + "Similar to the high contrast mode, but with dark colours." : "Podobné režimu s vysokým kontrastem, ale s tmavými barvami.", + "Dark theme" : "Tmavý motiv vzhledu", + "Enable dark theme" : "Používat tmavý motiv vzhledu", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tmavý motiv vzhledu pro ulevení vašim očím pomocí omezení celkové svítivosti a jasu.", + "System default theme" : "Výchozí systémový vzhled", + "Enable the system default" : "Použít systémový výchozí", + "Using the default system appearance." : "Používá se výchozí systémový vzhled.", + "Dyslexia font" : "Písmo pro dyslektiky", + "Enable dyslexia font" : "Používat písmo pro dyslektiky", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je bezplatné písmo (font) navržené tak, aby odpomáhalo od některých běžných chybování při čtení, způsobených dyslexií.", + "High contrast mode" : "Režim s vysokým kontrastem", + "Enable high contrast mode" : "Zapnout režim s vysokým kontrastem", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Režim s vysokým kontrastem pro usnadnění orientace při pohybu po aplikaci. Vizuální kvalita bude snížena, zato zřetelnost se zlepší.", + "Light theme" : "Světlý motiv vzhledu", + "Enable the default light theme" : "Používat výchozí světlý vzhled", + "The default light appearance." : "Výchozí světlý vzhled.", + "Legal notice" : "Právní upozornění", + "Privacy policy" : "Zásady ochrany soukromí", + "Adjust the Nextcloud theme" : "Upravit motiv vzhledu Nextcloud", + "Name" : "Název", + "Web link" : "Webový odkaz", + "a safe home for all your data" : "bezpečný domov pro všechna vaše data", + "Slogan" : "Slogan", + "Primary color" : "Primární barva", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Hlavní barva slouží pro zvýraznění prvků jako jsou důležitá tlačítka. Může být mírně přizpůsobena podle stávajícího schématu barev.", + "Legal notice link" : "Odkaz na právní upozornění", + "Privacy policy link" : "Odkaz na zásady ochrany osobních údajů", + "Header logo" : "Logo pro záhlaví", + "Upload new header logo" : "Nahrát nové logo pro záhlaví", + "Favicon" : "ikona webu", + "Upload new favicon" : "Nahrát novou ikonu webu", + "User settings" : "Nastavení pro uživatele", + "Disable user theming" : "Vypnout opatřování vzhledem uživateli", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Ačkoli je možné vybrat a přizpůsobit si svou instanci, uživatelé si mohou změnit pozadí a barvy. Pokud chcete vámi nastavené přizpůsobení vynutit, můžete toto zapnout.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motivy umožňují jednoduše přizpůsobit vzhled a dojem z vaší instance a podporovaných klientů. Projeví se všem uživatelům.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Namísto obrázku je na pozadí také možné nastavit jednolitou barvu. Pokud použijete obrázek na pozadí, změna této barvy ovlivní barvu ikon nabídky aplikací.", + "Background color" : "Barva pozadí", + "Upload new logo" : "Nahrát nové logo", + "Logo" : "Logo", + "Upload new background and login image" : "Nahrát nový obrázek na pozadí a přihlašovací obrazovku", + "Background and login image" : "Obrázek na pozadí a přihlašovací obrazovce", + "Advanced options" : "Pokročilé předvolby", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainstalujte rozšíření ImageMagick PHP s podporou SVG obrázků, které automaticky vytváří favicon na základě nahraného loga a barvy.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Přístupnost pro všechny je pro nás velmi důležitá. Splňujeme webové standardy a zajišťujeme, aby všechno bylo použitelné i bez myši a s asistenčním softwarem, jako například čtečkami obrazovky. Máme za cíl být v souladu s doporučeními {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 na úrovni AA, při použití motivu vzhledu s vysokým kontrastem dokonce na úrovni AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Pokud naleznete jakékoli problémy, neváhejte s jejich nahlášením do {issuetracker}našeho systému pro správu hlášení{linkend}. A pokud se chcete zapojit, přidejte se k {designteam}týmu našich designérů{linkend}!", + "Unable to apply the setting." : "Nastavení nebylo možné uplatnit.", + "Appearance and accessibility settings" : "Nastavení vzhledu a zpřístupnění", + "Misc accessibility options" : "Ostatní předvolby pro přístupnost", + "Enable blur background filter (may increase GPU load)" : "Zapnout filtr rozmazávající pozadí (může zvýšit vytížení výpočetní jednotky pro grafiku)", + "Customization has been disabled by your administrator" : "Přizpůsobení si bylo vypnuto správcem", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Nastavte hlavní barvu pro zvýraznění důležitých prvků. Barva slouží pro prvky jako například hlavní tlačítka a může se trochu lišit, protože je přizpůsobována aby plnila požadavky na zpřístupnění pro postižené.", + "Background and color" : "Pozadí a barva", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Jako pozadí je možné nastavit obrázek z výchozí sady, uživatelsky určený nahraný obrázek, nebo jednolitá barva.", + "Keyboard shortcuts" : "Klávesové zkratky", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V některých případech mohou klávesové zkratky kolidovat s těmi v rámci nástrojů pro zpřístupnění. Aby tyto nástroje fungovaly správně, je možné zde vypnout veškeré klávesové zkratky pro Nextcloud. Toto také vypne veškeré klávesové zkratky v Nextcloud aplikacích.", + "Disable all keyboard shortcuts" : "Vypnout veškeré klávesové zkratky", + "Current selected app: {app}, position {position} of {total}" : "Nyní vybraná aplikace: {app}, pozice {position} z {total}", + "Move up" : "Přesunout výše", + "Move down" : "Přesunout dolů", + "Select a background from your files" : "Vyberte obrázek na pozadí ze svých souborů", + "Select background" : "Vybrat pozadí", + "No background has been selected" : "Nevybráno žádné pozadí", + "Custom background" : "Uživatelsky určený obrázek na pozadí", + "Plain background" : "Jednolité pozadí", + "Default background" : "Výchozí obrázek na pozadí", + "Theme selection is enforced" : "Výběr motivu vzhledu je vynucen", + "Could not set the app order" : "Nepodařilo se nastavit pořadí aplikací", + "Could not reset the app order" : "Nepodařilo se vrátit pořadí aplikací na výchozí", + "Navigation bar settings" : "Nastavení pruhu navigace", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pořadí v liště navigace je možné nastavit. První položkou bude výchozí aplikace, otevíranou po přihlášení se nebo při kliknutí na logo.", + "The default app can not be changed because it was configured by the administrator." : "Výchozí aplikace nebude změněna protože byla nastavená správcem.", + "The app order was changed, to see it in action you have to reload the page." : "Pořadí aplikací bylo změněno – aby se projevilo, je třeba stránku načíst znovu.", + "Reset default app order" : "Vrátit pořadí aplikací na výchozí", + "Could not set primary color" : "Nepodařilo se nastavit primární barvu", + "Reset primary color" : "Vrátit nastavení primární barvy na výchozí hodnotu", + "Could not set global default apps" : "Nepodařilo se nastavit globálně výchozí aplikace", + "Default app" : "Výchozí aplikace", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Výchozí aplikace je ta, která je např. otevřena po přihlášení se nebo po kliknutí na logo v nabídce.", + "Use custom default app" : "Použít uživatelsky určenou výchozí aplikaci", + "Global default app" : "Globálně výchozí aplikace", + "Global default apps" : "Globálně výchozí aplikace", + "Default app priority" : "Priorita výchozí aplikace", + "If an app is not enabled for a user, the next app with lower priority is used." : "Pokud aplikace není pro daného uživatele zapnutá, bude použita hned další aplikace v pořadí priority.", + "Select a custom color" : "Vybrat uživatelsky určenou barvu", + "Reset to default" : "Vrátit zpět na výchozí hodnoty", + "Upload" : "Nahrát", + "Remove background image" : "Odebrat obrázek z pozadí", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Přístupnost pro všechny je pro nás velmi důležitá. Splňujeme webové standardy a zajišťujeme, aby všechno bylo použitelné i bez myši a s asistenčním software, jako například čtečkami obrazovky. Máme za cíl být v souladu s doporučeními {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 na úrovni AA, při použití motivu vzhledu s vysokým kontrastem dokonce na úrovni AAA.", + ". Unable to apply the setting." : ". Nastavení nebylo možné uplatnit." +},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/da.js b/apps/theming/l10n/da.js new file mode 100644 index 00000000000..54312ac2fc7 --- /dev/null +++ b/apps/theming/l10n/da.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Navnet er for langt", + "The given web address is too long" : "Webadressen er for lang", + "The given web address is not a valid URL" : "Den angivne webadresse er ikke en gyldig URL", + "The given legal notice address is too long" : "Den angivne juridiske meddelelsesadresse er for lang", + "The given legal notice address is not a valid URL" : "Den angivne juridiske meddelelsesadresse er ikke en gyldig URL", + "The given privacy policy address is too long" : "Den angivne adresse til privatlivspolitikken er for lang", + "The given privacy policy address is not a valid URL" : "Den angivne adresse til privatlivspolitikken er ikke en gyldig URL", + "The given slogan is too long" : "Sloganet er for langt", + "The given color is invalid" : "Farven er ikke gyldig", + "Disable-user-theming should be true or false" : "Disable-user-theming skal være \"true\" eller \"false\"", + "Saved" : "Gemt", + "Invalid app given" : "Ugyldig app angivet", + "Invalid type for setting \"defaultApp\" given" : "Ugyldig type for indstillingen \"defaultApp\" angivet", + "Invalid setting key" : "Ugyldig indstilling nøgle", + "The file was uploaded" : "Filen blev uploadet", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Den uploadede fil overstiger upload_max_filesize direktivet i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den uploadede fil overstiger MAX_FILE_SIZE indstilingen, som specificeret i HTML formularen", + "The file was only partially uploaded" : "Filen blev kun delvist uploadet", + "No file was uploaded" : "Ingen fil uploadet", + "Missing a temporary folder" : "Manglende midlertidig mappe.", + "Could not write file to disk" : "Kunne ikke skrive fil til disk", + "A PHP extension stopped the file upload" : "En PHP-udvidelse stoppede filoverførslen", + "No file uploaded" : "Ingen fil uploadet", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du bruger allerede et brugerdefineret tema. Tematiserede app-indstillinger kan blive overskrevet af det.", + "Theming" : "Temaer", + "Appearance and accessibility" : "Udseende og tilgængelighed", + "PHP Imagick module" : "PHP Imagick moldul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-modulet \"imagick\" er ikke aktiveret, selvom tema-appen er det. For at favicon-generering skal fungere korrekt, skal du installere og aktivere dette modul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modulet \"imagick\" i denne instans, har ingen SVG understøttelse. For bedre kompatibilitet anbefales det at installere det.", + "Dark theme with high contrast mode" : "Mørkt tema med høj kontrast", + "Enable dark high contrast mode" : "Aktiver mørk, høj kontrast tilstand", + "Similar to the high contrast mode, but with dark colours." : "Som høj kontrast tilstand, men med mørke farver.", + "Dark theme" : "Mørkt tema", + "Enable dark theme" : "Aktiver mørkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Et mørkt tema der reducerer den overordnede lysstyrke.", + "System default theme" : "System standard tema", + "Enable the system default" : "Aktiver systemets standard", + "Using the default system appearance." : "Anvender systemets standard udseende.", + "Dyslexia font" : "Skrifftype for ordblinde", + "Enable dyslexia font" : "Aktiver skrifttype for ordblinde", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype designet til at undgå læsefejl pga. ordblindhed", + "High contrast mode" : "Højkontrasttilstand", + "Enable high contrast mode" : "Aktiver højkontrasttilstand", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En højkontrasttilstand til at lette din navigation. Visuel kvalitet reduceres, men klarhed øges.", + "Light theme" : "Lyst tema", + "Enable the default light theme" : "Aktiver standard lyst tema", + "The default light appearance." : "Standard lys fremtoning", + "Legal notice" : "Juridisk notits", + "Privacy policy" : "Fortrolighedspolitik", + "Adjust the Nextcloud theme" : "Juster Nextcloud-temaet", + "Name" : "Navn", + "Web link" : "Weblink", + "a safe home for all your data" : "Et sikket hjem til alt dit data", + "Slogan" : "Slogan", + "Primary color" : "Primær farve", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Den primære farve anvendes til at fremhæve elementer såsom vigtige knapper. Den kan ændres en smule afhængigt af det aktuelle farveskema.", + "Legal notice link" : "Link til juridisk meddelelse", + "Privacy policy link" : "Fortrolighedspolitik link", + "Header logo" : "Headerlogo", + "Upload new header logo" : "Upload nyt header-logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload nyt favicon", + "User settings" : "Brugerindstillinger", + "Disable user theming" : "Deaktiver brugertematisering", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Selvom du kan vælge og brugerdefinere din instans, så kan brugere ændre deres baggrund og farver. Hvis du ønsker at gennemtvinge din brugerdefinering, så kan du skifte dette til aktiveret.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temaer gør det muligt nemt at brugerdefinere udseendet på din installation og understøttede klienter. Dette vil være synligt for alle brugere.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "I stedet for et baggrundsbillede så kan du også konfigurere en ren baggrundsfarve. Hvis du anvender et baggrundsbillede så vil ændring af denne farve påvirke farven af app menuikonerne.", + "Background color" : "Baggrundsfarve", + "Upload new logo" : "Upload nyt logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload nyt baggrunds- og loginbillede", + "Background and login image" : "Baggrunds- og loginbillede", + "Advanced options" : "Avancerede indstillinger", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installer ImageMagick PHP udvidelsen med understøttelse af SVG billeder for automatisk at generere favikoner baseret på det uploadede logo og farve.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universel adgang er meget vigtig for os. Vi følger webstandarder og kontrollerer at gøre alt brugbart også uden mus og hjælpesoftware såsom skærmlæsere. Vi sigter efter at være i overensstemmelse med {linkstart} retningslinjerne for tilgængelighed af webindhold {linkend} 2.1 på AA-niveau, med højkontrast-temaet selv på AAA-niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Hvis du støder på nogle problemer, så tøv ikke med at rapportere dem på {issuetracker}vores issue tracker{linkend}. Og hvis du ønsker at hjælpe, så kom og vær med i vort {designteam}design team{linkend}!", + "Unable to apply the setting." : "Indstillingen kunne ikke anvendes.", + "Appearance and accessibility settings" : "Udseende og tilgængelighedsindstillinger", + "Misc accessibility options" : "Diverse tilgængelighedsindstillinger", + "Enable blur background filter (may increase GPU load)" : "Aktiver slår baggrundsfilter (kan øge GPU belastningen)", + "Customization has been disabled by your administrator" : "Brugerdefinering er blevet deaktiveret af din administrator", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Angiv en primær farve for at fremhæve vigtige elementer. Den anvendte farve for elementer så som primære knapper, kan måske være lidt anderledes, da den bliver justeret for at tilfredsstille tilgængelighedskrav.", + "Background and color" : "Baggrund og farve", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Baggrund kan sættes til et billede fra standard sættet, eller et brugerdefineret uploadet billede, eller en ren farve.", + "Keyboard shortcuts" : "Tastaturgenveje", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I nogle tilfælde så kan tastaturgenveje komme i vejen for tilgængelighedsværktøjer. For at tillade at der fokuseres korrekt på dit værktøj, så kan du deaktivere alle tastaturgenveje her. Dette vil også deaktivere alle tilgængelige genveje i apps.", + "Disable all keyboard shortcuts" : "Deaktiver alle tastaturgenveje", + "Current selected app: {app}, position {position} of {total}" : "Aktuelt valgte app: {app}, position {position} ud af {total}", + "Move up" : "Flyt op", + "Move down" : "Flyt ned", + "Select a background from your files" : "Vælg en baggrund fra dine filer", + "Select background" : "Vælg baggrund", + "No background has been selected" : "Ingen baggrund er valgt", + "Custom background" : "Brugerdefineret baggrund", + "Plain background" : "Standard baggrund", + "Default background" : "Standard baggrund", + "Theme selection is enforced" : "Temavalg er gennemtvunget", + "Could not set the app order" : "Kunne ikke sætte app rækkefølgen", + "Could not reset the app order" : "Kunne ikke nulstille app rækkefølgen", + "Navigation bar settings" : "Indstillinger for navigationslinje", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurere app rækkefølgen der anvendes til navigationslinjen. Den første indførsel vil være standard app'en, åbnet efter log på eller når der klikkes på logoet.", + "The default app can not be changed because it was configured by the administrator." : "Standard app'en kan ikke ændres fordi den blev konfigureret af administratoren.", + "The app order was changed, to see it in action you have to reload the page." : "App rækkefølgen blev ændret. For at se effekten skal du genindlæse siden.", + "Reset default app order" : "Nulstil standard app rækkefølge", + "Could not set primary color" : "Kunne ikke sætte primær farve", + "Reset primary color" : "Nulstil primær farve", + "Could not set global default apps" : "Kunne ikke sætte global standard apps", + "Default app" : "Standard app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standard app'en er app'en som åbnes efter log på eller når der klikkes på logoet i menuen.", + "Use custom default app" : "Anvend brugerdefineret standard app", + "Global default app" : "Global standard app", + "Global default apps" : "Globale standard apps", + "Default app priority" : "Standard app prioritet", + "If an app is not enabled for a user, the next app with lower priority is used." : "Hvis en app ikke er aktiveret for en bruger, så anvendes den næste app med lavere prioritet.", + "Select a custom color" : "Vælg en brugerdefineret farve", + "Reset to default" : "Nulstil", + "Upload" : "Upload", + "Remove background image" : "Fjern baggrundsbillede", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universel adgang er meget vigtig for os. Vi følger webstandarder og sikrer os at gøre alt tilgængeligt også uden mus, eller med hjælpesoftware såsom skærmlæsere. Vi stræber etfer at følge {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 og AA niveau, endda med højt kontrast tema på AAA niveau.", + ". Unable to apply the setting." : ". Indstillingen kunne ikke anvendes." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/da.json b/apps/theming/l10n/da.json new file mode 100644 index 00000000000..c38af4f22c5 --- /dev/null +++ b/apps/theming/l10n/da.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Navnet er for langt", + "The given web address is too long" : "Webadressen er for lang", + "The given web address is not a valid URL" : "Den angivne webadresse er ikke en gyldig URL", + "The given legal notice address is too long" : "Den angivne juridiske meddelelsesadresse er for lang", + "The given legal notice address is not a valid URL" : "Den angivne juridiske meddelelsesadresse er ikke en gyldig URL", + "The given privacy policy address is too long" : "Den angivne adresse til privatlivspolitikken er for lang", + "The given privacy policy address is not a valid URL" : "Den angivne adresse til privatlivspolitikken er ikke en gyldig URL", + "The given slogan is too long" : "Sloganet er for langt", + "The given color is invalid" : "Farven er ikke gyldig", + "Disable-user-theming should be true or false" : "Disable-user-theming skal være \"true\" eller \"false\"", + "Saved" : "Gemt", + "Invalid app given" : "Ugyldig app angivet", + "Invalid type for setting \"defaultApp\" given" : "Ugyldig type for indstillingen \"defaultApp\" angivet", + "Invalid setting key" : "Ugyldig indstilling nøgle", + "The file was uploaded" : "Filen blev uploadet", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Den uploadede fil overstiger upload_max_filesize direktivet i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den uploadede fil overstiger MAX_FILE_SIZE indstilingen, som specificeret i HTML formularen", + "The file was only partially uploaded" : "Filen blev kun delvist uploadet", + "No file was uploaded" : "Ingen fil uploadet", + "Missing a temporary folder" : "Manglende midlertidig mappe.", + "Could not write file to disk" : "Kunne ikke skrive fil til disk", + "A PHP extension stopped the file upload" : "En PHP-udvidelse stoppede filoverførslen", + "No file uploaded" : "Ingen fil uploadet", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du bruger allerede et brugerdefineret tema. Tematiserede app-indstillinger kan blive overskrevet af det.", + "Theming" : "Temaer", + "Appearance and accessibility" : "Udseende og tilgængelighed", + "PHP Imagick module" : "PHP Imagick moldul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-modulet \"imagick\" er ikke aktiveret, selvom tema-appen er det. For at favicon-generering skal fungere korrekt, skal du installere og aktivere dette modul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modulet \"imagick\" i denne instans, har ingen SVG understøttelse. For bedre kompatibilitet anbefales det at installere det.", + "Dark theme with high contrast mode" : "Mørkt tema med høj kontrast", + "Enable dark high contrast mode" : "Aktiver mørk, høj kontrast tilstand", + "Similar to the high contrast mode, but with dark colours." : "Som høj kontrast tilstand, men med mørke farver.", + "Dark theme" : "Mørkt tema", + "Enable dark theme" : "Aktiver mørkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Et mørkt tema der reducerer den overordnede lysstyrke.", + "System default theme" : "System standard tema", + "Enable the system default" : "Aktiver systemets standard", + "Using the default system appearance." : "Anvender systemets standard udseende.", + "Dyslexia font" : "Skrifftype for ordblinde", + "Enable dyslexia font" : "Aktiver skrifttype for ordblinde", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype designet til at undgå læsefejl pga. ordblindhed", + "High contrast mode" : "Højkontrasttilstand", + "Enable high contrast mode" : "Aktiver højkontrasttilstand", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En højkontrasttilstand til at lette din navigation. Visuel kvalitet reduceres, men klarhed øges.", + "Light theme" : "Lyst tema", + "Enable the default light theme" : "Aktiver standard lyst tema", + "The default light appearance." : "Standard lys fremtoning", + "Legal notice" : "Juridisk notits", + "Privacy policy" : "Fortrolighedspolitik", + "Adjust the Nextcloud theme" : "Juster Nextcloud-temaet", + "Name" : "Navn", + "Web link" : "Weblink", + "a safe home for all your data" : "Et sikket hjem til alt dit data", + "Slogan" : "Slogan", + "Primary color" : "Primær farve", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Den primære farve anvendes til at fremhæve elementer såsom vigtige knapper. Den kan ændres en smule afhængigt af det aktuelle farveskema.", + "Legal notice link" : "Link til juridisk meddelelse", + "Privacy policy link" : "Fortrolighedspolitik link", + "Header logo" : "Headerlogo", + "Upload new header logo" : "Upload nyt header-logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload nyt favicon", + "User settings" : "Brugerindstillinger", + "Disable user theming" : "Deaktiver brugertematisering", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Selvom du kan vælge og brugerdefinere din instans, så kan brugere ændre deres baggrund og farver. Hvis du ønsker at gennemtvinge din brugerdefinering, så kan du skifte dette til aktiveret.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temaer gør det muligt nemt at brugerdefinere udseendet på din installation og understøttede klienter. Dette vil være synligt for alle brugere.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "I stedet for et baggrundsbillede så kan du også konfigurere en ren baggrundsfarve. Hvis du anvender et baggrundsbillede så vil ændring af denne farve påvirke farven af app menuikonerne.", + "Background color" : "Baggrundsfarve", + "Upload new logo" : "Upload nyt logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload nyt baggrunds- og loginbillede", + "Background and login image" : "Baggrunds- og loginbillede", + "Advanced options" : "Avancerede indstillinger", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installer ImageMagick PHP udvidelsen med understøttelse af SVG billeder for automatisk at generere favikoner baseret på det uploadede logo og farve.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universel adgang er meget vigtig for os. Vi følger webstandarder og kontrollerer at gøre alt brugbart også uden mus og hjælpesoftware såsom skærmlæsere. Vi sigter efter at være i overensstemmelse med {linkstart} retningslinjerne for tilgængelighed af webindhold {linkend} 2.1 på AA-niveau, med højkontrast-temaet selv på AAA-niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Hvis du støder på nogle problemer, så tøv ikke med at rapportere dem på {issuetracker}vores issue tracker{linkend}. Og hvis du ønsker at hjælpe, så kom og vær med i vort {designteam}design team{linkend}!", + "Unable to apply the setting." : "Indstillingen kunne ikke anvendes.", + "Appearance and accessibility settings" : "Udseende og tilgængelighedsindstillinger", + "Misc accessibility options" : "Diverse tilgængelighedsindstillinger", + "Enable blur background filter (may increase GPU load)" : "Aktiver slår baggrundsfilter (kan øge GPU belastningen)", + "Customization has been disabled by your administrator" : "Brugerdefinering er blevet deaktiveret af din administrator", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Angiv en primær farve for at fremhæve vigtige elementer. Den anvendte farve for elementer så som primære knapper, kan måske være lidt anderledes, da den bliver justeret for at tilfredsstille tilgængelighedskrav.", + "Background and color" : "Baggrund og farve", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Baggrund kan sættes til et billede fra standard sættet, eller et brugerdefineret uploadet billede, eller en ren farve.", + "Keyboard shortcuts" : "Tastaturgenveje", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I nogle tilfælde så kan tastaturgenveje komme i vejen for tilgængelighedsværktøjer. For at tillade at der fokuseres korrekt på dit værktøj, så kan du deaktivere alle tastaturgenveje her. Dette vil også deaktivere alle tilgængelige genveje i apps.", + "Disable all keyboard shortcuts" : "Deaktiver alle tastaturgenveje", + "Current selected app: {app}, position {position} of {total}" : "Aktuelt valgte app: {app}, position {position} ud af {total}", + "Move up" : "Flyt op", + "Move down" : "Flyt ned", + "Select a background from your files" : "Vælg en baggrund fra dine filer", + "Select background" : "Vælg baggrund", + "No background has been selected" : "Ingen baggrund er valgt", + "Custom background" : "Brugerdefineret baggrund", + "Plain background" : "Standard baggrund", + "Default background" : "Standard baggrund", + "Theme selection is enforced" : "Temavalg er gennemtvunget", + "Could not set the app order" : "Kunne ikke sætte app rækkefølgen", + "Could not reset the app order" : "Kunne ikke nulstille app rækkefølgen", + "Navigation bar settings" : "Indstillinger for navigationslinje", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurere app rækkefølgen der anvendes til navigationslinjen. Den første indførsel vil være standard app'en, åbnet efter log på eller når der klikkes på logoet.", + "The default app can not be changed because it was configured by the administrator." : "Standard app'en kan ikke ændres fordi den blev konfigureret af administratoren.", + "The app order was changed, to see it in action you have to reload the page." : "App rækkefølgen blev ændret. For at se effekten skal du genindlæse siden.", + "Reset default app order" : "Nulstil standard app rækkefølge", + "Could not set primary color" : "Kunne ikke sætte primær farve", + "Reset primary color" : "Nulstil primær farve", + "Could not set global default apps" : "Kunne ikke sætte global standard apps", + "Default app" : "Standard app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standard app'en er app'en som åbnes efter log på eller når der klikkes på logoet i menuen.", + "Use custom default app" : "Anvend brugerdefineret standard app", + "Global default app" : "Global standard app", + "Global default apps" : "Globale standard apps", + "Default app priority" : "Standard app prioritet", + "If an app is not enabled for a user, the next app with lower priority is used." : "Hvis en app ikke er aktiveret for en bruger, så anvendes den næste app med lavere prioritet.", + "Select a custom color" : "Vælg en brugerdefineret farve", + "Reset to default" : "Nulstil", + "Upload" : "Upload", + "Remove background image" : "Fjern baggrundsbillede", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universel adgang er meget vigtig for os. Vi følger webstandarder og sikrer os at gøre alt tilgængeligt også uden mus, eller med hjælpesoftware såsom skærmlæsere. Vi stræber etfer at følge {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 og AA niveau, endda med højt kontrast tema på AAA niveau.", + ". Unable to apply the setting." : ". Indstillingen kunne ikke anvendes." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/de.js b/apps/theming/l10n/de.js new file mode 100644 index 00000000000..93ca61f7df5 --- /dev/null +++ b/apps/theming/l10n/de.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Der eingegebene Name ist zu lang", + "The given web address is too long" : "Die eingegebene Internetadresse ist zu lang", + "The given web address is not a valid URL" : "Die eingegebene Internetadresse ist keine gültige URL", + "The given legal notice address is too long" : "Die im Impressum angegebene Adresse ist zu lang", + "The given legal notice address is not a valid URL" : "Die eingegebene Impressums-Adresse ist keine gültige URL", + "The given privacy policy address is too long" : "Die eingegebene Adresse der Datenschutzerklärung ist zu lang", + "The given privacy policy address is not a valid URL" : "Die eingegebene Adresse der Datenschutzerklärung ist keine gültige URL", + "The given slogan is too long" : "Der eingegebene Slogan ist zu lang", + "The given color is invalid" : "Die gewählte Farbe ist ungültig", + "Disable-user-theming should be true or false" : "Benutzer-Design deaktivieren sollte wahr oder falsch sein", + "Saved" : "Gespeichert", + "Invalid app given" : "Ungültige App angegeben", + "Invalid type for setting \"defaultApp\" given" : "Ungültiger Typ für die Einstellung \"Standard-App\" angegeben", + "Invalid setting key" : "Ungültiger Konfigurationsschlüssel", + "The file was uploaded" : "Die Datei wurde hochgeladen", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", + "The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden", + "No file was uploaded" : "Es wurde keine Datei hochgeladen", + "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", + "Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden", + "A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt", + "No file uploaded" : "Keine Datei hochgeladen", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du benutzt bereits ein benutzerdefiniertes Design. Die Einstellungen dieser App könnten dadurch überschrieben werden.", + "Theming" : "Design", + "Appearance and accessibility" : "Aussehen und Barrierefreiheit", + "PHP Imagick module" : "PHP Imagick-Modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Das PHP-Modul \"imagick\" ist nicht aktiviert, die Theming-App hingegen schon. Damit die Favicon-Generierung korrekt funktioniert, musst du dieses Modul installieren und aktivieren.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Das PHP-Modul \"imagick\" in dieser Instanz hat keine SVG-Unterstützung. Für eine bessere Kompatibilität empfiehlt es sich, es zu installieren.", + "Dark theme with high contrast mode" : "Dunkles Design mit hohem Kontrast", + "Enable dark high contrast mode" : "Kontrastreichen Modus (dunkel) aktivieren", + "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie das helle kontrastreiche Design, nur mit dunklen Farben.", + "Dark theme" : "Dunkles Design", + "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung der Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "System-Design", + "Enable the system default" : "System-Design aktivieren", + "Using the default system appearance." : "Das Design des Systems übernehmen.", + "Dyslexia font" : "Legasthenie-Schriftart", + "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", + "High contrast mode" : "Helles Design mit hohem Kontrast", + "Enable high contrast mode" : "Kontrastreichen Modus (hell) aktivieren", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ein kontrastreicher Modus, der die Navigation erleichtert. Die Bildqualität wird reduziert, die Übersichtlichkeit jedoch erhöht.", + "Light theme" : "Helles Design", + "Enable the default light theme" : "Helles Design aktivieren", + "The default light appearance." : "Das helle Standarddesign.", + "Legal notice" : "Impressum", + "Privacy policy" : "Datenschutzerklärung ", + "Adjust the Nextcloud theme" : "Passe das Design von Nextcloud an", + "Name" : "Name", + "Web link" : "Internet-Link", + "a safe home for all your data" : "Ein sicheres Zuhause für deine Daten", + "Slogan" : "Slogan", + "Primary color" : "Primärfarbe", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Die Primärfarbe wird zum Hervorheben von Elementen wie wichtigen Schaltflächen verwendet. Sie kann je nach aktuellem Farbschema leicht angepasst werden.", + "Legal notice link" : "Link zum Impressum", + "Privacy policy link" : "Link zur Datenschutzerklärung", + "Header logo" : "Kopfbereichs-Logo", + "Upload new header logo" : "Neues Logo für den Kopfbereich hochladen", + "Favicon" : "Favicon", + "Upload new favicon" : "Neues Favicon hochladen", + "User settings" : "Benutzer-Einstellungen", + "Disable user theming" : "Benutzer-Design deaktivieren", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Trotz der von dir vorgenommenen Auswahl und Anpassung können Benutzer ihren Hintergrund und ihre Farben ändern. Wenn du Ihre Anpassung erzwingen möchtest, kannst du dies hier aktivieren.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise, das Aussehen deiner Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Anstelle eines Hintergrundbildes kannst du auch eine einfache Hintergrundfarbe konfigurieren. Wenn du ein Hintergrundbild verwendest, wirkt sich die Änderung dieser Farbe auf die Farbe der App-Menüsymbole aus.", + "Background color" : "Hintergrundfarbe", + "Upload new logo" : "Neues Logo hochladen", + "Logo" : "Logo", + "Upload new background and login image" : "Ein neues Hintergrund- und Anmeldebild hochladen", + "Background and login image" : "Hintergrund und Anmeldebild", + "Advanced options" : "Erweiterte Optionen", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installiere die ImageMagick PHP-Erweiterung mit Unterstützung für SVG-Bilder, um automatisch Favicons auf Basis des hochgeladenen Logos und der Farbe zu erstellen.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn du Fehler findest, melde diese bitte in {issuetracker}unserem Issue Tracker{linkend}. Und wenn du mithelfen möchtest, tritt dem {designteam}Designteam{linkend} bei!", + "Unable to apply the setting." : "Die Einstellung kann nicht übernommen werden.", + "Appearance and accessibility settings" : "Einstellungen zu Aussehen und Barrierefreiheit", + "Misc accessibility options" : "Verschiedene Barrierefreiheitsoptionen", + "Enable blur background filter (may increase GPU load)" : "Filter für unscharfes Hintergrundbild aktivieren (kann die GPU-Auslastung erhöhen)", + "Customization has been disabled by your administrator" : "Diese Anpassungsmöglichkeit wurde von deiner Administration deaktiviert", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Lege eine Primärfarbe fest, um wichtige Elemente hervorzuheben. Die für Elemente wie Primärschaltflächen verwendete Farbe kann etwas abweichen, da sie angepasst wird, um die Zugänglichkeitsanforderungen zu erfüllen.", + "Background and color" : "Hintergrund und Farbe", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Als Hintergrund kann ein Bild aus dem Standardsatz, ein benutzerdefiniertes hochgeladenes Bild oder eine einfache Farbe ausgewählt werden.", + "Keyboard shortcuts" : "Tastaturkürzel", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In einigen Fällen können Tastaturkürzel Barrierefreiheits-Tools beeinträchtigen. Damit du dich richtig auf dein Werkzeug konzentrieren kannst, kannst du hier alle Tastaturkürzel deaktivieren. Dadurch werden auch alle verfügbaren Verknüpfungen in Apps deaktiviert.", + "Disable all keyboard shortcuts" : "Alle Tastaturkürzel deaktivieren", + "Current selected app: {app}, position {position} of {total}" : "Aktuell ausgewählte App: {app}, Position {position} von {total}", + "Move up" : "Nach oben verschieben", + "Move down" : "Nach unten verschieben", + "Select a background from your files" : "Wähle einen Hintergrund aus deinen Dateien", + "Select background" : "Hintergrund wählen", + "No background has been selected" : "Es wurde kein Hintergrund ausgewählt", + "Custom background" : "Benutzerdefinierter Hintergrund", + "Plain background" : "Einfarbiger Hintergrund", + "Default background" : "Standardhintergrund", + "Theme selection is enforced" : "Designauswahl wird erzwungen", + "Could not set the app order" : "Die App-Reihenfolge konnte nicht festgelegt werden.", + "Could not reset the app order" : "Standard-App-Reihenfolge konnte nicht zurückgesetzt werden", + "Navigation bar settings" : "Einstellungen der Navigationsleiste", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kannst die App-Reihenfolge für die Navigationsleiste konfigurieren. Der erste Eintrag ist die Standard-App, die nach der Anmeldung oder beim Klicken auf das Logo geöffnet wird.", + "The default app can not be changed because it was configured by the administrator." : "Die Standard-App kann nicht geändert werden, da sie von der Administration konfiguriert wurde.", + "The app order was changed, to see it in action you have to reload the page." : "Die App-Reihenfolge wurde geändert. Um die Änderungen zu sehen, musst du die Seite neu laden.", + "Reset default app order" : "Standard-App-Reihenfolge zurücksetzen", + "Could not set primary color" : "Primärfarbe konnte nicht festgelegt werden", + "Reset primary color" : "Primärfarbe zurücksetzen", + "Could not set global default apps" : "Globale Standard-Apps konnten nicht festgelegt werden.", + "Default app" : "Standard-App", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Die Standard-App ist die App, die z. B. nach der Anmeldung oder nach Klicken auf das Logo im Menü geöffnet wird.", + "Use custom default app" : "Benutzerdefinierte Standard-App verwenden", + "Global default app" : "Globale Standard-App", + "Global default apps" : "Globale Standard-Apps", + "Default app priority" : "Standard-App-Priorität", + "If an app is not enabled for a user, the next app with lower priority is used." : "Wenn eine App für einen Benutzer nicht aktiviert ist, wird die nächste App mit niedrigerer Priorität verwendet.", + "Select a custom color" : "Eine benutzerdefinierte Farbe auswählen", + "Reset to default" : "Auf Standard zurücksetzen ", + "Upload" : "Hochladen", + "Remove background image" : "Hintergrundbild entfernen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + ". Unable to apply the setting." : ". Fehler beim Anwenden der Einstellung." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/de.json b/apps/theming/l10n/de.json new file mode 100644 index 00000000000..db84ce8fca5 --- /dev/null +++ b/apps/theming/l10n/de.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Der eingegebene Name ist zu lang", + "The given web address is too long" : "Die eingegebene Internetadresse ist zu lang", + "The given web address is not a valid URL" : "Die eingegebene Internetadresse ist keine gültige URL", + "The given legal notice address is too long" : "Die im Impressum angegebene Adresse ist zu lang", + "The given legal notice address is not a valid URL" : "Die eingegebene Impressums-Adresse ist keine gültige URL", + "The given privacy policy address is too long" : "Die eingegebene Adresse der Datenschutzerklärung ist zu lang", + "The given privacy policy address is not a valid URL" : "Die eingegebene Adresse der Datenschutzerklärung ist keine gültige URL", + "The given slogan is too long" : "Der eingegebene Slogan ist zu lang", + "The given color is invalid" : "Die gewählte Farbe ist ungültig", + "Disable-user-theming should be true or false" : "Benutzer-Design deaktivieren sollte wahr oder falsch sein", + "Saved" : "Gespeichert", + "Invalid app given" : "Ungültige App angegeben", + "Invalid type for setting \"defaultApp\" given" : "Ungültiger Typ für die Einstellung \"Standard-App\" angegeben", + "Invalid setting key" : "Ungültiger Konfigurationsschlüssel", + "The file was uploaded" : "Die Datei wurde hochgeladen", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", + "The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden", + "No file was uploaded" : "Es wurde keine Datei hochgeladen", + "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", + "Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden", + "A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt", + "No file uploaded" : "Keine Datei hochgeladen", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du benutzt bereits ein benutzerdefiniertes Design. Die Einstellungen dieser App könnten dadurch überschrieben werden.", + "Theming" : "Design", + "Appearance and accessibility" : "Aussehen und Barrierefreiheit", + "PHP Imagick module" : "PHP Imagick-Modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Das PHP-Modul \"imagick\" ist nicht aktiviert, die Theming-App hingegen schon. Damit die Favicon-Generierung korrekt funktioniert, musst du dieses Modul installieren und aktivieren.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Das PHP-Modul \"imagick\" in dieser Instanz hat keine SVG-Unterstützung. Für eine bessere Kompatibilität empfiehlt es sich, es zu installieren.", + "Dark theme with high contrast mode" : "Dunkles Design mit hohem Kontrast", + "Enable dark high contrast mode" : "Kontrastreichen Modus (dunkel) aktivieren", + "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie das helle kontrastreiche Design, nur mit dunklen Farben.", + "Dark theme" : "Dunkles Design", + "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung der Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "System-Design", + "Enable the system default" : "System-Design aktivieren", + "Using the default system appearance." : "Das Design des Systems übernehmen.", + "Dyslexia font" : "Legasthenie-Schriftart", + "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", + "High contrast mode" : "Helles Design mit hohem Kontrast", + "Enable high contrast mode" : "Kontrastreichen Modus (hell) aktivieren", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ein kontrastreicher Modus, der die Navigation erleichtert. Die Bildqualität wird reduziert, die Übersichtlichkeit jedoch erhöht.", + "Light theme" : "Helles Design", + "Enable the default light theme" : "Helles Design aktivieren", + "The default light appearance." : "Das helle Standarddesign.", + "Legal notice" : "Impressum", + "Privacy policy" : "Datenschutzerklärung ", + "Adjust the Nextcloud theme" : "Passe das Design von Nextcloud an", + "Name" : "Name", + "Web link" : "Internet-Link", + "a safe home for all your data" : "Ein sicheres Zuhause für deine Daten", + "Slogan" : "Slogan", + "Primary color" : "Primärfarbe", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Die Primärfarbe wird zum Hervorheben von Elementen wie wichtigen Schaltflächen verwendet. Sie kann je nach aktuellem Farbschema leicht angepasst werden.", + "Legal notice link" : "Link zum Impressum", + "Privacy policy link" : "Link zur Datenschutzerklärung", + "Header logo" : "Kopfbereichs-Logo", + "Upload new header logo" : "Neues Logo für den Kopfbereich hochladen", + "Favicon" : "Favicon", + "Upload new favicon" : "Neues Favicon hochladen", + "User settings" : "Benutzer-Einstellungen", + "Disable user theming" : "Benutzer-Design deaktivieren", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Trotz der von dir vorgenommenen Auswahl und Anpassung können Benutzer ihren Hintergrund und ihre Farben ändern. Wenn du Ihre Anpassung erzwingen möchtest, kannst du dies hier aktivieren.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise, das Aussehen deiner Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Anstelle eines Hintergrundbildes kannst du auch eine einfache Hintergrundfarbe konfigurieren. Wenn du ein Hintergrundbild verwendest, wirkt sich die Änderung dieser Farbe auf die Farbe der App-Menüsymbole aus.", + "Background color" : "Hintergrundfarbe", + "Upload new logo" : "Neues Logo hochladen", + "Logo" : "Logo", + "Upload new background and login image" : "Ein neues Hintergrund- und Anmeldebild hochladen", + "Background and login image" : "Hintergrund und Anmeldebild", + "Advanced options" : "Erweiterte Optionen", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installiere die ImageMagick PHP-Erweiterung mit Unterstützung für SVG-Bilder, um automatisch Favicons auf Basis des hochgeladenen Logos und der Farbe zu erstellen.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn du Fehler findest, melde diese bitte in {issuetracker}unserem Issue Tracker{linkend}. Und wenn du mithelfen möchtest, tritt dem {designteam}Designteam{linkend} bei!", + "Unable to apply the setting." : "Die Einstellung kann nicht übernommen werden.", + "Appearance and accessibility settings" : "Einstellungen zu Aussehen und Barrierefreiheit", + "Misc accessibility options" : "Verschiedene Barrierefreiheitsoptionen", + "Enable blur background filter (may increase GPU load)" : "Filter für unscharfes Hintergrundbild aktivieren (kann die GPU-Auslastung erhöhen)", + "Customization has been disabled by your administrator" : "Diese Anpassungsmöglichkeit wurde von deiner Administration deaktiviert", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Lege eine Primärfarbe fest, um wichtige Elemente hervorzuheben. Die für Elemente wie Primärschaltflächen verwendete Farbe kann etwas abweichen, da sie angepasst wird, um die Zugänglichkeitsanforderungen zu erfüllen.", + "Background and color" : "Hintergrund und Farbe", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Als Hintergrund kann ein Bild aus dem Standardsatz, ein benutzerdefiniertes hochgeladenes Bild oder eine einfache Farbe ausgewählt werden.", + "Keyboard shortcuts" : "Tastaturkürzel", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In einigen Fällen können Tastaturkürzel Barrierefreiheits-Tools beeinträchtigen. Damit du dich richtig auf dein Werkzeug konzentrieren kannst, kannst du hier alle Tastaturkürzel deaktivieren. Dadurch werden auch alle verfügbaren Verknüpfungen in Apps deaktiviert.", + "Disable all keyboard shortcuts" : "Alle Tastaturkürzel deaktivieren", + "Current selected app: {app}, position {position} of {total}" : "Aktuell ausgewählte App: {app}, Position {position} von {total}", + "Move up" : "Nach oben verschieben", + "Move down" : "Nach unten verschieben", + "Select a background from your files" : "Wähle einen Hintergrund aus deinen Dateien", + "Select background" : "Hintergrund wählen", + "No background has been selected" : "Es wurde kein Hintergrund ausgewählt", + "Custom background" : "Benutzerdefinierter Hintergrund", + "Plain background" : "Einfarbiger Hintergrund", + "Default background" : "Standardhintergrund", + "Theme selection is enforced" : "Designauswahl wird erzwungen", + "Could not set the app order" : "Die App-Reihenfolge konnte nicht festgelegt werden.", + "Could not reset the app order" : "Standard-App-Reihenfolge konnte nicht zurückgesetzt werden", + "Navigation bar settings" : "Einstellungen der Navigationsleiste", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kannst die App-Reihenfolge für die Navigationsleiste konfigurieren. Der erste Eintrag ist die Standard-App, die nach der Anmeldung oder beim Klicken auf das Logo geöffnet wird.", + "The default app can not be changed because it was configured by the administrator." : "Die Standard-App kann nicht geändert werden, da sie von der Administration konfiguriert wurde.", + "The app order was changed, to see it in action you have to reload the page." : "Die App-Reihenfolge wurde geändert. Um die Änderungen zu sehen, musst du die Seite neu laden.", + "Reset default app order" : "Standard-App-Reihenfolge zurücksetzen", + "Could not set primary color" : "Primärfarbe konnte nicht festgelegt werden", + "Reset primary color" : "Primärfarbe zurücksetzen", + "Could not set global default apps" : "Globale Standard-Apps konnten nicht festgelegt werden.", + "Default app" : "Standard-App", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Die Standard-App ist die App, die z. B. nach der Anmeldung oder nach Klicken auf das Logo im Menü geöffnet wird.", + "Use custom default app" : "Benutzerdefinierte Standard-App verwenden", + "Global default app" : "Globale Standard-App", + "Global default apps" : "Globale Standard-Apps", + "Default app priority" : "Standard-App-Priorität", + "If an app is not enabled for a user, the next app with lower priority is used." : "Wenn eine App für einen Benutzer nicht aktiviert ist, wird die nächste App mit niedrigerer Priorität verwendet.", + "Select a custom color" : "Eine benutzerdefinierte Farbe auswählen", + "Reset to default" : "Auf Standard zurücksetzen ", + "Upload" : "Hochladen", + "Remove background image" : "Hintergrundbild entfernen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + ". Unable to apply the setting." : ". Fehler beim Anwenden der Einstellung." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/de_DE.js b/apps/theming/l10n/de_DE.js new file mode 100644 index 00000000000..4c4258f54bb --- /dev/null +++ b/apps/theming/l10n/de_DE.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Der eingegebene Name ist zu lang", + "The given web address is too long" : "Die eingegebene Internetadresse ist zu lang", + "The given web address is not a valid URL" : "Die eingegebene Internetadresse ist keine gültige URL", + "The given legal notice address is too long" : "Die im Impressum angegebene Adresse ist zu lang", + "The given legal notice address is not a valid URL" : "Die eingegebene Impressums-Adresse ist keine gültige URL", + "The given privacy policy address is too long" : "Die eingegebene Adresse der Datenschutzerklärung ist zu lang", + "The given privacy policy address is not a valid URL" : "Die eingegebene Adresse der Datenschutzerklärung ist keine gültige URL", + "The given slogan is too long" : "Der eingegebene Slogan ist zu lang", + "The given color is invalid" : "Die gewählte Farbe ist ungültig", + "Disable-user-theming should be true or false" : "Benutzer-Design deaktivieren sollte wahr oder falsch sein", + "Saved" : "Gespeichert", + "Invalid app given" : "Ungültige App angegeben", + "Invalid type for setting \"defaultApp\" given" : "Ungültiger Typ für die Einstellung \"Standard-App\" angegeben", + "Invalid setting key" : "Ungültiger Konfigurationsschlüssel", + "The file was uploaded" : "Die Datei wurde hochgeladen", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", + "The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden", + "No file was uploaded" : "Es wurde keine Datei hochgeladen", + "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", + "Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden", + "A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt", + "No file uploaded" : "Keine Datei hochgeladen", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Sie benutzen bereits ein benutzerdefiniertes Design. Die Einstellungen dieser App könnten dadurch überschrieben werden.", + "Theming" : "Design", + "Appearance and accessibility" : "Aussehen und Barrierefreiheit", + "PHP Imagick module" : "PHP Imagick-Modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Das PHP-Modul \"imagick\" ist nicht aktiviert, die Theming-App hingegen schon. Damit die Favicon-Generierung korrekt funktioniert, müssen Sie dieses Modul installieren und aktivieren.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Das PHP-Modul \"imagick\" in dieser Instanz hat keine SVG-Unterstützung. Für eine bessere Kompatibilität empfiehlt es sich, es zu installieren.", + "Dark theme with high contrast mode" : "Dunkles Design mit hohem Kontrast", + "Enable dark high contrast mode" : "Kontrastreichen Modus (dunkel) aktivieren", + "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie das helle kontrastreiche Design, nur mit dunklen Farben.", + "Dark theme" : "Dunkles Design", + "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung der Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "System-Design", + "Enable the system default" : "System-Design aktivieren", + "Using the default system appearance." : "Das Design des Systems übernehmen.", + "Dyslexia font" : "Legasthenie-Schriftart", + "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", + "High contrast mode" : "Helles Design mit hohem Kontrast", + "Enable high contrast mode" : "Kontrastreichen Modus (hell) aktivieren", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ein kontrastreicher Modus, der die Navigation erleichtert. Die Bildqualität wird reduziert, die Übersichtlichkeit jedoch erhöht.", + "Light theme" : "Helles Design", + "Enable the default light theme" : "Helles Design aktivieren", + "The default light appearance." : "Das helle Standarddesign.", + "Legal notice" : "Impressum", + "Privacy policy" : "Datenschutzerklärung", + "Adjust the Nextcloud theme" : "Passen Sie das Design von Nextcloud an", + "Name" : "Name", + "Web link" : "Internet-Link", + "a safe home for all your data" : "Ein sicheres Zuhause für Ihre Daten", + "Slogan" : "Slogan", + "Primary color" : "Primärfarbe", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Die Primärfarbe wird zum Hervorheben von Elementen wie wichtigen Schaltflächen verwendet. Sie kann je nach aktuellem Farbschema leicht angepasst werden.", + "Legal notice link" : "Link zum Impressum", + "Privacy policy link" : "Link zur Datenschutzerklärung", + "Header logo" : "Kopfbereichs-Logo", + "Upload new header logo" : "Neues Logo für den Kopfbereich hochladen", + "Favicon" : "Favicon", + "Upload new favicon" : "Neues Favicon hochladen", + "User settings" : "Benutzer-Einstellungen", + "Disable user theming" : "Benutzer-Design deaktivieren", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Trotz der von Ihnen vorgenommenen Auswahl und Anpassung können Benutzer ihren Hintergrund und ihre Farben ändern. Wenn Sie Ihre Anpassung erzwingen möchten, können Sie dies hier aktivieren.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise, das Aussehen Ihrer Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Anstelle eines Hintergrundbildes können Sie auch eine einfache Hintergrundfarbe konfigurieren. Wenn Sie ein Hintergrundbild verwenden, wirkt sich die Änderung dieser Farbe auf die Farbe der App-Menüsymbole aus.", + "Background color" : "Hintergrundfarbe", + "Upload new logo" : "Neues Logo hochladen", + "Logo" : "Logo", + "Upload new background and login image" : "Ein neues Hintergrund- und Anmeldebild hochladen", + "Background and login image" : "Hintergrund und Anmeldebild", + "Advanced options" : "Erweiterte Optionen", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installieren Sie die ImageMagick PHP-Erweiterung mit Unterstützung für SVG-Bilder, um automatisch Favicons auf Basis des hochgeladenen Logos und der Farbe zu erstellen.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Sie Fehler finden, melden Sie diese bitte in {issuetracker}unserem Issue Tracker{linkend}. Und wenn Sie mithelfen möchten, treten Sie dem {designteam}Designteam{linkend} bei!", + "Unable to apply the setting." : "Die Einstellung kann nicht übernommen werden.", + "Appearance and accessibility settings" : "Einstellungen zu Aussehen und Barrierefreiheit", + "Misc accessibility options" : "Verschiedene Barrierefreiheitsoptionen", + "Enable blur background filter (may increase GPU load)" : "Filter für unscharfes Hintergrundbild aktivieren (kann die GPU-Auslastung erhöhen)", + "Customization has been disabled by your administrator" : "Diese Anpassungsmöglichkeit wurde von Ihrer Administration deaktiviert", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Legen Sie eine Primärfarbe fest, um wichtige Elemente hervorzuheben. Die für Elemente wie Primärschaltflächen verwendete Farbe kann etwas abweichen, da sie angepasst wird, um die Zugänglichkeitsanforderungen zu erfüllen.", + "Background and color" : "Hintergrund und Farbe", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Als Hintergrund kann ein Bild aus dem Standardsatz, ein benutzerdefiniertes hochgeladenes Bild oder eine einfache Farbe ausgewählt werden.", + "Keyboard shortcuts" : "Tastaturkürzel", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In einigen Fällen können Tastaturkürzel Barrierefreiheits-Tools beeinträchtigen. Damit Sie sich richtig auf Ihr Werkzeug konzentrieren können, können Sie hier alle Tastaturkürzel deaktivieren. Dadurch werden auch alle verfügbaren Verknüpfungen in Apps deaktiviert.", + "Disable all keyboard shortcuts" : "Alle Tastaturkürzel deaktivieren", + "Current selected app: {app}, position {position} of {total}" : "Aktuell ausgewählte App: {app}, Position {position} von {total}", + "Move up" : "Nach oben verschieben", + "Move down" : "Nach unten verschieben", + "Select a background from your files" : "Wählen Sie einen Hintergrund aus Ihren Dateien", + "Select background" : "Hintergrund wählen", + "No background has been selected" : "Es wurde kein Hintergrund ausgewählt", + "Custom background" : "Benutzerdefinierter Hintergrund", + "Plain background" : "Einfarbiger Hintergrund", + "Default background" : "Standardhintergrund", + "Theme selection is enforced" : "Designauswahl wird erzwungen", + "Could not set the app order" : "Die App-Reihenfolge konnte nicht festgelegt werden", + "Could not reset the app order" : "Standard-App-Reihenfolge konnte nicht zurückgesetzt werden", + "Navigation bar settings" : "Einstellungen der Navigationsleiste", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Sie können die App-Reihenfolge für die Navigationsleiste konfigurieren. Der erste Eintrag ist die Standard-App, die nach der Anmeldung oder beim Klicken auf das Logo geöffnet wird.", + "The default app can not be changed because it was configured by the administrator." : "Die Standard-App kann nicht geändert werden, da sie von der Administration konfiguriert wurde.", + "The app order was changed, to see it in action you have to reload the page." : "Die App-Reihenfolge wurde geändert. Um die Änderungen zu sehen, müssen Sie die Seite neu laden.", + "Reset default app order" : "Standard-App-Reihenfolge zurücksetzen", + "Could not set primary color" : "Primärfarbe konnte nicht festgelegt werden", + "Reset primary color" : "Primärfarbe zurücksetzen", + "Could not set global default apps" : "Globale Standard-Apps konnten nicht festgelegt werden", + "Default app" : "Standard-App", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Die Standard-App ist die App, die z. B. nach der Anmeldung oder nach Klicken auf das Logo im Menü geöffnet wird.", + "Use custom default app" : "Benutzerdefinierte Standard-App verwenden", + "Global default app" : "Globale Standard-App", + "Global default apps" : "Globale Standard-Apps", + "Default app priority" : "Standard-App-Priorität", + "If an app is not enabled for a user, the next app with lower priority is used." : "Wenn eine App für einen Benutzer nicht aktiviert ist, wird die nächste App mit niedrigerer Priorität verwendet.", + "Select a custom color" : "Eine benutzerdefinierte Farbe auswählen", + "Reset to default" : "Auf Standard zurücksetzen ", + "Upload" : "Hochladen", + "Remove background image" : "Hintergrundbild entfernen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + ". Unable to apply the setting." : ". Fehler beim Anwenden der Einstellung." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/de_DE.json b/apps/theming/l10n/de_DE.json new file mode 100644 index 00000000000..252db90954e --- /dev/null +++ b/apps/theming/l10n/de_DE.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Der eingegebene Name ist zu lang", + "The given web address is too long" : "Die eingegebene Internetadresse ist zu lang", + "The given web address is not a valid URL" : "Die eingegebene Internetadresse ist keine gültige URL", + "The given legal notice address is too long" : "Die im Impressum angegebene Adresse ist zu lang", + "The given legal notice address is not a valid URL" : "Die eingegebene Impressums-Adresse ist keine gültige URL", + "The given privacy policy address is too long" : "Die eingegebene Adresse der Datenschutzerklärung ist zu lang", + "The given privacy policy address is not a valid URL" : "Die eingegebene Adresse der Datenschutzerklärung ist keine gültige URL", + "The given slogan is too long" : "Der eingegebene Slogan ist zu lang", + "The given color is invalid" : "Die gewählte Farbe ist ungültig", + "Disable-user-theming should be true or false" : "Benutzer-Design deaktivieren sollte wahr oder falsch sein", + "Saved" : "Gespeichert", + "Invalid app given" : "Ungültige App angegeben", + "Invalid type for setting \"defaultApp\" given" : "Ungültiger Typ für die Einstellung \"Standard-App\" angegeben", + "Invalid setting key" : "Ungültiger Konfigurationsschlüssel", + "The file was uploaded" : "Die Datei wurde hochgeladen", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", + "The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden", + "No file was uploaded" : "Es wurde keine Datei hochgeladen", + "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", + "Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden", + "A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt", + "No file uploaded" : "Keine Datei hochgeladen", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Sie benutzen bereits ein benutzerdefiniertes Design. Die Einstellungen dieser App könnten dadurch überschrieben werden.", + "Theming" : "Design", + "Appearance and accessibility" : "Aussehen und Barrierefreiheit", + "PHP Imagick module" : "PHP Imagick-Modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Das PHP-Modul \"imagick\" ist nicht aktiviert, die Theming-App hingegen schon. Damit die Favicon-Generierung korrekt funktioniert, müssen Sie dieses Modul installieren und aktivieren.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Das PHP-Modul \"imagick\" in dieser Instanz hat keine SVG-Unterstützung. Für eine bessere Kompatibilität empfiehlt es sich, es zu installieren.", + "Dark theme with high contrast mode" : "Dunkles Design mit hohem Kontrast", + "Enable dark high contrast mode" : "Kontrastreichen Modus (dunkel) aktivieren", + "Similar to the high contrast mode, but with dark colours." : "Ähnlich wie das helle kontrastreiche Design, nur mit dunklen Farben.", + "Dark theme" : "Dunkles Design", + "Enable dark theme" : "Dunkles Design aktivieren", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ein dunkles Design zur Entlastung der Augen durch Verringerung der Gesamtleuchtkraft und -helligkeit.", + "System default theme" : "System-Design", + "Enable the system default" : "System-Design aktivieren", + "Using the default system appearance." : "Das Design des Systems übernehmen.", + "Dyslexia font" : "Legasthenie-Schriftart", + "Enable dyslexia font" : "Legasthenie-Schriftart aktivieren", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.", + "High contrast mode" : "Helles Design mit hohem Kontrast", + "Enable high contrast mode" : "Kontrastreichen Modus (hell) aktivieren", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ein kontrastreicher Modus, der die Navigation erleichtert. Die Bildqualität wird reduziert, die Übersichtlichkeit jedoch erhöht.", + "Light theme" : "Helles Design", + "Enable the default light theme" : "Helles Design aktivieren", + "The default light appearance." : "Das helle Standarddesign.", + "Legal notice" : "Impressum", + "Privacy policy" : "Datenschutzerklärung", + "Adjust the Nextcloud theme" : "Passen Sie das Design von Nextcloud an", + "Name" : "Name", + "Web link" : "Internet-Link", + "a safe home for all your data" : "Ein sicheres Zuhause für Ihre Daten", + "Slogan" : "Slogan", + "Primary color" : "Primärfarbe", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Die Primärfarbe wird zum Hervorheben von Elementen wie wichtigen Schaltflächen verwendet. Sie kann je nach aktuellem Farbschema leicht angepasst werden.", + "Legal notice link" : "Link zum Impressum", + "Privacy policy link" : "Link zur Datenschutzerklärung", + "Header logo" : "Kopfbereichs-Logo", + "Upload new header logo" : "Neues Logo für den Kopfbereich hochladen", + "Favicon" : "Favicon", + "Upload new favicon" : "Neues Favicon hochladen", + "User settings" : "Benutzer-Einstellungen", + "Disable user theming" : "Benutzer-Design deaktivieren", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Trotz der von Ihnen vorgenommenen Auswahl und Anpassung können Benutzer ihren Hintergrund und ihre Farben ändern. Wenn Sie Ihre Anpassung erzwingen möchten, können Sie dies hier aktivieren.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Das Ändern des Designs ermöglicht es auf einfache Weise, das Aussehen Ihrer Installation und Clients anzupassen. Die Änderungen wirken sich auf alle Benutzer aus.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Anstelle eines Hintergrundbildes können Sie auch eine einfache Hintergrundfarbe konfigurieren. Wenn Sie ein Hintergrundbild verwenden, wirkt sich die Änderung dieser Farbe auf die Farbe der App-Menüsymbole aus.", + "Background color" : "Hintergrundfarbe", + "Upload new logo" : "Neues Logo hochladen", + "Logo" : "Logo", + "Upload new background and login image" : "Ein neues Hintergrund- und Anmeldebild hochladen", + "Background and login image" : "Hintergrund und Anmeldebild", + "Advanced options" : "Erweiterte Optionen", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installieren Sie die ImageMagick PHP-Erweiterung mit Unterstützung für SVG-Bilder, um automatisch Favicons auf Basis des hochgeladenen Logos und der Farbe zu erstellen.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Sie Fehler finden, melden Sie diese bitte in {issuetracker}unserem Issue Tracker{linkend}. Und wenn Sie mithelfen möchten, treten Sie dem {designteam}Designteam{linkend} bei!", + "Unable to apply the setting." : "Die Einstellung kann nicht übernommen werden.", + "Appearance and accessibility settings" : "Einstellungen zu Aussehen und Barrierefreiheit", + "Misc accessibility options" : "Verschiedene Barrierefreiheitsoptionen", + "Enable blur background filter (may increase GPU load)" : "Filter für unscharfes Hintergrundbild aktivieren (kann die GPU-Auslastung erhöhen)", + "Customization has been disabled by your administrator" : "Diese Anpassungsmöglichkeit wurde von Ihrer Administration deaktiviert", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Legen Sie eine Primärfarbe fest, um wichtige Elemente hervorzuheben. Die für Elemente wie Primärschaltflächen verwendete Farbe kann etwas abweichen, da sie angepasst wird, um die Zugänglichkeitsanforderungen zu erfüllen.", + "Background and color" : "Hintergrund und Farbe", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Als Hintergrund kann ein Bild aus dem Standardsatz, ein benutzerdefiniertes hochgeladenes Bild oder eine einfache Farbe ausgewählt werden.", + "Keyboard shortcuts" : "Tastaturkürzel", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In einigen Fällen können Tastaturkürzel Barrierefreiheits-Tools beeinträchtigen. Damit Sie sich richtig auf Ihr Werkzeug konzentrieren können, können Sie hier alle Tastaturkürzel deaktivieren. Dadurch werden auch alle verfügbaren Verknüpfungen in Apps deaktiviert.", + "Disable all keyboard shortcuts" : "Alle Tastaturkürzel deaktivieren", + "Current selected app: {app}, position {position} of {total}" : "Aktuell ausgewählte App: {app}, Position {position} von {total}", + "Move up" : "Nach oben verschieben", + "Move down" : "Nach unten verschieben", + "Select a background from your files" : "Wählen Sie einen Hintergrund aus Ihren Dateien", + "Select background" : "Hintergrund wählen", + "No background has been selected" : "Es wurde kein Hintergrund ausgewählt", + "Custom background" : "Benutzerdefinierter Hintergrund", + "Plain background" : "Einfarbiger Hintergrund", + "Default background" : "Standardhintergrund", + "Theme selection is enforced" : "Designauswahl wird erzwungen", + "Could not set the app order" : "Die App-Reihenfolge konnte nicht festgelegt werden", + "Could not reset the app order" : "Standard-App-Reihenfolge konnte nicht zurückgesetzt werden", + "Navigation bar settings" : "Einstellungen der Navigationsleiste", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Sie können die App-Reihenfolge für die Navigationsleiste konfigurieren. Der erste Eintrag ist die Standard-App, die nach der Anmeldung oder beim Klicken auf das Logo geöffnet wird.", + "The default app can not be changed because it was configured by the administrator." : "Die Standard-App kann nicht geändert werden, da sie von der Administration konfiguriert wurde.", + "The app order was changed, to see it in action you have to reload the page." : "Die App-Reihenfolge wurde geändert. Um die Änderungen zu sehen, müssen Sie die Seite neu laden.", + "Reset default app order" : "Standard-App-Reihenfolge zurücksetzen", + "Could not set primary color" : "Primärfarbe konnte nicht festgelegt werden", + "Reset primary color" : "Primärfarbe zurücksetzen", + "Could not set global default apps" : "Globale Standard-Apps konnten nicht festgelegt werden", + "Default app" : "Standard-App", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Die Standard-App ist die App, die z. B. nach der Anmeldung oder nach Klicken auf das Logo im Menü geöffnet wird.", + "Use custom default app" : "Benutzerdefinierte Standard-App verwenden", + "Global default app" : "Globale Standard-App", + "Global default apps" : "Globale Standard-Apps", + "Default app priority" : "Standard-App-Priorität", + "If an app is not enabled for a user, the next app with lower priority is used." : "Wenn eine App für einen Benutzer nicht aktiviert ist, wird die nächste App mit niedrigerer Priorität verwendet.", + "Select a custom color" : "Eine benutzerdefinierte Farbe auswählen", + "Reset to default" : "Auf Standard zurücksetzen ", + "Upload" : "Hochladen", + "Remove background image" : "Hintergrundbild entfernen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der barrierefreie Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.", + ". Unable to apply the setting." : ". Fehler beim Anwenden der Einstellung." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/el.js b/apps/theming/l10n/el.js new file mode 100644 index 00000000000..cc09b6c8688 --- /dev/null +++ b/apps/theming/l10n/el.js @@ -0,0 +1,78 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Το όνομα που δόθηκε είναι πολύ μεγάλο", + "The given web address is too long" : "Η διεύθυνση ιστοσελίδας που δόθηκε είναι πολύ μεγάλη.", + "The given web address is not a valid URL" : "Η διεύθυνση ιστοχώρου δεν είναι έγκυρη URL", + "The given legal notice address is too long" : "Η διεύθυνση ειδοποίησης είναι πολύ μεγάλη", + "The given legal notice address is not a valid URL" : "Η διεύθυνση νομικής ειδοποίησης δεν είναι έγκυρη διεύθυνση URL", + "The given privacy policy address is too long" : "Η διεύθυνση πολιτικής απορρήτου είναι πολύ μεγάλη", + "The given privacy policy address is not a valid URL" : "Η διεύθυνση πολιτικής απορρήτου δεν είναι έγκυρη διεύθυνση URL", + "The given slogan is too long" : "Το ρητό που δόθηκε είναι πολύ μεγάλο", + "The given color is invalid" : "Δόθηκε μη έγκυρο χρώμα", + "Saved" : "Αποθηκεύτηκαν", + "The file was uploaded" : "Το αρχείο μεταφορτώθηκε", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε στην φόρμα HTML.", + "The file was only partially uploaded" : "Το αρχείο μεταφορτώθηκε εν μέρει", + "No file was uploaded" : "Δεν μεταφορτώθηκε κάποιο αρχείο", + "Missing a temporary folder" : "Λείπει κάποιος προσωρινός φάκελος", + "Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο", + "A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου", + "No file uploaded" : "Δεν έχει μεταφορτωθεί αρχείο", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Χρησιμοποιείτε ήδη προσαρμοσμένο θέμα. Οι ρυθμίσεις της εφαρμογής Θέματα μπορεί να αντικατασταθούν από αυτό.", + "Theming" : "Προσαρμογή θέματος", + "Appearance and accessibility" : "Εμφάνιση και προσβασιμότητα", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Το άρθρωμα PHP \"imagick\" δεν είναι ενεργοποιημένο αν και η εφαρμογή θεματοποίησης είναι. Για να λειτουργήσει σωστά η δημιουργία favicon, πρέπει να εγκαταστήσετε και να ενεργοποιήσετε αυτό το άρθρωμα.", + "Dark theme with high contrast mode" : "Σκούρο θέμα με λειτουργία υψηλής αντίθεσης", + "Enable dark high contrast mode" : "Ενεργοποίηση σκοτεινής λειτουργίας υψηλής αντίθεσης", + "Similar to the high contrast mode, but with dark colours." : "Παρόμοιο με τη λειτουργία υψηλής αντίθεσης, αλλά με σκούρα χρώματα.", + "Dark theme" : "Σκούρο θέμα", + "Enable dark theme" : "Ενεργοποίηση σκούρου θέματος", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ένα σκούρο θέμα που διευκολύνει τα μάτια σας μειώνοντας τη συνολική ακτινοβολία και φωτεινότητα.", + "System default theme" : "Προεπιλεγμένο θέμα συστήματος", + "Enable the system default" : "Ενεργοποίηση προεπιλογής συστήματος", + "Using the default system appearance." : "Χρήση της προεπιλεγμένης εμφάνισης του συστήματος.", + "Dyslexia font" : "Γραμματοσειρά για δυσλεκτικούς", + "Enable dyslexia font" : "Ενεργοποίηση γραμματοσειράς για δυσλεκτικούς", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Η OpenDyslexic είναι μία δωρεάν γραμματοσειρά σχεδιασμένη ώστε να περιορίζει ορισμένα από τα πιο συνήθη λάθη που προκαλεί η δυσλεξία στην ανάγνωση", + "High contrast mode" : "Λειτουργία υψηλής αντίθεσης", + "Enable high contrast mode" : "Ενεργοποίηση λειτουργίας υψηλής αντίθεσης", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Λειτουργία με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.", + "Light theme" : "Φωτεινό θέμα", + "Enable the default light theme" : "Ενεργοποίηση φωτεινού θέματος", + "The default light appearance." : "Η προεπιλεγμένη ανοιχτόχρωμη εμφάνιση.", + "Legal notice" : "Νομική ειδοποίηση", + "Privacy policy" : "Πολιτική Απορρήτου", + "Adjust the Nextcloud theme" : "Προσαρμόστε το θέμα του Nextcloud", + "Name" : "Όνομα", + "Web link" : "Σύνδεσμος ιστού", + "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", + "Slogan" : "Ρητό", + "Legal notice link" : "Σύνδεσμος νομικής ειδοποίησης", + "Privacy policy link" : "Σύνδεσμος πολιτικής απορρήτου", + "Header logo" : "Λογότυπο επικεφαλίδας", + "Upload new header logo" : "Μεταφόρτωση νέου λογοτύπου επικεφαλίδας", + "Favicon" : "Favicon", + "Upload new favicon" : "Μεταφόρτωση νέου favicon", + "User settings" : "Ρυθμίσεις χρήστη", + "Disable user theming" : "Απενεργοποίηση θεμάτων χρήστη", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Η προσαρμογή θέματος καθιστά δυνατή την εύκολη προσαρμογή της εμφάνισης της εγκατάστασής σας καθώς και των υποστηριζόμενων πελατών. Θα είναι ορατή για όλους τους χρήστες.", + "Upload new logo" : "Μεταφόρτωση νέου λογοτύπου", + "Logo" : "Λογότυπο", + "Background and login image" : "Παρασκήνιο και εικόνα εισόδου", + "Advanced options" : "Επιλογές για προχωρημένους", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Εάν εντοπίσετε οποιοδήποτε πρόβλημα, μη διστάσετε να το αναφέρετε στον {issuetracker}ιχνηλάτη ζητημάτων μας{linkend}. Και εάν θέλετε να συμμετέχετε, ελάτε στην {designteam}ομάδα σχεδιασμού μας{linkend}!", + "Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Σε ορισμένες περιπτώσεις, οι συντομεύσεις πληκτρολογίου μπορεί να επηρεάσουν τα εργαλεία προσβασιμότητας. Για να επιτρέψετε τη σωστή εστίαση στο εργαλείο σας, μπορείτε να απενεργοποιήσετε όλες τις συντομεύσεις πληκτρολογίου εδώ. Αυτό θα απενεργοποιήσει επίσης όλες τις διαθέσιμες συντομεύσεις στις εφαρμογές.", + "Disable all keyboard shortcuts" : "Απενεργοποίηση των συντομεύσεων πληκτρολογίου", + "Move up" : "Μετακίνηση επάνω", + "Move down" : "Μετακίνηση Κάτω", + "Plain background" : "Απλό παρασκήνιο", + "Select a custom color" : "Επιλογή προσαρμοσμένου χρώματος", + "Reset to default" : "Επαναφορά στα προεπιλεγμένα", + "Upload" : "Μεταφόρτωση", + "Remove background image" : "Αφαίρεση εικόνας παρασκηνίου", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Η πρόσβαση από όλους είναι πολύ σημαντική για εμάς. Ακολουθούμε τα πρότυπα του διαδικτύου και ελέγχουμε ότι τα πάντα μπορούν να χρησιμοποιηθούν χωρίς ποντίκι και βοηθητικό λογισμικό όπως προγράμματα ανάγνωσης οθόνης. Στόχος μας είναι να συμμορφωνόμαστε με τις {guidelines}Προδιαγραφές πρόσβασης περιεχομένου Ιστού{linkend} 2.1 σε επίπεδο AA, με το θέμα υψηλής αντίθεσης ακόμη και σε επίπεδο ΑΑΑ." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/el.json b/apps/theming/l10n/el.json new file mode 100644 index 00000000000..941211fb928 --- /dev/null +++ b/apps/theming/l10n/el.json @@ -0,0 +1,76 @@ +{ "translations": { + "The given name is too long" : "Το όνομα που δόθηκε είναι πολύ μεγάλο", + "The given web address is too long" : "Η διεύθυνση ιστοσελίδας που δόθηκε είναι πολύ μεγάλη.", + "The given web address is not a valid URL" : "Η διεύθυνση ιστοχώρου δεν είναι έγκυρη URL", + "The given legal notice address is too long" : "Η διεύθυνση ειδοποίησης είναι πολύ μεγάλη", + "The given legal notice address is not a valid URL" : "Η διεύθυνση νομικής ειδοποίησης δεν είναι έγκυρη διεύθυνση URL", + "The given privacy policy address is too long" : "Η διεύθυνση πολιτικής απορρήτου είναι πολύ μεγάλη", + "The given privacy policy address is not a valid URL" : "Η διεύθυνση πολιτικής απορρήτου δεν είναι έγκυρη διεύθυνση URL", + "The given slogan is too long" : "Το ρητό που δόθηκε είναι πολύ μεγάλο", + "The given color is invalid" : "Δόθηκε μη έγκυρο χρώμα", + "Saved" : "Αποθηκεύτηκαν", + "The file was uploaded" : "Το αρχείο μεταφορτώθηκε", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία upload_max_filesize στο php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Το μεταφορτωμένο αρχείο υπερβαίνει την οδηγία MAX_FILE_SIZE που καθορίστηκε στην φόρμα HTML.", + "The file was only partially uploaded" : "Το αρχείο μεταφορτώθηκε εν μέρει", + "No file was uploaded" : "Δεν μεταφορτώθηκε κάποιο αρχείο", + "Missing a temporary folder" : "Λείπει κάποιος προσωρινός φάκελος", + "Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο", + "A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου", + "No file uploaded" : "Δεν έχει μεταφορτωθεί αρχείο", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Χρησιμοποιείτε ήδη προσαρμοσμένο θέμα. Οι ρυθμίσεις της εφαρμογής Θέματα μπορεί να αντικατασταθούν από αυτό.", + "Theming" : "Προσαρμογή θέματος", + "Appearance and accessibility" : "Εμφάνιση και προσβασιμότητα", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Το άρθρωμα PHP \"imagick\" δεν είναι ενεργοποιημένο αν και η εφαρμογή θεματοποίησης είναι. Για να λειτουργήσει σωστά η δημιουργία favicon, πρέπει να εγκαταστήσετε και να ενεργοποιήσετε αυτό το άρθρωμα.", + "Dark theme with high contrast mode" : "Σκούρο θέμα με λειτουργία υψηλής αντίθεσης", + "Enable dark high contrast mode" : "Ενεργοποίηση σκοτεινής λειτουργίας υψηλής αντίθεσης", + "Similar to the high contrast mode, but with dark colours." : "Παρόμοιο με τη λειτουργία υψηλής αντίθεσης, αλλά με σκούρα χρώματα.", + "Dark theme" : "Σκούρο θέμα", + "Enable dark theme" : "Ενεργοποίηση σκούρου θέματος", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ένα σκούρο θέμα που διευκολύνει τα μάτια σας μειώνοντας τη συνολική ακτινοβολία και φωτεινότητα.", + "System default theme" : "Προεπιλεγμένο θέμα συστήματος", + "Enable the system default" : "Ενεργοποίηση προεπιλογής συστήματος", + "Using the default system appearance." : "Χρήση της προεπιλεγμένης εμφάνισης του συστήματος.", + "Dyslexia font" : "Γραμματοσειρά για δυσλεκτικούς", + "Enable dyslexia font" : "Ενεργοποίηση γραμματοσειράς για δυσλεκτικούς", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Η OpenDyslexic είναι μία δωρεάν γραμματοσειρά σχεδιασμένη ώστε να περιορίζει ορισμένα από τα πιο συνήθη λάθη που προκαλεί η δυσλεξία στην ανάγνωση", + "High contrast mode" : "Λειτουργία υψηλής αντίθεσης", + "Enable high contrast mode" : "Ενεργοποίηση λειτουργίας υψηλής αντίθεσης", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Λειτουργία με υψηλή αντίθεση για να διευκολύνει την πλοήγηση σας. Η οπτική ποιότητα θα είναι μειωμένη αλλά θα έχετε υψηλότερη ευκρίνεια.", + "Light theme" : "Φωτεινό θέμα", + "Enable the default light theme" : "Ενεργοποίηση φωτεινού θέματος", + "The default light appearance." : "Η προεπιλεγμένη ανοιχτόχρωμη εμφάνιση.", + "Legal notice" : "Νομική ειδοποίηση", + "Privacy policy" : "Πολιτική Απορρήτου", + "Adjust the Nextcloud theme" : "Προσαρμόστε το θέμα του Nextcloud", + "Name" : "Όνομα", + "Web link" : "Σύνδεσμος ιστού", + "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", + "Slogan" : "Ρητό", + "Legal notice link" : "Σύνδεσμος νομικής ειδοποίησης", + "Privacy policy link" : "Σύνδεσμος πολιτικής απορρήτου", + "Header logo" : "Λογότυπο επικεφαλίδας", + "Upload new header logo" : "Μεταφόρτωση νέου λογοτύπου επικεφαλίδας", + "Favicon" : "Favicon", + "Upload new favicon" : "Μεταφόρτωση νέου favicon", + "User settings" : "Ρυθμίσεις χρήστη", + "Disable user theming" : "Απενεργοποίηση θεμάτων χρήστη", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Η προσαρμογή θέματος καθιστά δυνατή την εύκολη προσαρμογή της εμφάνισης της εγκατάστασής σας καθώς και των υποστηριζόμενων πελατών. Θα είναι ορατή για όλους τους χρήστες.", + "Upload new logo" : "Μεταφόρτωση νέου λογοτύπου", + "Logo" : "Λογότυπο", + "Background and login image" : "Παρασκήνιο και εικόνα εισόδου", + "Advanced options" : "Επιλογές για προχωρημένους", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Εάν εντοπίσετε οποιοδήποτε πρόβλημα, μη διστάσετε να το αναφέρετε στον {issuetracker}ιχνηλάτη ζητημάτων μας{linkend}. Και εάν θέλετε να συμμετέχετε, ελάτε στην {designteam}ομάδα σχεδιασμού μας{linkend}!", + "Keyboard shortcuts" : "Συντομεύσεις πληκτρολογίου", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Σε ορισμένες περιπτώσεις, οι συντομεύσεις πληκτρολογίου μπορεί να επηρεάσουν τα εργαλεία προσβασιμότητας. Για να επιτρέψετε τη σωστή εστίαση στο εργαλείο σας, μπορείτε να απενεργοποιήσετε όλες τις συντομεύσεις πληκτρολογίου εδώ. Αυτό θα απενεργοποιήσει επίσης όλες τις διαθέσιμες συντομεύσεις στις εφαρμογές.", + "Disable all keyboard shortcuts" : "Απενεργοποίηση των συντομεύσεων πληκτρολογίου", + "Move up" : "Μετακίνηση επάνω", + "Move down" : "Μετακίνηση Κάτω", + "Plain background" : "Απλό παρασκήνιο", + "Select a custom color" : "Επιλογή προσαρμοσμένου χρώματος", + "Reset to default" : "Επαναφορά στα προεπιλεγμένα", + "Upload" : "Μεταφόρτωση", + "Remove background image" : "Αφαίρεση εικόνας παρασκηνίου", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Η πρόσβαση από όλους είναι πολύ σημαντική για εμάς. Ακολουθούμε τα πρότυπα του διαδικτύου και ελέγχουμε ότι τα πάντα μπορούν να χρησιμοποιηθούν χωρίς ποντίκι και βοηθητικό λογισμικό όπως προγράμματα ανάγνωσης οθόνης. Στόχος μας είναι να συμμορφωνόμαστε με τις {guidelines}Προδιαγραφές πρόσβασης περιεχομένου Ιστού{linkend} 2.1 σε επίπεδο AA, με το θέμα υψηλής αντίθεσης ακόμη και σε επίπεδο ΑΑΑ." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/en_GB.js b/apps/theming/l10n/en_GB.js new file mode 100644 index 00000000000..a37c07fb532 --- /dev/null +++ b/apps/theming/l10n/en_GB.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given web address is not a valid URL" : "The given web address is not a valid URL", + "The given legal notice address is too long" : "The given legal notice address is too long", + "The given legal notice address is not a valid URL" : "The given legal notice address is not a valid URL", + "The given privacy policy address is too long" : "The given privacy policy address is too long", + "The given privacy policy address is not a valid URL" : "The given privacy policy address is not a valid URL", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "Disable-user-theming should be true or false" : "Disable-user-theming should be true or false", + "Saved" : "Saved", + "Invalid app given" : "Invalid app given", + "Invalid type for setting \"defaultApp\" given" : "Invalid type for setting \"defaultApp\" given", + "Invalid setting key" : "Invalid setting key", + "The file was uploaded" : "The file was uploaded", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", + "The file was only partially uploaded" : "The file was only partially uploaded", + "No file was uploaded" : "No file was uploaded", + "Missing a temporary folder" : "Missing a temporary folder", + "Could not write file to disk" : "Could not write file to disk", + "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", + "No file uploaded" : "No file uploaded", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "You are already using a custom theme. Theming app settings might be overwritten by that.", + "Theming" : "Theming", + "Appearance and accessibility" : "Appearance and accessibility", + "PHP Imagick module" : "PHP Imagick module", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it.", + "Dark theme with high contrast mode" : "Dark theme with high contrast mode", + "Enable dark high contrast mode" : "Enable dark high contrast mode", + "Similar to the high contrast mode, but with dark colours." : "Similar to the high contrast mode, but with dark colours.", + "Dark theme" : "Dark theme", + "Enable dark theme" : "Enable dark theme", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "A dark theme that is soothing for your eyes (by reducing the overall luminosity and brightness).", + "System default theme" : "System default theme", + "Enable the system default" : "Enable the system default", + "Using the default system appearance." : "Using the default system appearance.", + "Dyslexia font" : "Dyslexia font", + "Enable dyslexia font" : "Enable dyslexia font", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia.", + "High contrast mode" : "High contrast mode", + "Enable high contrast mode" : "Enable high contrast mode", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.", + "Light theme" : "Light theme", + "Enable the default light theme" : "Enable the default light theme", + "The default light appearance." : "The default light appearance.", + "Legal notice" : "Legal notice", + "Privacy policy" : "Privacy policy", + "Adjust the Nextcloud theme" : "Adjust the Nextcloud theme", + "Name" : "Name", + "Web link" : "Web link", + "a safe home for all your data" : "a safe home for all your data", + "Slogan" : "Slogan", + "Primary color" : "Primary color", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema.", + "Legal notice link" : "Legal notice link", + "Privacy policy link" : "Privacy policy link", + "Header logo" : "Header logo", + "Upload new header logo" : "Upload new header logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload new favicon", + "User settings" : "User settings", + "Disable user theming" : "Disable user theming", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons.", + "Background color" : "Background color", + "Upload new logo" : "Upload new logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Background and login image", + "Advanced options" : "Advanced options", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and colour.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Unable to apply the setting." : "Unable to apply the setting.", + "Appearance and accessibility settings" : "Appearance and accessibility settings", + "Misc accessibility options" : "Misc accessibility options", + "Enable blur background filter (may increase GPU load)" : "Enable blur background filter (may increase GPU load)", + "Customization has been disabled by your administrator" : "Customization has been disabled by your administrator", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.", + "Background and color" : "Background and colour", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "The background can be set to an image from the default set, a custom uploaded image, or a plain color.", + "Keyboard shortcuts" : "Keyboard shortcuts", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "Disable all keyboard shortcuts", + "Current selected app: {app}, position {position} of {total}" : "Current selected app: {app}, position {position} of {total}", + "Move up" : "Move up", + "Move down" : "Move down", + "Select a background from your files" : "Select a background from your files", + "Select background" : "Select background", + "No background has been selected" : "No background has been selected", + "Custom background" : "Custom background", + "Plain background" : "Plain background", + "Default background" : "Default background", + "Theme selection is enforced" : "Theme selection is enforced", + "Could not set the app order" : "Could not set the app order", + "Could not reset the app order" : "Could not reset the app order", + "Navigation bar settings" : "Navigation bar settings", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo.", + "The default app can not be changed because it was configured by the administrator." : "The default app can not be changed because it was configured by the administrator.", + "The app order was changed, to see it in action you have to reload the page." : "The app order was changed, to see it in action you have to reload the page.", + "Reset default app order" : "Reset default app order", + "Could not set primary color" : "Could not set primary color", + "Reset primary color" : "Reset primary color", + "Could not set global default apps" : "Could not set global default apps", + "Default app" : "Default app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.", + "Use custom default app" : "Use custom default app", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "Default app priority", + "If an app is not enabled for a user, the next app with lower priority is used." : "If an app is not enabled for a user, the next app with lower priority is used.", + "Select a custom color" : "Select a custom colour", + "Reset to default" : "Reset to default", + "Upload" : "Upload", + "Remove background image" : "Remove background image", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.", + ". Unable to apply the setting." : ". Unable to apply the setting." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/en_GB.json b/apps/theming/l10n/en_GB.json new file mode 100644 index 00000000000..7692ed2d4d8 --- /dev/null +++ b/apps/theming/l10n/en_GB.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given web address is not a valid URL" : "The given web address is not a valid URL", + "The given legal notice address is too long" : "The given legal notice address is too long", + "The given legal notice address is not a valid URL" : "The given legal notice address is not a valid URL", + "The given privacy policy address is too long" : "The given privacy policy address is too long", + "The given privacy policy address is not a valid URL" : "The given privacy policy address is not a valid URL", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "Disable-user-theming should be true or false" : "Disable-user-theming should be true or false", + "Saved" : "Saved", + "Invalid app given" : "Invalid app given", + "Invalid type for setting \"defaultApp\" given" : "Invalid type for setting \"defaultApp\" given", + "Invalid setting key" : "Invalid setting key", + "The file was uploaded" : "The file was uploaded", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", + "The file was only partially uploaded" : "The file was only partially uploaded", + "No file was uploaded" : "No file was uploaded", + "Missing a temporary folder" : "Missing a temporary folder", + "Could not write file to disk" : "Could not write file to disk", + "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", + "No file uploaded" : "No file uploaded", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "You are already using a custom theme. Theming app settings might be overwritten by that.", + "Theming" : "Theming", + "Appearance and accessibility" : "Appearance and accessibility", + "PHP Imagick module" : "PHP Imagick module", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it.", + "Dark theme with high contrast mode" : "Dark theme with high contrast mode", + "Enable dark high contrast mode" : "Enable dark high contrast mode", + "Similar to the high contrast mode, but with dark colours." : "Similar to the high contrast mode, but with dark colours.", + "Dark theme" : "Dark theme", + "Enable dark theme" : "Enable dark theme", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "A dark theme that is soothing for your eyes (by reducing the overall luminosity and brightness).", + "System default theme" : "System default theme", + "Enable the system default" : "Enable the system default", + "Using the default system appearance." : "Using the default system appearance.", + "Dyslexia font" : "Dyslexia font", + "Enable dyslexia font" : "Enable dyslexia font", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia.", + "High contrast mode" : "High contrast mode", + "Enable high contrast mode" : "Enable high contrast mode", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.", + "Light theme" : "Light theme", + "Enable the default light theme" : "Enable the default light theme", + "The default light appearance." : "The default light appearance.", + "Legal notice" : "Legal notice", + "Privacy policy" : "Privacy policy", + "Adjust the Nextcloud theme" : "Adjust the Nextcloud theme", + "Name" : "Name", + "Web link" : "Web link", + "a safe home for all your data" : "a safe home for all your data", + "Slogan" : "Slogan", + "Primary color" : "Primary color", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema.", + "Legal notice link" : "Legal notice link", + "Privacy policy link" : "Privacy policy link", + "Header logo" : "Header logo", + "Upload new header logo" : "Upload new header logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload new favicon", + "User settings" : "User settings", + "Disable user theming" : "Disable user theming", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons.", + "Background color" : "Background color", + "Upload new logo" : "Upload new logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Background and login image", + "Advanced options" : "Advanced options", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and colour.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Unable to apply the setting." : "Unable to apply the setting.", + "Appearance and accessibility settings" : "Appearance and accessibility settings", + "Misc accessibility options" : "Misc accessibility options", + "Enable blur background filter (may increase GPU load)" : "Enable blur background filter (may increase GPU load)", + "Customization has been disabled by your administrator" : "Customization has been disabled by your administrator", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.", + "Background and color" : "Background and colour", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "The background can be set to an image from the default set, a custom uploaded image, or a plain color.", + "Keyboard shortcuts" : "Keyboard shortcuts", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "Disable all keyboard shortcuts", + "Current selected app: {app}, position {position} of {total}" : "Current selected app: {app}, position {position} of {total}", + "Move up" : "Move up", + "Move down" : "Move down", + "Select a background from your files" : "Select a background from your files", + "Select background" : "Select background", + "No background has been selected" : "No background has been selected", + "Custom background" : "Custom background", + "Plain background" : "Plain background", + "Default background" : "Default background", + "Theme selection is enforced" : "Theme selection is enforced", + "Could not set the app order" : "Could not set the app order", + "Could not reset the app order" : "Could not reset the app order", + "Navigation bar settings" : "Navigation bar settings", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo.", + "The default app can not be changed because it was configured by the administrator." : "The default app can not be changed because it was configured by the administrator.", + "The app order was changed, to see it in action you have to reload the page." : "The app order was changed, to see it in action you have to reload the page.", + "Reset default app order" : "Reset default app order", + "Could not set primary color" : "Could not set primary color", + "Reset primary color" : "Reset primary color", + "Could not set global default apps" : "Could not set global default apps", + "Default app" : "Default app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.", + "Use custom default app" : "Use custom default app", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "Default app priority", + "If an app is not enabled for a user, the next app with lower priority is used." : "If an app is not enabled for a user, the next app with lower priority is used.", + "Select a custom color" : "Select a custom colour", + "Reset to default" : "Reset to default", + "Upload" : "Upload", + "Remove background image" : "Remove background image", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.", + ". Unable to apply the setting." : ". Unable to apply the setting." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/es.js b/apps/theming/l10n/es.js new file mode 100644 index 00000000000..99c2628472e --- /dev/null +++ b/apps/theming/l10n/es.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "El nombre provisto es demasiado largo", + "The given web address is too long" : "La dirección web es demasiado larga", + "The given web address is not a valid URL" : "La dirección web indicada no es una URL válida", + "The given legal notice address is too long" : "El aviso legal dado es demasiado largo", + "The given legal notice address is not a valid URL" : "La dirección del aviso legal no es una URL válida", + "The given privacy policy address is too long" : "La dirección de la política de privacidad dada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La directive de privacidad indicada no es una URL válida", + "The given slogan is too long" : "El eslogan provisto es demasiado largo", + "The given color is invalid" : "El color provisto es inválido", + "Disable-user-theming should be true or false" : "Deshabilitar-tematización-de-usuario debe ser verdadero o falso", + "Saved" : "Guardado", + "Invalid app given" : "Aplicación inválida seleccionada", + "Invalid type for setting \"defaultApp\" given" : "El ajuste \"defaultApp\" tiene un tipo incorrecto", + "Invalid setting key" : "Ajuste inválido", + "The file was uploaded" : "Se ha subido el archivo", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo para subir excede la directiva upload_max_filesize en php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo para subir excede la directiva MAX_FILE_SIZE que se especificó en el formulario HTML", + "The file was only partially uploaded" : "El archivo se ha subido solo parcialmente", + "No file was uploaded" : "No se ha subido ningún archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No se puede escribir el archivo en el disco", + "A PHP extension stopped the file upload" : "Una extensión PHP ha cancelado la subida de archivos", + "No file uploaded" : "No se ha subido archivo", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya estás usando un tema personalizado. La configuración de la aplicación de temas puede ser sobrescrita por el.", + "Theming" : "Tema", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "PHP Imagick module" : "Módulo PHP imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El módulo PHP \"imagick\" no está habilitado, sin embargo la aplicación Temas sí lo está. Para que la generación de favicon funcione correctamente, es necesario instalar y habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulo PHP \"imagick\" de esta instancia no tiene soporte para SVG. Para una mejor compatibilidad es recomendable instalarlo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros", + "Dark theme" : "Tema oscuro", + "Enable dark theme" : "Activar tema oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro para aliviar tu vista, reduciendo la luminosidad y el brillo de la pantalla", + "System default theme" : "Tema por defecto del sistema", + "Enable the system default" : "Habilitar el por defecto del sistema", + "Using the default system appearance." : "Utilizando la apariencia por defecto del sistema", + "Dyslexia font" : "Tipo de letra para dislexia", + "Enable dyslexia font" : "Activa tipo de letra para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra libre diseñada para reducir algunos de los errores de lectura comunes causados por la dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Activar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar la navegación. Se reducirá la calidad visual pero se aumentará la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar el tema claro", + "The default light appearance." : "La apariencia clara por defecto", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajusta el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un hogar seguro para todos tus datos", + "Slogan" : "Eslogan", + "Primary color" : "Color primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primario se utiliza para destacar elementos, como botones importantes. Podría ajustarse ligeramente en función del esquema de colores actual.", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Enlace a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Subir nuevo logo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Subir nuevo favicon", + "User settings" : "Ajustes de usuario", + "Disable user theming" : "Deshabilitar tematización de usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puede seleccionar y personalizar su instancia, los usuarios pueden cambiar su fondo y colores. Si quiere forzar su propia personalización, puede activar esto.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los temas hacen posible personalizar fácilmente la apariencia de tu instancia y los clientes soportados. Esto será visible para todos los usuarios.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En lugar de una imagen de fondo, también puedes configurar un color de fondo. Si utilizas una imagen de fondo, cambiar este color cambiará el color de los iconos del menú de aplicaciones.", + "Background color" : "Color de fondo", + "Upload new logo" : "Subir nuevo logo", + "Logo" : "Logo", + "Upload new background and login image" : "Cargar una nueva imagen de fondo y de inicio de sesión", + "Background and login image" : "Imágen de fondo y de inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale la extensión PHP ImageMagick con soporte a imágenes SVG para generar automáticamente favicons basados en el logo cargado y el color.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos para asegurarnos de que todo sea utilizable incluso sin ratón y con software de asistencia tales como lectores de pantalla. Nuestro objetivo es cumplir con las {linkstart}Directrices de Accesibilidad para el Contenido Web{linkend} 2.1 en el nivel AA, incluso con el tema de alto contraste en el nivel AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra cualquier problema, no dude en reportarlo en {issuetracker}nuestra herramienta de rastreo de problemas{linkend}. Y, si desea involucrarse, ¡venga y únase a {designteam},nuestro equipo de diseño{linkend}!", + "Unable to apply the setting." : "No fue posible aplicar el ajuste.", + "Appearance and accessibility settings" : "Ajustes de apariencia y accesibilidad", + "Misc accessibility options" : "Opciones de accesibilidad misceláneas", + "Enable blur background filter (may increase GPU load)" : "Activar el desenfoque del fondo (puede aumentar el uso de GPU)", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por su administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Establece un color primario para destacar elementos importantes. El color usado para elementos como botones primarios puede cambiar ligeramente para cumplir con requisitos de accesibilidad.", + "Background and color" : "Fondo y color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fondo puede ser una imagen por defecto, una imagen personalizada o un color plano.", + "Keyboard shortcuts" : "Atajos de teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. De manera de permitir enfocar correctamente su herramienta, puede deshabilitar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada: {app}, posición {position} de {total}", + "Move up" : "Mover hacia arriba", + "Move down" : "Mover hacia abajo", + "Select a background from your files" : "Seleccione un fondo desde sus archivos", + "Select background" : "Seleccione fondo", + "No background has been selected" : "No se ha seleccionado un fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo liso", + "Default background" : "Fondo por defecto", + "Theme selection is enforced" : "La selección del tema es obligatoria", + "Could not set the app order" : "No se pudo guardar el orden de aplicaciones", + "Could not reset the app order" : "No se pudo restaurar el orden de aplicaciones", + "Navigation bar settings" : "Ajustes de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puede configurar el orden de las aplicaciones en la barra de navegación. La primera entrada será la aplicación por defecto, que se abrirá luego de iniciar sesión o al hacer clic en el logo.", + "The default app can not be changed because it was configured by the administrator." : "La aplicación por defecto no se puede cambiar porque ha sido configurada por el administrador.", + "The app order was changed, to see it in action you have to reload the page." : "El orden de aplicaciones ha sido cambiado, para ver el cambio, recarga la página.", + "Reset default app order" : "Restaurar el orden de aplicaciones por defecto", + "Could not set primary color" : "No se pudo establecer el color primario", + "Reset primary color" : "Restablecer el color primario", + "Could not set global default apps" : "No se pudo guardar los ajustes de aplicación por defecto global", + "Default app" : "Aplicación por defecto", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "La aplicación por defecto es la que se mostrará al iniciar sesión o al pulsar el logo en el menú.", + "Use custom default app" : "Usar aplicación por defecto personalizada", + "Global default app" : "Aplicación por defecto global", + "Global default apps" : "Aplicaciones por defecto globales", + "Default app priority" : "Prioridad de aplicaciones para mostrarse por defecto", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación no está habilitada para un usuario, la siguiente aplicación por orden de prioridad será seleccionada.", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Vovler a configuración por defecto", + "Upload" : "Subir", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos para asegurarnos de que todo sea utilizable incluso sin ratón y con software de asistencia tales como lectores de pantalla. Nuestro objetivo es cumplir con las {guidelines}Directrices de Accesibilidad para el Contenido Web{linkend} 2.1 en el nivel AA, incluso con el tema de alto contraste en el nivel AAA.", + ". Unable to apply the setting." : ". No fue posible aplicar el ajuste." +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/es.json b/apps/theming/l10n/es.json new file mode 100644 index 00000000000..740a376c13a --- /dev/null +++ b/apps/theming/l10n/es.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "El nombre provisto es demasiado largo", + "The given web address is too long" : "La dirección web es demasiado larga", + "The given web address is not a valid URL" : "La dirección web indicada no es una URL válida", + "The given legal notice address is too long" : "El aviso legal dado es demasiado largo", + "The given legal notice address is not a valid URL" : "La dirección del aviso legal no es una URL válida", + "The given privacy policy address is too long" : "La dirección de la política de privacidad dada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La directive de privacidad indicada no es una URL válida", + "The given slogan is too long" : "El eslogan provisto es demasiado largo", + "The given color is invalid" : "El color provisto es inválido", + "Disable-user-theming should be true or false" : "Deshabilitar-tematización-de-usuario debe ser verdadero o falso", + "Saved" : "Guardado", + "Invalid app given" : "Aplicación inválida seleccionada", + "Invalid type for setting \"defaultApp\" given" : "El ajuste \"defaultApp\" tiene un tipo incorrecto", + "Invalid setting key" : "Ajuste inválido", + "The file was uploaded" : "Se ha subido el archivo", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo para subir excede la directiva upload_max_filesize en php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo para subir excede la directiva MAX_FILE_SIZE que se especificó en el formulario HTML", + "The file was only partially uploaded" : "El archivo se ha subido solo parcialmente", + "No file was uploaded" : "No se ha subido ningún archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No se puede escribir el archivo en el disco", + "A PHP extension stopped the file upload" : "Una extensión PHP ha cancelado la subida de archivos", + "No file uploaded" : "No se ha subido archivo", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya estás usando un tema personalizado. La configuración de la aplicación de temas puede ser sobrescrita por el.", + "Theming" : "Tema", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "PHP Imagick module" : "Módulo PHP imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "El módulo PHP \"imagick\" no está habilitado, sin embargo la aplicación Temas sí lo está. Para que la generación de favicon funcione correctamente, es necesario instalar y habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulo PHP \"imagick\" de esta instancia no tiene soporte para SVG. Para una mejor compatibilidad es recomendable instalarlo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros", + "Dark theme" : "Tema oscuro", + "Enable dark theme" : "Activar tema oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro para aliviar tu vista, reduciendo la luminosidad y el brillo de la pantalla", + "System default theme" : "Tema por defecto del sistema", + "Enable the system default" : "Habilitar el por defecto del sistema", + "Using the default system appearance." : "Utilizando la apariencia por defecto del sistema", + "Dyslexia font" : "Tipo de letra para dislexia", + "Enable dyslexia font" : "Activa tipo de letra para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra libre diseñada para reducir algunos de los errores de lectura comunes causados por la dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Activar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar la navegación. Se reducirá la calidad visual pero se aumentará la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar el tema claro", + "The default light appearance." : "La apariencia clara por defecto", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajusta el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un hogar seguro para todos tus datos", + "Slogan" : "Eslogan", + "Primary color" : "Color primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primario se utiliza para destacar elementos, como botones importantes. Podría ajustarse ligeramente en función del esquema de colores actual.", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Enlace a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Subir nuevo logo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Subir nuevo favicon", + "User settings" : "Ajustes de usuario", + "Disable user theming" : "Deshabilitar tematización de usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puede seleccionar y personalizar su instancia, los usuarios pueden cambiar su fondo y colores. Si quiere forzar su propia personalización, puede activar esto.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los temas hacen posible personalizar fácilmente la apariencia de tu instancia y los clientes soportados. Esto será visible para todos los usuarios.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En lugar de una imagen de fondo, también puedes configurar un color de fondo. Si utilizas una imagen de fondo, cambiar este color cambiará el color de los iconos del menú de aplicaciones.", + "Background color" : "Color de fondo", + "Upload new logo" : "Subir nuevo logo", + "Logo" : "Logo", + "Upload new background and login image" : "Cargar una nueva imagen de fondo y de inicio de sesión", + "Background and login image" : "Imágen de fondo y de inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale la extensión PHP ImageMagick con soporte a imágenes SVG para generar automáticamente favicons basados en el logo cargado y el color.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos para asegurarnos de que todo sea utilizable incluso sin ratón y con software de asistencia tales como lectores de pantalla. Nuestro objetivo es cumplir con las {linkstart}Directrices de Accesibilidad para el Contenido Web{linkend} 2.1 en el nivel AA, incluso con el tema de alto contraste en el nivel AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra cualquier problema, no dude en reportarlo en {issuetracker}nuestra herramienta de rastreo de problemas{linkend}. Y, si desea involucrarse, ¡venga y únase a {designteam},nuestro equipo de diseño{linkend}!", + "Unable to apply the setting." : "No fue posible aplicar el ajuste.", + "Appearance and accessibility settings" : "Ajustes de apariencia y accesibilidad", + "Misc accessibility options" : "Opciones de accesibilidad misceláneas", + "Enable blur background filter (may increase GPU load)" : "Activar el desenfoque del fondo (puede aumentar el uso de GPU)", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por su administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Establece un color primario para destacar elementos importantes. El color usado para elementos como botones primarios puede cambiar ligeramente para cumplir con requisitos de accesibilidad.", + "Background and color" : "Fondo y color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fondo puede ser una imagen por defecto, una imagen personalizada o un color plano.", + "Keyboard shortcuts" : "Atajos de teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. De manera de permitir enfocar correctamente su herramienta, puede deshabilitar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada: {app}, posición {position} de {total}", + "Move up" : "Mover hacia arriba", + "Move down" : "Mover hacia abajo", + "Select a background from your files" : "Seleccione un fondo desde sus archivos", + "Select background" : "Seleccione fondo", + "No background has been selected" : "No se ha seleccionado un fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo liso", + "Default background" : "Fondo por defecto", + "Theme selection is enforced" : "La selección del tema es obligatoria", + "Could not set the app order" : "No se pudo guardar el orden de aplicaciones", + "Could not reset the app order" : "No se pudo restaurar el orden de aplicaciones", + "Navigation bar settings" : "Ajustes de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puede configurar el orden de las aplicaciones en la barra de navegación. La primera entrada será la aplicación por defecto, que se abrirá luego de iniciar sesión o al hacer clic en el logo.", + "The default app can not be changed because it was configured by the administrator." : "La aplicación por defecto no se puede cambiar porque ha sido configurada por el administrador.", + "The app order was changed, to see it in action you have to reload the page." : "El orden de aplicaciones ha sido cambiado, para ver el cambio, recarga la página.", + "Reset default app order" : "Restaurar el orden de aplicaciones por defecto", + "Could not set primary color" : "No se pudo establecer el color primario", + "Reset primary color" : "Restablecer el color primario", + "Could not set global default apps" : "No se pudo guardar los ajustes de aplicación por defecto global", + "Default app" : "Aplicación por defecto", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "La aplicación por defecto es la que se mostrará al iniciar sesión o al pulsar el logo en el menú.", + "Use custom default app" : "Usar aplicación por defecto personalizada", + "Global default app" : "Aplicación por defecto global", + "Global default apps" : "Aplicaciones por defecto globales", + "Default app priority" : "Prioridad de aplicaciones para mostrarse por defecto", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación no está habilitada para un usuario, la siguiente aplicación por orden de prioridad será seleccionada.", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Vovler a configuración por defecto", + "Upload" : "Subir", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos para asegurarnos de que todo sea utilizable incluso sin ratón y con software de asistencia tales como lectores de pantalla. Nuestro objetivo es cumplir con las {guidelines}Directrices de Accesibilidad para el Contenido Web{linkend} 2.1 en el nivel AA, incluso con el tema de alto contraste en el nivel AAA.", + ". Unable to apply the setting." : ". No fue posible aplicar el ajuste." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/es_EC.js b/apps/theming/l10n/es_EC.js new file mode 100644 index 00000000000..3f5356231c7 --- /dev/null +++ b/apps/theming/l10n/es_EC.js @@ -0,0 +1,87 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given web address is not a valid URL" : "La dirección web proporcionada no es una URL válida", + "The given legal notice address is too long" : "La dirección del aviso legal es demasiado larga", + "The given legal notice address is not a valid URL" : "La dirección de aviso legal proporcionada no es una URL válida", + "The given privacy policy address is too long" : "La dirección de política de privacidad proporcionada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La dirección de política de privacidad proporcionada no es una URL válida", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Disable-user-theming should be true or false" : "disable-user-theming debe ser verdadero (true) o falso (false)", + "Saved" : "Guardado", + "The file was uploaded" : "El archivo fue cargado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo cargado excede el valor establecido en la directiva upload_max_filesize en el archivo php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo cargado excede el valor especificado de la directiva MAX_FILE_SIZE en la forma de HTML", + "The file was only partially uploaded" : "El archivo sólo fue cargado parcialmente", + "No file was uploaded" : "No se cargó el archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No fue posible escribir a disco", + "A PHP extension stopped the file upload" : "Una extensión de PHP detuvo la carga del archivo", + "No file uploaded" : "No hay archivos cargados", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya te encuentras usando un tema personalizado. La aplicación de Temas puede estar siendo sobreescrita por él.", + "Theming" : "Tematizar", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "No se ha habilitado el módulo PHP \"imagick\", aunque está habilitada la aplicación de temas. Para que la generación de favicon funcione correctamente, debe instalar y habilitar este módulo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros.", + "Dark theme" : "Tema Oscuro", + "Enable dark theme" : "Activar Tema Oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro que facilita la vista al reducir la luminosidad y el brillo general.", + "System default theme" : "Tema predeterminado del sistema", + "Enable the system default" : "Activar la apariencia predeterminada del sistema", + "Using the default system appearance." : "Usar la apariencia predeterminada del sistema.", + "Dyslexia font" : "Fuente dislexia", + "Enable dyslexia font" : "Habilitar Fuente dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra / fuente gratuito diseñado para mitigar algunos de los errores de lectura comunes causados por la dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Habilitar el modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar el tema claro predeterminado", + "The default light appearance." : "La apariencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajustar el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un lugar seguro para todos tus datos", + "Slogan" : "Lema", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Enlace a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Cargar un nuevo logotipo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Cargar un nuevo favicon", + "User settings" : "Configuración de usuario", + "Disable user theming" : "Deshabilitar la personalización del usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puedes seleccionar y personalizar tu instancia, los usuarios pueden cambiar su fondo y colores. Si deseas aplicar tu personalización, puedes activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve tu instancia y clientes soportados. Esto será visible para todos los usuarios. ", + "Upload new logo" : "Cargar nuevo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Cargar nueva imagen de fondo y de inicio de sesión", + "Background and login image" : "Imagen de fondo y de inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instala la extensión de PHP ImageMagick con soporte para imágenes SVG para generar automáticamente los favicons basados en el logotipo y color cargados.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentras algún problema, no dudes en informarlo en {issuetracker}nuestro sistema de seguimiento de problemas{linkend}. ¡Y si quieres participar, únete a {designteam}nuestro equipo de diseño{linkend}!", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por tu administrador", + "Keyboard shortcuts" : "Atajos del teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. Para permitir el enfoque correcto en tu herramienta, puedes desactivar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Move up" : "Mover hacia arriba", + "Move down" : "Mover hacia abajo", + "Select a background from your files" : "Selecciona un fondo de tus archivos", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo simple", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "La selección de temas es obligatoria", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Restablecer al predeterminado", + "Upload" : "Cargar", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos que todo sea utilizable también sin mouse y software de asistencia, como lectores de pantalla. Nuestro objetivo es cumplir con las {guidelines} Directrices de accesibilidad al contenido web {linkend} 2.1 en el nivel AA, con el tema de alto contraste incluso en el nivel AAA." +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/es_EC.json b/apps/theming/l10n/es_EC.json new file mode 100644 index 00000000000..01cd1c783ac --- /dev/null +++ b/apps/theming/l10n/es_EC.json @@ -0,0 +1,85 @@ +{ "translations": { + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given web address is not a valid URL" : "La dirección web proporcionada no es una URL válida", + "The given legal notice address is too long" : "La dirección del aviso legal es demasiado larga", + "The given legal notice address is not a valid URL" : "La dirección de aviso legal proporcionada no es una URL válida", + "The given privacy policy address is too long" : "La dirección de política de privacidad proporcionada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La dirección de política de privacidad proporcionada no es una URL válida", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Disable-user-theming should be true or false" : "disable-user-theming debe ser verdadero (true) o falso (false)", + "Saved" : "Guardado", + "The file was uploaded" : "El archivo fue cargado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo cargado excede el valor establecido en la directiva upload_max_filesize en el archivo php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo cargado excede el valor especificado de la directiva MAX_FILE_SIZE en la forma de HTML", + "The file was only partially uploaded" : "El archivo sólo fue cargado parcialmente", + "No file was uploaded" : "No se cargó el archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No fue posible escribir a disco", + "A PHP extension stopped the file upload" : "Una extensión de PHP detuvo la carga del archivo", + "No file uploaded" : "No hay archivos cargados", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya te encuentras usando un tema personalizado. La aplicación de Temas puede estar siendo sobreescrita por él.", + "Theming" : "Tematizar", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "No se ha habilitado el módulo PHP \"imagick\", aunque está habilitada la aplicación de temas. Para que la generación de favicon funcione correctamente, debe instalar y habilitar este módulo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros.", + "Dark theme" : "Tema Oscuro", + "Enable dark theme" : "Activar Tema Oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro que facilita la vista al reducir la luminosidad y el brillo general.", + "System default theme" : "Tema predeterminado del sistema", + "Enable the system default" : "Activar la apariencia predeterminada del sistema", + "Using the default system appearance." : "Usar la apariencia predeterminada del sistema.", + "Dyslexia font" : "Fuente dislexia", + "Enable dyslexia font" : "Habilitar Fuente dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es un tipo de letra / fuente gratuito diseñado para mitigar algunos de los errores de lectura comunes causados por la dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Habilitar el modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar su navegación. Se reducirá la calidad visual pero se aumentará la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar el tema claro predeterminado", + "The default light appearance." : "La apariencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajustar el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un lugar seguro para todos tus datos", + "Slogan" : "Lema", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Enlace a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Cargar un nuevo logotipo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Cargar un nuevo favicon", + "User settings" : "Configuración de usuario", + "Disable user theming" : "Deshabilitar la personalización del usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puedes seleccionar y personalizar tu instancia, los usuarios pueden cambiar su fondo y colores. Si deseas aplicar tu personalización, puedes activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve tu instancia y clientes soportados. Esto será visible para todos los usuarios. ", + "Upload new logo" : "Cargar nuevo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Cargar nueva imagen de fondo y de inicio de sesión", + "Background and login image" : "Imagen de fondo y de inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instala la extensión de PHP ImageMagick con soporte para imágenes SVG para generar automáticamente los favicons basados en el logotipo y color cargados.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentras algún problema, no dudes en informarlo en {issuetracker}nuestro sistema de seguimiento de problemas{linkend}. ¡Y si quieres participar, únete a {designteam}nuestro equipo de diseño{linkend}!", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por tu administrador", + "Keyboard shortcuts" : "Atajos del teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. Para permitir el enfoque correcto en tu herramienta, puedes desactivar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Move up" : "Mover hacia arriba", + "Move down" : "Mover hacia abajo", + "Select a background from your files" : "Selecciona un fondo de tus archivos", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo simple", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "La selección de temas es obligatoria", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Restablecer al predeterminado", + "Upload" : "Cargar", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos que todo sea utilizable también sin mouse y software de asistencia, como lectores de pantalla. Nuestro objetivo es cumplir con las {guidelines} Directrices de accesibilidad al contenido web {linkend} 2.1 en el nivel AA, con el tema de alto contraste incluso en el nivel AAA." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/es_MX.js b/apps/theming/l10n/es_MX.js new file mode 100644 index 00000000000..23a886e8ba8 --- /dev/null +++ b/apps/theming/l10n/es_MX.js @@ -0,0 +1,122 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given web address is not a valid URL" : "La dirección web proporcionada no es una URL válida", + "The given legal notice address is too long" : "La dirección del aviso legal es demasiado larga", + "The given legal notice address is not a valid URL" : "La dirección de aviso legal proporcionada no es una URL válida", + "The given privacy policy address is too long" : "La dirección de la política de privacidad dada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La dirección de política de privacidad proporcionada no es una URL válida", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Disable-user-theming should be true or false" : "Deshabilitar-temas-de-usuario debe ser verdadero o falso", + "Saved" : "Guardado", + "Invalid app given" : "Aplicación proporcionada inválida", + "Invalid type for setting \"defaultApp\" given" : "El tipo de ajuste proporcionado para \"defaultApp\" es inválido", + "Invalid setting key" : "Llave de ajuste inválida", + "The file was uploaded" : "El archivo fue cargado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo cargado excede el valor establecido en la directiva upload_max_filesize en el archivo php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo cargado excede el valor especificado de la directiva MAX_FILE_SIZE en la forma de HTML", + "The file was only partially uploaded" : "El archivo sólo fue cargado parcialmente", + "No file was uploaded" : "No se cargó el archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No fue posible escribir a disco", + "A PHP extension stopped the file upload" : "Una extensión de PHP detuvo la carga del archivo", + "No file uploaded" : "No hay archivos cargados", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya te encuentras usando un tema personalizado. La aplicación de Temas puede estar siendo sobreescrita por él.", + "Theming" : "Tematizar", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "No se ha habilitado el módulo PHP \"imagick\", aunque la aplicación de temas sí. Para que la generación de íconos favoritos funcione correctamente, debe instalar y habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulo PHP \"imagick\" en esta instancia no tiene soporte para SVG. Para una mejor compatibilidad se recomienda instalarlo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Habilitar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros.", + "Dark theme" : "Tema Oscuro", + "Enable dark theme" : "Habilitar tema oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro para aliviar su vista, reduciendo la luminosidad y el brillo generales.", + "System default theme" : "Tema predeterminado del sistema", + "Enable the system default" : "Habilitar el predeterminado del sistema", + "Using the default system appearance." : "Usando la apariencia predeterminada del sistema.", + "Dyslexia font" : "Fuente para dislexia", + "Enable dyslexia font" : "Habilitar fuente para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es una tipografía/fuente diseñada para mitigar algunos de los errores comunes de lectura causados por dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Habilitar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Modo de alto contraste para facilitar tu navegación. La calidad visual puede ser menor pero incrementa la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Habilitar el tema claro predeterminado", + "The default light appearance." : "La apariencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajusta el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un lugar seguro para todos tus datos", + "Slogan" : "Lema", + "Primary color" : "Color primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primario es usado para destacar elementos como botones importantes. Podría ajustarse ligeramente dependiendo del esquema de color actual.", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Liga a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Cargar un nuevo logotipo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Cargar un nuevo favicon", + "User settings" : "Configuración de usuario", + "Disable user theming" : "Deshabilitar los temas de usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puede seleccionar y personalizar su instancia, los usuarios pueden cambiar su fondo y colores. Si quiere forzar su personalización, puede habilitarlo.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve tu instancia y clientes soportados. Esto será visible para todos los usuarios. ", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En vez de una imagen de fondo, también puede configurar un fondo de color plano. Si usa una imagen de fondo, cambiar este color influirá en el color de los íconos del menú de aplicaciones.", + "Background color" : "Color de fondo", + "Upload new logo" : "Cargar nuevo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Cargar nueva imagen de fondo e inicio de sesión", + "Background and login image" : "Imagen de fondo e inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale la extensión PHP ImageMagick con soporte para imágenes SVG para generar automáticamente favicons basados en el logo cargado y el color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra algún problema, no dude en reportarlo en {issuetracker}nuestro sistema de seguimiento de problemas{linkend}. Y si quiere participar, ¡únase a {designteam}nuestro equipo de diseño{linkend}!", + "Appearance and accessibility settings" : "Configuración de apariencia y accesibilidad", + "Misc accessibility options" : "Opciones de accesibilidad misceláneas", + "Enable blur background filter (may increase GPU load)" : "Habilitar el filtro de desenfoque de fondo (puede incrementar la carga de la GPU)", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por su administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Establecer un color primario para destacar los elementos importantes. El color usado para elementos como botones primarios puede diferir ligeramente dado que se ajusta para cumplir con los requerimientos de accesibilidad.", + "Background and color" : "Fondo y color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fondo puede establecerse a una imagen desde el conjunto predeterminado, una imagen subida personalizada, o un color plano.", + "Keyboard shortcuts" : "Atajos del teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. Para permitir el enfoque correcto de su herramienta, puede desactivar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada actualmente: {app}, posición {position} de {total}", + "Move up" : "Mover arriba", + "Move down" : "Mover abajo", + "Select a background from your files" : "Seleccionar un fondo desde sus archivos", + "Select background" : "Seleccionar fondo", + "No background has been selected" : "No se ha seleccionado un fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo liso", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "La selección del tema es obligatoria", + "Could not set the app order" : "No se pudo establecer el orden de aplicaciones", + "Could not reset the app order" : "No se pudo restaurar el orden de aplicaciones", + "Navigation bar settings" : "Configuración de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puede configurar el orden de las aplicaciones en la barra de navegación. La primera será la aplicación predeterminada, que se muestra al iniciar sesión o al hacer clic en el logo.", + "The default app can not be changed because it was configured by the administrator." : "No se puede cambiar la aplicación predeterminada porque fue configurada por el administrador.", + "The app order was changed, to see it in action you have to reload the page." : "El orden de aplicaciones ha cambiado, para poder verlo, recargue la página.", + "Reset default app order" : "Restaurar el orden de aplicaciones predeterminado", + "Could not set primary color" : "No se pudo establecer el color primario", + "Reset primary color" : "Restablecer el color primario", + "Could not set global default apps" : "No se pudieron establecer las aplicaciones predeterminadas globales", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "La aplicación predeterminada es la que se mostrará al iniciar sesión o al hacer clic en el logo del menú.", + "Use custom default app" : "Utilizar la aplicación personalizada predeterminada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicaciones predeterminadas globales", + "Default app priority" : "Prioridad de aplicaciones predeterminada", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación no está habilitada para un usuario, se utilizará la siguiente aplicación por orden de prioridad.", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Restablecer al predeterminado", + "Upload" : "Cargar", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos que todo sea utilizable inclusive sin ratón, y con software de asistencia como lectores de pantalla. Buscamos cumplir con las {guidelines}Guías de Accesibilidad de Contenido Web{linkend} 2.1 sobre nivel AA, incluso sobre nivel AAA para el tema de alto contraste." +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/es_MX.json b/apps/theming/l10n/es_MX.json new file mode 100644 index 00000000000..43e22978767 --- /dev/null +++ b/apps/theming/l10n/es_MX.json @@ -0,0 +1,120 @@ +{ "translations": { + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given web address is not a valid URL" : "La dirección web proporcionada no es una URL válida", + "The given legal notice address is too long" : "La dirección del aviso legal es demasiado larga", + "The given legal notice address is not a valid URL" : "La dirección de aviso legal proporcionada no es una URL válida", + "The given privacy policy address is too long" : "La dirección de la política de privacidad dada es demasiado larga", + "The given privacy policy address is not a valid URL" : "La dirección de política de privacidad proporcionada no es una URL válida", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Disable-user-theming should be true or false" : "Deshabilitar-temas-de-usuario debe ser verdadero o falso", + "Saved" : "Guardado", + "Invalid app given" : "Aplicación proporcionada inválida", + "Invalid type for setting \"defaultApp\" given" : "El tipo de ajuste proporcionado para \"defaultApp\" es inválido", + "Invalid setting key" : "Llave de ajuste inválida", + "The file was uploaded" : "El archivo fue cargado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo cargado excede el valor establecido en la directiva upload_max_filesize en el archivo php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo cargado excede el valor especificado de la directiva MAX_FILE_SIZE en la forma de HTML", + "The file was only partially uploaded" : "El archivo sólo fue cargado parcialmente", + "No file was uploaded" : "No se cargó el archivo", + "Missing a temporary folder" : "Falta una carpeta temporal", + "Could not write file to disk" : "No fue posible escribir a disco", + "A PHP extension stopped the file upload" : "Una extensión de PHP detuvo la carga del archivo", + "No file uploaded" : "No hay archivos cargados", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ya te encuentras usando un tema personalizado. La aplicación de Temas puede estar siendo sobreescrita por él.", + "Theming" : "Tematizar", + "Appearance and accessibility" : "Apariencia y accesibilidad", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "No se ha habilitado el módulo PHP \"imagick\", aunque la aplicación de temas sí. Para que la generación de íconos favoritos funcione correctamente, debe instalar y habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "El módulo PHP \"imagick\" en esta instancia no tiene soporte para SVG. Para una mejor compatibilidad se recomienda instalarlo.", + "Dark theme with high contrast mode" : "Tema oscuro con modo de alto contraste", + "Enable dark high contrast mode" : "Habilitar el modo oscuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Similar al modo de alto contraste, pero con colores oscuros.", + "Dark theme" : "Tema Oscuro", + "Enable dark theme" : "Habilitar tema oscuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema oscuro para aliviar su vista, reduciendo la luminosidad y el brillo generales.", + "System default theme" : "Tema predeterminado del sistema", + "Enable the system default" : "Habilitar el predeterminado del sistema", + "Using the default system appearance." : "Usando la apariencia predeterminada del sistema.", + "Dyslexia font" : "Fuente para dislexia", + "Enable dyslexia font" : "Habilitar fuente para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic es una tipografía/fuente diseñada para mitigar algunos de los errores comunes de lectura causados por dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Habilitar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Modo de alto contraste para facilitar tu navegación. La calidad visual puede ser menor pero incrementa la claridad.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Habilitar el tema claro predeterminado", + "The default light appearance." : "La apariencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidad", + "Adjust the Nextcloud theme" : "Ajusta el tema de Nextcloud", + "Name" : "Nombre", + "Web link" : "Enlace web", + "a safe home for all your data" : "un lugar seguro para todos tus datos", + "Slogan" : "Lema", + "Primary color" : "Color primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "El color primario es usado para destacar elementos como botones importantes. Podría ajustarse ligeramente dependiendo del esquema de color actual.", + "Legal notice link" : "Enlace al aviso legal", + "Privacy policy link" : "Liga a la política de privacidad", + "Header logo" : "Logo del encabezado", + "Upload new header logo" : "Cargar un nuevo logotipo del encabezado", + "Favicon" : "Favicon", + "Upload new favicon" : "Cargar un nuevo favicon", + "User settings" : "Configuración de usuario", + "Disable user theming" : "Deshabilitar los temas de usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aunque puede seleccionar y personalizar su instancia, los usuarios pueden cambiar su fondo y colores. Si quiere forzar su personalización, puede habilitarlo.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve tu instancia y clientes soportados. Esto será visible para todos los usuarios. ", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En vez de una imagen de fondo, también puede configurar un fondo de color plano. Si usa una imagen de fondo, cambiar este color influirá en el color de los íconos del menú de aplicaciones.", + "Background color" : "Color de fondo", + "Upload new logo" : "Cargar nuevo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Cargar nueva imagen de fondo e inicio de sesión", + "Background and login image" : "Imagen de fondo e inicio de sesión", + "Advanced options" : "Opciones avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale la extensión PHP ImageMagick con soporte para imágenes SVG para generar automáticamente favicons basados en el logo cargado y el color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si encuentra algún problema, no dude en reportarlo en {issuetracker}nuestro sistema de seguimiento de problemas{linkend}. Y si quiere participar, ¡únase a {designteam}nuestro equipo de diseño{linkend}!", + "Appearance and accessibility settings" : "Configuración de apariencia y accesibilidad", + "Misc accessibility options" : "Opciones de accesibilidad misceláneas", + "Enable blur background filter (may increase GPU load)" : "Habilitar el filtro de desenfoque de fondo (puede incrementar la carga de la GPU)", + "Customization has been disabled by your administrator" : "La personalización ha sido deshabilitada por su administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Establecer un color primario para destacar los elementos importantes. El color usado para elementos como botones primarios puede diferir ligeramente dado que se ajusta para cumplir con los requerimientos de accesibilidad.", + "Background and color" : "Fondo y color", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "El fondo puede establecerse a una imagen desde el conjunto predeterminado, una imagen subida personalizada, o un color plano.", + "Keyboard shortcuts" : "Atajos del teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "En algunos casos, los atajos de teclado pueden interferir con las herramientas de accesibilidad. Para permitir el enfoque correcto de su herramienta, puede desactivar todos los atajos de teclado aquí. Esto también deshabilitará todos los atajos disponibles en las aplicaciones.", + "Disable all keyboard shortcuts" : "Deshabilitar todos los atajos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada actualmente: {app}, posición {position} de {total}", + "Move up" : "Mover arriba", + "Move down" : "Mover abajo", + "Select a background from your files" : "Seleccionar un fondo desde sus archivos", + "Select background" : "Seleccionar fondo", + "No background has been selected" : "No se ha seleccionado un fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo liso", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "La selección del tema es obligatoria", + "Could not set the app order" : "No se pudo establecer el orden de aplicaciones", + "Could not reset the app order" : "No se pudo restaurar el orden de aplicaciones", + "Navigation bar settings" : "Configuración de la barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puede configurar el orden de las aplicaciones en la barra de navegación. La primera será la aplicación predeterminada, que se muestra al iniciar sesión o al hacer clic en el logo.", + "The default app can not be changed because it was configured by the administrator." : "No se puede cambiar la aplicación predeterminada porque fue configurada por el administrador.", + "The app order was changed, to see it in action you have to reload the page." : "El orden de aplicaciones ha cambiado, para poder verlo, recargue la página.", + "Reset default app order" : "Restaurar el orden de aplicaciones predeterminado", + "Could not set primary color" : "No se pudo establecer el color primario", + "Reset primary color" : "Restablecer el color primario", + "Could not set global default apps" : "No se pudieron establecer las aplicaciones predeterminadas globales", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "La aplicación predeterminada es la que se mostrará al iniciar sesión o al hacer clic en el logo del menú.", + "Use custom default app" : "Utilizar la aplicación personalizada predeterminada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicaciones predeterminadas globales", + "Default app priority" : "Prioridad de aplicaciones predeterminada", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si una aplicación no está habilitada para un usuario, se utilizará la siguiente aplicación por orden de prioridad.", + "Select a custom color" : "Seleccionar un color personalizado", + "Reset to default" : "Restablecer al predeterminado", + "Upload" : "Cargar", + "Remove background image" : "Eliminar imagen de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "El acceso universal es muy importante para nosotros. Seguimos los estándares web y verificamos que todo sea utilizable inclusive sin ratón, y con software de asistencia como lectores de pantalla. Buscamos cumplir con las {guidelines}Guías de Accesibilidad de Contenido Web{linkend} 2.1 sobre nivel AA, incluso sobre nivel AAA para el tema de alto contraste." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/et_EE.js b/apps/theming/l10n/et_EE.js new file mode 100644 index 00000000000..8c9c4cf4a11 --- /dev/null +++ b/apps/theming/l10n/et_EE.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Antud nimi on liiga pikk", + "The given web address is too long" : "Antud veebiaadress on liiga pikk", + "The given web address is not a valid URL" : "Antud veebiaadress pole korrektne võrguaadress", + "The given legal notice address is too long" : "Antud juriidilise teabe aadress on liiga pikk", + "The given legal notice address is not a valid URL" : "Antud juriidilise teabe aadress pole korrektne võrguaadress", + "The given privacy policy address is too long" : "Antud privaatsusreeglite aadress on liiga pikk", + "The given privacy policy address is not a valid URL" : "Antud privaatsusreeglite aadress pole korrektne võrguaadress", + "The given slogan is too long" : "Antud tunnuslause on liiga pikk", + "The given color is invalid" : "Antud värv ei sobi", + "Disable-user-theming should be true or false" : "„Disable-user-theming“ väärtus saab olla kas „true“ või „false“", + "Saved" : "Salvestatud", + "Invalid app given" : "Vale rakendus", + "Invalid type for setting \"defaultApp\" given" : "Seadistuse „defaultApp“ vigane tüüp", + "Invalid setting key" : "Vigane seadistuste võti", + "The file was uploaded" : "Fail laaditi üles", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem, kui php.ini failis määratud upload_max_filesize", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem, kui MAX_FILE_SIZE atribuut, mis oli HTML vormis määratud", + "The file was only partially uploaded" : "Fail laaditi üles ainult osaliselt", + "No file was uploaded" : "Ühtegi faili ei laaditud üles", + "Missing a temporary folder" : "Ajutine kaust on puudu", + "Could not write file to disk" : "Faili kirjutamine kettale ebaõnnestus", + "A PHP extension stopped the file upload" : "PHP laiendus peatas faili üleslaadimise", + "No file uploaded" : "Faili ei laaditud üles", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Sa juba kasutad omaloodud kujundust. Selle rakenduse seadistused ilmselt muudavad nüüd seda.", + "Theming" : "Kujundused", + "Appearance and accessibility" : "Välimus ja hõlpsus", + "PHP Imagick module" : "Moodul PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP moodul „imagick“ pole kasutusel, aga kujundust haldav rakendus on. Et favikonide loomine ja toimiks korrektselt, siis palun lülita see moodul serveri seadistustest sisse.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Selle serveri PHP „imagick“ moodulil puudub SVG tugi. Parema ühilduvusse nimel palun paigalda ta.", + "Dark theme with high contrast mode" : "Kontrastne tume kujundus", + "Enable dark high contrast mode" : "Kasuta kontrastset tumedat kujundust", + "Similar to the high contrast mode, but with dark colours." : "Sarnane kontrastsele režiimile, aga tumedates toonides.", + "Dark theme" : "Tume kujundus", + "Enable dark theme" : "Kasuta tumedat kujundust", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Vähendades valgustugevust ja eredust vähendab tume kujundus koormust sinu silmadele.", + "System default theme" : "Süsteemi vaikimisi kujundus", + "Enable the system default" : "Kasuta süsteemi vaikimisi kujundust", + "Using the default system appearance." : "Kasutan süsteemi vaikimisi kujundust.", + "Dyslexia font" : "Düsleksia font", + "Enable dyslexia font" : "Kasuta düsleksia fonti", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic on tasuta kirjatüüp/font, mis aitab leevendada mõningaid levinud lugemisvigu, mida põhjustab düsleksia. ", + "High contrast mode" : "Kõrge kontrastsusega režiim", + "Enable high contrast mode" : "Kasuta kõrge kontrastsusega režiimi.", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kõrge kontrastsusega režiim, mis hõlbustab liikumist lehel. Visuaalne kvaliteet väheneb, kuid loetavus paraneb. ", + "Light theme" : "Hele kujundus", + "Enable the default light theme" : "Kasuta heledat kujundust", + "The default light appearance." : "Vaikimisi hele kujundus.", + "Legal notice" : "Juriidiline teave", + "Privacy policy" : "Privaatsusreeglid", + "Adjust the Nextcloud theme" : "Muuda Nextcloudi kujundust", + "Name" : "Nimi", + "Web link" : "Veebilink", + "a safe home for all your data" : "turvaline koht sinu andmetele", + "Slogan" : "Tunnuslause", + "Primary color" : "Põhivärv", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Põhivärv on mõeldud lehe oluliste elementude rõhutamiseks. Vastavalt valitud üldkujundusele võib see värv ka natuke kohenduda.", + "Legal notice link" : "Juriidilise teabe link", + "Privacy policy link" : "Privaatsustingimuste link", + "Header logo" : "Päiselogo", + "Upload new header logo" : "Laadi üles uus päiselogo", + "Favicon" : "Saidi favikon", + "Upload new favicon" : "Laadi üles uus saidi favikon", + "User settings" : "Kasutaja seadistused", + "Disable user theming" : "Keela kujunduste valimine kasutaja poolt", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kuigi sina oled seadistanud oma serveri kasutajaliidese kujunduse, siis kasutajad võivad omi taustu ja värve muuta. Kui tahad, et kõik kasutaks ainult sinu tehtud kujundust, siis lülita see eelistus sisse.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Kujundused võimaldavad lihtsalt serveriinstantsi ja toetatud klientide välimust muuta. See on näha kõigile kasutajatele.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Taustapildi asemele võid sa määrata ka lihtsalt ühe värvi. Kui aga taustapilt on olemas, siis see värv mõjutab rakenduste ikoonide värve.", + "Background color" : "Taustavärv", + "Upload new logo" : "Laadi üles uus logo", + "Logo" : "Logo", + "Upload new background and login image" : "Laadi üles uus taustapilt ja sisselogimise pilt", + "Background and login image" : "Taustapilt ja sisselogimise pilt", + "Advanced options" : "Täpsemad valikud", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Paigalda PHP Imagemagicku lsiamoodul SVG piltide toega, et üleslaaditud logo ja värvi põhjal luua automaatselt favikone. ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universaalne juurdepääs on meie jaoks väga oluline. Me järgime veebistandardeid ja kontrollime, et kõik oleks kasutatav ka ilma hiireta ja abitarkvara, näiteks ekraani lugejateta. Meie eesmärk on olla vastavuses {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 AA-tasemega, suure kontrastsusega kujunduse puhul isegi AAA-tasemega. ", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Kui leiad mingeid probleeme, siis teata neist {issuetracker}meie veahalduse süsteemis{linkend}. Ja kui soovid kaasa lüüa, siis tule liitu {designteam}meie disainimeeskonnaga{linkend}!", + "Unable to apply the setting." : "Seadistuse rakendamine ei õnnestu.", + "Appearance and accessibility settings" : "Välimuse ja hõlpsuse seadistused", + "Misc accessibility options" : "Varia hõlpsuse seadistused", + "Enable blur background filter (may increase GPU load)" : "Kasuta tausta hägustamise filtrit (suurendab graafikaprotsessori koormust)", + "Customization has been disabled by your administrator" : "Kujunduse kohendamine pole peakasutaja poolt lubatud", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Määra oluliste kujunduselementide põhivärv. Sama värv kuulub mõnedes rollides, sealhulgas põhinuppudel, kohendamisele vastavalt hõlbustuse nõuetele.", + "Background and color" : "Taust ja värvid", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Taustavärvi võid valida mõnest vaikimisi pildikomplekti pildist, oma üleslaaditud pildist või lihtsalt värvinumbri alusel.", + "Keyboard shortcuts" : "Klaviatuuri kiirklahvid", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Mõnel juhul klaviatuuri kiirklahvid võivad takistada hõlbustustarvikute tööd. Sellisel puhul saad nad siit välja lülitada. Samaga lülituvad kiirklahvid välja ka kõikides rakendustes.", + "Disable all keyboard shortcuts" : "Lülita kõik klaviatuuri kiirklahvid välja", + "Current selected app: {app}, position {position} of {total}" : "Hetkel valitud rakendus: {app}, asukoht {position} / {total}", + "Move up" : "Liiguta ülespoole", + "Move down" : "Liiguta allapoole", + "Select a background from your files" : "Vali taustapilt oma failide seast", + "Select background" : "Vali taust", + "No background has been selected" : "Ühtegi tausta pole valitud", + "Custom background" : "Sinu valitud taust", + "Plain background" : "Lihtne taust", + "Default background" : "Vaikimisi taust", + "Theme selection is enforced" : "Kujunduse valik on peakasutaja poolt määratud", + "Could not set the app order" : "Rakenduste järjekorda ei õnnestunud muuta", + "Could not reset the app order" : "Rakenduste järjekorda ei õnnestunud lähtestada", + "Navigation bar settings" : "Rakenduste riba seadistused", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Rakenduste ribal võib objektide järjekorda muuta. Esimene ikoon on vaikimisi rakendus, mis avatakse sisselogimisel või logo klõpsimisel.", + "The default app can not be changed because it was configured by the administrator." : "Vaikimisi rakendust ei saa muuta, kuna see on peakasutaja poolt ettemääratud.", + "The app order was changed, to see it in action you have to reload the page." : "Rakenduste järjekord on muudetud. Palun laadi lehti uuesti, iui soovid näha kuidas see välja näeb.", + "Reset default app order" : "Lähtesta rakenduste vaikimisi järjekord", + "Could not set primary color" : "Põhivärvi ei õnnestunud määrata", + "Reset primary color" : "Lähtesta põhivärv", + "Could not set global default apps" : "Üldisi vaikimisi rakendusi ei õnnestunud määrata", + "Default app" : "Vaikimisi rakendus", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Vaikimisi rakendus on see, mis avatakse sisselogimisel või logo klõpsimisel.", + "Use custom default app" : "Vali endale sobiv vaikimisi rakendus", + "Global default app" : "Üldine vaikimisi rakendus", + "Global default apps" : "Üldised vaikimisi rakendused", + "Default app priority" : "Vaikimisi rakenduste olulisus", + "If an app is not enabled for a user, the next app with lower priority is used." : "Kui rakendus pole antud kasutaja jaoks sisselülitatud, siis loendist võetakse olulisuselt järgmine rakendus.", + "Select a custom color" : "Vali oma eelistatud värv", + "Reset to default" : "Taasta vaikeseaded", + "Upload" : "Laadi üles", + "Remove background image" : "Eemalda taustapilt", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universaalne juurdepääs on meie jaoks väga oluline. Me järgime veebistandardeid ja kontrollime, et kõik oleks kasutatav ka ilma hiireta ja abitarkvara, näiteks ekraani lugejateta. Meie eesmärk on olla vastavuses {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA-tasemel, kõrge kontrastsusega kujunduse puhull isegi AAA-tasemel. ", + ". Unable to apply the setting." : ". Seadistuse rakendamine pole võimalik." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/et_EE.json b/apps/theming/l10n/et_EE.json new file mode 100644 index 00000000000..e790923b127 --- /dev/null +++ b/apps/theming/l10n/et_EE.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Antud nimi on liiga pikk", + "The given web address is too long" : "Antud veebiaadress on liiga pikk", + "The given web address is not a valid URL" : "Antud veebiaadress pole korrektne võrguaadress", + "The given legal notice address is too long" : "Antud juriidilise teabe aadress on liiga pikk", + "The given legal notice address is not a valid URL" : "Antud juriidilise teabe aadress pole korrektne võrguaadress", + "The given privacy policy address is too long" : "Antud privaatsusreeglite aadress on liiga pikk", + "The given privacy policy address is not a valid URL" : "Antud privaatsusreeglite aadress pole korrektne võrguaadress", + "The given slogan is too long" : "Antud tunnuslause on liiga pikk", + "The given color is invalid" : "Antud värv ei sobi", + "Disable-user-theming should be true or false" : "„Disable-user-theming“ väärtus saab olla kas „true“ või „false“", + "Saved" : "Salvestatud", + "Invalid app given" : "Vale rakendus", + "Invalid type for setting \"defaultApp\" given" : "Seadistuse „defaultApp“ vigane tüüp", + "Invalid setting key" : "Vigane seadistuste võti", + "The file was uploaded" : "Fail laaditi üles", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Üleslaaditud fail on suurem, kui php.ini failis määratud upload_max_filesize", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Üleslaaditud fail on suurem, kui MAX_FILE_SIZE atribuut, mis oli HTML vormis määratud", + "The file was only partially uploaded" : "Fail laaditi üles ainult osaliselt", + "No file was uploaded" : "Ühtegi faili ei laaditud üles", + "Missing a temporary folder" : "Ajutine kaust on puudu", + "Could not write file to disk" : "Faili kirjutamine kettale ebaõnnestus", + "A PHP extension stopped the file upload" : "PHP laiendus peatas faili üleslaadimise", + "No file uploaded" : "Faili ei laaditud üles", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Sa juba kasutad omaloodud kujundust. Selle rakenduse seadistused ilmselt muudavad nüüd seda.", + "Theming" : "Kujundused", + "Appearance and accessibility" : "Välimus ja hõlpsus", + "PHP Imagick module" : "Moodul PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP moodul „imagick“ pole kasutusel, aga kujundust haldav rakendus on. Et favikonide loomine ja toimiks korrektselt, siis palun lülita see moodul serveri seadistustest sisse.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Selle serveri PHP „imagick“ moodulil puudub SVG tugi. Parema ühilduvusse nimel palun paigalda ta.", + "Dark theme with high contrast mode" : "Kontrastne tume kujundus", + "Enable dark high contrast mode" : "Kasuta kontrastset tumedat kujundust", + "Similar to the high contrast mode, but with dark colours." : "Sarnane kontrastsele režiimile, aga tumedates toonides.", + "Dark theme" : "Tume kujundus", + "Enable dark theme" : "Kasuta tumedat kujundust", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Vähendades valgustugevust ja eredust vähendab tume kujundus koormust sinu silmadele.", + "System default theme" : "Süsteemi vaikimisi kujundus", + "Enable the system default" : "Kasuta süsteemi vaikimisi kujundust", + "Using the default system appearance." : "Kasutan süsteemi vaikimisi kujundust.", + "Dyslexia font" : "Düsleksia font", + "Enable dyslexia font" : "Kasuta düsleksia fonti", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic on tasuta kirjatüüp/font, mis aitab leevendada mõningaid levinud lugemisvigu, mida põhjustab düsleksia. ", + "High contrast mode" : "Kõrge kontrastsusega režiim", + "Enable high contrast mode" : "Kasuta kõrge kontrastsusega režiimi.", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kõrge kontrastsusega režiim, mis hõlbustab liikumist lehel. Visuaalne kvaliteet väheneb, kuid loetavus paraneb. ", + "Light theme" : "Hele kujundus", + "Enable the default light theme" : "Kasuta heledat kujundust", + "The default light appearance." : "Vaikimisi hele kujundus.", + "Legal notice" : "Juriidiline teave", + "Privacy policy" : "Privaatsusreeglid", + "Adjust the Nextcloud theme" : "Muuda Nextcloudi kujundust", + "Name" : "Nimi", + "Web link" : "Veebilink", + "a safe home for all your data" : "turvaline koht sinu andmetele", + "Slogan" : "Tunnuslause", + "Primary color" : "Põhivärv", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Põhivärv on mõeldud lehe oluliste elementude rõhutamiseks. Vastavalt valitud üldkujundusele võib see värv ka natuke kohenduda.", + "Legal notice link" : "Juriidilise teabe link", + "Privacy policy link" : "Privaatsustingimuste link", + "Header logo" : "Päiselogo", + "Upload new header logo" : "Laadi üles uus päiselogo", + "Favicon" : "Saidi favikon", + "Upload new favicon" : "Laadi üles uus saidi favikon", + "User settings" : "Kasutaja seadistused", + "Disable user theming" : "Keela kujunduste valimine kasutaja poolt", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kuigi sina oled seadistanud oma serveri kasutajaliidese kujunduse, siis kasutajad võivad omi taustu ja värve muuta. Kui tahad, et kõik kasutaks ainult sinu tehtud kujundust, siis lülita see eelistus sisse.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Kujundused võimaldavad lihtsalt serveriinstantsi ja toetatud klientide välimust muuta. See on näha kõigile kasutajatele.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Taustapildi asemele võid sa määrata ka lihtsalt ühe värvi. Kui aga taustapilt on olemas, siis see värv mõjutab rakenduste ikoonide värve.", + "Background color" : "Taustavärv", + "Upload new logo" : "Laadi üles uus logo", + "Logo" : "Logo", + "Upload new background and login image" : "Laadi üles uus taustapilt ja sisselogimise pilt", + "Background and login image" : "Taustapilt ja sisselogimise pilt", + "Advanced options" : "Täpsemad valikud", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Paigalda PHP Imagemagicku lsiamoodul SVG piltide toega, et üleslaaditud logo ja värvi põhjal luua automaatselt favikone. ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universaalne juurdepääs on meie jaoks väga oluline. Me järgime veebistandardeid ja kontrollime, et kõik oleks kasutatav ka ilma hiireta ja abitarkvara, näiteks ekraani lugejateta. Meie eesmärk on olla vastavuses {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 AA-tasemega, suure kontrastsusega kujunduse puhul isegi AAA-tasemega. ", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Kui leiad mingeid probleeme, siis teata neist {issuetracker}meie veahalduse süsteemis{linkend}. Ja kui soovid kaasa lüüa, siis tule liitu {designteam}meie disainimeeskonnaga{linkend}!", + "Unable to apply the setting." : "Seadistuse rakendamine ei õnnestu.", + "Appearance and accessibility settings" : "Välimuse ja hõlpsuse seadistused", + "Misc accessibility options" : "Varia hõlpsuse seadistused", + "Enable blur background filter (may increase GPU load)" : "Kasuta tausta hägustamise filtrit (suurendab graafikaprotsessori koormust)", + "Customization has been disabled by your administrator" : "Kujunduse kohendamine pole peakasutaja poolt lubatud", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Määra oluliste kujunduselementide põhivärv. Sama värv kuulub mõnedes rollides, sealhulgas põhinuppudel, kohendamisele vastavalt hõlbustuse nõuetele.", + "Background and color" : "Taust ja värvid", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Taustavärvi võid valida mõnest vaikimisi pildikomplekti pildist, oma üleslaaditud pildist või lihtsalt värvinumbri alusel.", + "Keyboard shortcuts" : "Klaviatuuri kiirklahvid", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Mõnel juhul klaviatuuri kiirklahvid võivad takistada hõlbustustarvikute tööd. Sellisel puhul saad nad siit välja lülitada. Samaga lülituvad kiirklahvid välja ka kõikides rakendustes.", + "Disable all keyboard shortcuts" : "Lülita kõik klaviatuuri kiirklahvid välja", + "Current selected app: {app}, position {position} of {total}" : "Hetkel valitud rakendus: {app}, asukoht {position} / {total}", + "Move up" : "Liiguta ülespoole", + "Move down" : "Liiguta allapoole", + "Select a background from your files" : "Vali taustapilt oma failide seast", + "Select background" : "Vali taust", + "No background has been selected" : "Ühtegi tausta pole valitud", + "Custom background" : "Sinu valitud taust", + "Plain background" : "Lihtne taust", + "Default background" : "Vaikimisi taust", + "Theme selection is enforced" : "Kujunduse valik on peakasutaja poolt määratud", + "Could not set the app order" : "Rakenduste järjekorda ei õnnestunud muuta", + "Could not reset the app order" : "Rakenduste järjekorda ei õnnestunud lähtestada", + "Navigation bar settings" : "Rakenduste riba seadistused", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Rakenduste ribal võib objektide järjekorda muuta. Esimene ikoon on vaikimisi rakendus, mis avatakse sisselogimisel või logo klõpsimisel.", + "The default app can not be changed because it was configured by the administrator." : "Vaikimisi rakendust ei saa muuta, kuna see on peakasutaja poolt ettemääratud.", + "The app order was changed, to see it in action you have to reload the page." : "Rakenduste järjekord on muudetud. Palun laadi lehti uuesti, iui soovid näha kuidas see välja näeb.", + "Reset default app order" : "Lähtesta rakenduste vaikimisi järjekord", + "Could not set primary color" : "Põhivärvi ei õnnestunud määrata", + "Reset primary color" : "Lähtesta põhivärv", + "Could not set global default apps" : "Üldisi vaikimisi rakendusi ei õnnestunud määrata", + "Default app" : "Vaikimisi rakendus", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Vaikimisi rakendus on see, mis avatakse sisselogimisel või logo klõpsimisel.", + "Use custom default app" : "Vali endale sobiv vaikimisi rakendus", + "Global default app" : "Üldine vaikimisi rakendus", + "Global default apps" : "Üldised vaikimisi rakendused", + "Default app priority" : "Vaikimisi rakenduste olulisus", + "If an app is not enabled for a user, the next app with lower priority is used." : "Kui rakendus pole antud kasutaja jaoks sisselülitatud, siis loendist võetakse olulisuselt järgmine rakendus.", + "Select a custom color" : "Vali oma eelistatud värv", + "Reset to default" : "Taasta vaikeseaded", + "Upload" : "Laadi üles", + "Remove background image" : "Eemalda taustapilt", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universaalne juurdepääs on meie jaoks väga oluline. Me järgime veebistandardeid ja kontrollime, et kõik oleks kasutatav ka ilma hiireta ja abitarkvara, näiteks ekraani lugejateta. Meie eesmärk on olla vastavuses {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA-tasemel, kõrge kontrastsusega kujunduse puhull isegi AAA-tasemel. ", + ". Unable to apply the setting." : ". Seadistuse rakendamine pole võimalik." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/eu.js b/apps/theming/l10n/eu.js new file mode 100644 index 00000000000..4ed87e22808 --- /dev/null +++ b/apps/theming/l10n/eu.js @@ -0,0 +1,122 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Idatzitako izena luzeegia da", + "The given web address is too long" : "Idatzitako web helbidea luzeegia da", + "The given web address is not a valid URL" : "Emandako web helbidea URL baliogabea da", + "The given legal notice address is too long" : "Emandako lege-ohar helbidea luzeegia da", + "The given legal notice address is not a valid URL" : "Emandako lege-ohar helbidea ez da baliozko URLa", + "The given privacy policy address is too long" : "Emandako pribatutasun-gidalerro helbidea luzeegia da", + "The given privacy policy address is not a valid URL" : "Emandako pribatutasun-gidalerro helbidea ez da baliozko URLa", + "The given slogan is too long" : "Emandako leloa luzeegia da", + "The given color is invalid" : "Emandako kolorea ez du balio", + "Disable-user-theming should be true or false" : "Desgaitu-erabiltzailea-gaiak egia ala faltsua izan behar du", + "Saved" : "Gordeta", + "Invalid app given" : "Aplikazio baliogabea eman da", + "Invalid type for setting \"defaultApp\" given" : "Emandako \"defaultApp\" ezartzeko mota baliogabea", + "Invalid setting key" : "Ezarpen gako baliogabea", + "The file was uploaded" : "Fitxategia igo da", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Igotako fitxategiak php.ini fitxategiko upload_max_filesize direktiban zehazturikoa gainditzen du", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Igotako fitxategiak HTML formularioan ezarritako MAX_FILE_SIZE direktiban zehazturikoa gainditzen du", + "The file was only partially uploaded" : "Fitxategia erdizka igo da", + "No file was uploaded" : "Ez da fitxategirik igo", + "Missing a temporary folder" : "Aldi baterako karpeta bat falta da", + "Could not write file to disk" : "Ezin izan da fitxategia diskoan idatzi", + "A PHP extension stopped the file upload" : "PHP hedapen batek fitxategiaren igoera gelditu du", + "No file uploaded" : "Ez da fitxategirik igo", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Gai pertsonalizatua erabiltzen ari zara dagoeneko. Gaiaren aplikazioaren ezarpenak gainidatzi ditzake.", + "Theming" : "Itxura", + "Appearance and accessibility" : "Itxura eta irisgarritasuna", + "PHP Imagick module" : "PHP Imagick modulua", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "\"Imagick\" PHP modulua ez dago gaituta, nahiz eta gaiak pertsonalizatzeko aplikazioa badagoen. Faviconen sorrerak behar bezala funtziona dezan, modulu hau instalatu eta gaitu behar duzu.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Instantzia honetako \"imagick\" PHP moduluak ez du SVG onartzen. Bateragarritasuna hobetzeko instalatzea gomendatzen da.", + "Dark theme with high contrast mode" : "Gai iluna kontraste handiko moduarekin", + "Enable dark high contrast mode" : "Gaitu kontraste handiko modu iluna", + "Similar to the high contrast mode, but with dark colours." : "Kontraste handiko moduaren antzekoa, baina kolore ilunekin.", + "Dark theme" : "Gai iluna", + "Enable dark theme" : "Gaitu gai iluna", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Gai iluna begiak arintzeko argitasuna eta distira orokorra murriztuz.", + "System default theme" : "Sistemaren gai lehenetsia", + "Enable the system default" : "Gaitu sistema lehenetsia", + "Using the default system appearance." : "Sistemaren itxura lehenetsia erabiltzen.", + "Dyslexia font" : "Dislexia letra-tipoa", + "Enable dyslexia font" : "Gaitu dislexia letra-tipoa", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic letra-tipo librea da, dislexiak eragindako ohiko irakurketa akats batzuk leuntzeko diseinatua.", + "High contrast mode" : "Kontraste handiko modua", + "Enable high contrast mode" : "Gaitu kontraste handiko modua", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste handiko modua zuri nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.", + "Light theme" : "Gai argia", + "Enable the default light theme" : "Gaitu gai argi lehenetsia", + "The default light appearance." : "Itxura argi lehenetsia.", + "Legal notice" : "Ohar legala", + "Privacy policy" : "Pribatutasun politika", + "Adjust the Nextcloud theme" : "Doitu Nextcloud gaia", + "Name" : "Izena", + "Web link" : "Web esteka", + "a safe home for all your data" : "zure datu guztientzako toki segurua", + "Slogan" : "Eslogana", + "Primary color" : "Kolore nagusia", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Kolore nagusia botoi garrantzitsuak bezalako elementuak nabarmentzeko erabiltzen da. Baliteke apur bat doitzea uneko kolore-eskemaren arabera.", + "Legal notice link" : "Ohar legalaren esteka", + "Privacy policy link" : "Pribatutasun politikaren esteka", + "Header logo" : "Goiburuaren logoa", + "Upload new header logo" : "Igo goiburuaren logo berria", + "Favicon" : "Gogoko-ikonoa", + "Upload new favicon" : "Igo gogoko-ikono berria", + "User settings" : "Erabiltzaile ezarpenak", + "Disable user theming" : "Desgaitu erabiltzaile itxura", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Zure instantzia hautatu eta pertsonaliza dezakezun arren, erabiltzaileek atzeko planoa eta koloreak alda ditzakete. Zure pertsonalizazioa aplikatu nahi baduzu, hau aktibatu dezakezu.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Gaiak aukera ematen du zure instantziaren eta onartutako bezeroen itxura eta izaera erraz pertsonalizatzeko. Hau erabiltzaile guztientzat ikusgai egongo da.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Atzeko planoko irudi baten ordez atzeko planoko kolore arrunta ezar dezakezu. Atzeko planoko irudi bat erabiltzen baduzu kolore hori aldatzeak aplikazioen menuko ikonoen kolorean eragina izango du.", + "Background color" : "Atzeko planoaren kolorea", + "Upload new logo" : "Igo logo berria", + "Logo" : "Logoa", + "Upload new background and login image" : "Igo atzeko planoa eta saioa hasteko irudi berria", + "Background and login image" : "Atzeko planoa eta saioa hasteko irudia", + "Advanced options" : "Ezarpen aurreratuak", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instalatu ImageMagick PHP luzapena SVG irudietarako laguntzarekin automatikoki sortzeko igotako logotipo eta kolorean oinarritutako gogoko-ikonoak.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Arazoren bat aurkitzen baduzu, ez izan zalantzarik eta jakinarazi {issuetracker}gure arazoen jarraipena{linkend} zerbitzuan. Eta parte hartu nahi baduzu, etorri {designteam}gure diseinu taldera{linkend}!", + "Appearance and accessibility settings" : "Itxura eta irisgarritasun ezarpenak", + "Misc accessibility options" : "Irisgarritasun-aukera desberdinak", + "Enable blur background filter (may increase GPU load)" : "Gaitu atzeko planoa lausotzeko iragazkia (baliteke GPUaren karga handitzea)", + "Customization has been disabled by your administrator" : "Zure administratzaileak pertsonalizazioa desgaitu du", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Ezarri kolore nagusi bat elementu garrantzitsuak nabarmentzeko. Botoi nagusiak bezalako elementuetarako erabiltzen den kolorea apur bat desberdina izan daiteke irisgarritasun-baldintzak betetzeko doitzen baita.", + "Background and color" : "Atzeko planoa eta kolorea", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Atzeko planoa multzo lehenetsiko irudi bat, kargatutako irudi pertsonalizatua edo kolore arrunta izan daiteke.", + "Keyboard shortcuts" : "Teklatuaren lasterbideak", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Zenbait kasutan, teklatuko lasterbideek erabilerraztasun-tresnekin oztopatu dezakete. Zure tresna behar bezala zentratu ahal izateko, hemen teklatuko lasterbide guztiak desgaitu ditzakezu. Honek aplikazioetan erabilgarri dauden lasterbide guztiak ere desgaituko ditu.", + "Disable all keyboard shortcuts" : "Desgaitu teklatuaren lasterbide guztiak", + "Current selected app: {app}, position {position} of {total}" : "Unean hautatutako aplikazioa: {app}, posizioa {total}(e)tik {position}", + "Move up" : "Eraman gora", + "Move down" : "Eraman behera", + "Select a background from your files" : "Hautatu atzeko plano bat zure fitxategietatik", + "Select background" : "Hautatu atzeko planoa", + "No background has been selected" : "Ez da atzeko planorik hautatu", + "Custom background" : "Atzeko plano pertsonalizatua", + "Plain background" : "Atzeko plano arrunta", + "Default background" : "Atzeko plano lehenetsia", + "Theme selection is enforced" : "Gaiaren hautaketa behartuta dago", + "Could not set the app order" : "Ezin izan da aplikazioaren ordena ezarri", + "Could not reset the app order" : "Ezin izan da aplikazioaren ordena berrezarri", + "Navigation bar settings" : "Nabigazio barraren ezarpenak", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Nabigazio-barran erabilitako aplikazioen ordena konfigura dezakezu. Lehenengo sarrera aplikazio lehenetsia izango da, saioa hasi ondoren edo logoan klik egitean irekita.", + "The default app can not be changed because it was configured by the administrator." : "Aplikazio lehenetsia ezin da aldatu administratzaile batek konfiguratu duelako.", + "The app order was changed, to see it in action you have to reload the page." : "Aplikazioen ordena aldatu da, ikusteko orria freskatu behar duzu.", + "Reset default app order" : "Berrezarri aplikazioen orden lehenetsia", + "Could not set primary color" : "Ezin izan da kolore nagusia ezarri", + "Reset primary color" : "Berrezarri kolore nagusia", + "Could not set global default apps" : "Ezin izan dira aplikazio lehenetsi globalak ezarri", + "Default app" : "Aplikazio lehenetsia", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Aplikazio lehenetsia, adibidez, saioa hasi ondoren edo menuko logoan klik egiten denean irekitzen den aplikazioa da.", + "Use custom default app" : "Erabili aplikazio lehenetsi pertsonalizatua", + "Global default app" : "Aplikazio lehenetsi globala", + "Global default apps" : "Aplikazio lehenetsi globalak", + "Default app priority" : "Aplikazioen prioritate lehenetsia", + "If an app is not enabled for a user, the next app with lower priority is used." : "Erabiltzaile batentzako aplikazio bat gaituta ez badago, lehentasun txikiagoa duen hurrengo aplikazioa erabiltzen da.", + "Select a custom color" : "Hautatu kolore pertsonalizatu bat", + "Reset to default" : "Berezarri balio lehenetsira", + "Upload" : "Igo", + "Remove background image" : "Kendu atzeko-planoko irudia", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala izatea oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta guztia sagurik gabe erabili ahal izatea bermatzen dugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino betez." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/eu.json b/apps/theming/l10n/eu.json new file mode 100644 index 00000000000..55df7980145 --- /dev/null +++ b/apps/theming/l10n/eu.json @@ -0,0 +1,120 @@ +{ "translations": { + "The given name is too long" : "Idatzitako izena luzeegia da", + "The given web address is too long" : "Idatzitako web helbidea luzeegia da", + "The given web address is not a valid URL" : "Emandako web helbidea URL baliogabea da", + "The given legal notice address is too long" : "Emandako lege-ohar helbidea luzeegia da", + "The given legal notice address is not a valid URL" : "Emandako lege-ohar helbidea ez da baliozko URLa", + "The given privacy policy address is too long" : "Emandako pribatutasun-gidalerro helbidea luzeegia da", + "The given privacy policy address is not a valid URL" : "Emandako pribatutasun-gidalerro helbidea ez da baliozko URLa", + "The given slogan is too long" : "Emandako leloa luzeegia da", + "The given color is invalid" : "Emandako kolorea ez du balio", + "Disable-user-theming should be true or false" : "Desgaitu-erabiltzailea-gaiak egia ala faltsua izan behar du", + "Saved" : "Gordeta", + "Invalid app given" : "Aplikazio baliogabea eman da", + "Invalid type for setting \"defaultApp\" given" : "Emandako \"defaultApp\" ezartzeko mota baliogabea", + "Invalid setting key" : "Ezarpen gako baliogabea", + "The file was uploaded" : "Fitxategia igo da", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Igotako fitxategiak php.ini fitxategiko upload_max_filesize direktiban zehazturikoa gainditzen du", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Igotako fitxategiak HTML formularioan ezarritako MAX_FILE_SIZE direktiban zehazturikoa gainditzen du", + "The file was only partially uploaded" : "Fitxategia erdizka igo da", + "No file was uploaded" : "Ez da fitxategirik igo", + "Missing a temporary folder" : "Aldi baterako karpeta bat falta da", + "Could not write file to disk" : "Ezin izan da fitxategia diskoan idatzi", + "A PHP extension stopped the file upload" : "PHP hedapen batek fitxategiaren igoera gelditu du", + "No file uploaded" : "Ez da fitxategirik igo", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Gai pertsonalizatua erabiltzen ari zara dagoeneko. Gaiaren aplikazioaren ezarpenak gainidatzi ditzake.", + "Theming" : "Itxura", + "Appearance and accessibility" : "Itxura eta irisgarritasuna", + "PHP Imagick module" : "PHP Imagick modulua", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "\"Imagick\" PHP modulua ez dago gaituta, nahiz eta gaiak pertsonalizatzeko aplikazioa badagoen. Faviconen sorrerak behar bezala funtziona dezan, modulu hau instalatu eta gaitu behar duzu.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Instantzia honetako \"imagick\" PHP moduluak ez du SVG onartzen. Bateragarritasuna hobetzeko instalatzea gomendatzen da.", + "Dark theme with high contrast mode" : "Gai iluna kontraste handiko moduarekin", + "Enable dark high contrast mode" : "Gaitu kontraste handiko modu iluna", + "Similar to the high contrast mode, but with dark colours." : "Kontraste handiko moduaren antzekoa, baina kolore ilunekin.", + "Dark theme" : "Gai iluna", + "Enable dark theme" : "Gaitu gai iluna", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Gai iluna begiak arintzeko argitasuna eta distira orokorra murriztuz.", + "System default theme" : "Sistemaren gai lehenetsia", + "Enable the system default" : "Gaitu sistema lehenetsia", + "Using the default system appearance." : "Sistemaren itxura lehenetsia erabiltzen.", + "Dyslexia font" : "Dislexia letra-tipoa", + "Enable dyslexia font" : "Gaitu dislexia letra-tipoa", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic letra-tipo librea da, dislexiak eragindako ohiko irakurketa akats batzuk leuntzeko diseinatua.", + "High contrast mode" : "Kontraste handiko modua", + "Enable high contrast mode" : "Gaitu kontraste handiko modua", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Kontraste handiko modua zuri nabigazioa errazteko. Kalitate bisuala murriztuko da baina argitasuna handiagotu.", + "Light theme" : "Gai argia", + "Enable the default light theme" : "Gaitu gai argi lehenetsia", + "The default light appearance." : "Itxura argi lehenetsia.", + "Legal notice" : "Ohar legala", + "Privacy policy" : "Pribatutasun politika", + "Adjust the Nextcloud theme" : "Doitu Nextcloud gaia", + "Name" : "Izena", + "Web link" : "Web esteka", + "a safe home for all your data" : "zure datu guztientzako toki segurua", + "Slogan" : "Eslogana", + "Primary color" : "Kolore nagusia", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Kolore nagusia botoi garrantzitsuak bezalako elementuak nabarmentzeko erabiltzen da. Baliteke apur bat doitzea uneko kolore-eskemaren arabera.", + "Legal notice link" : "Ohar legalaren esteka", + "Privacy policy link" : "Pribatutasun politikaren esteka", + "Header logo" : "Goiburuaren logoa", + "Upload new header logo" : "Igo goiburuaren logo berria", + "Favicon" : "Gogoko-ikonoa", + "Upload new favicon" : "Igo gogoko-ikono berria", + "User settings" : "Erabiltzaile ezarpenak", + "Disable user theming" : "Desgaitu erabiltzaile itxura", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Zure instantzia hautatu eta pertsonaliza dezakezun arren, erabiltzaileek atzeko planoa eta koloreak alda ditzakete. Zure pertsonalizazioa aplikatu nahi baduzu, hau aktibatu dezakezu.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Gaiak aukera ematen du zure instantziaren eta onartutako bezeroen itxura eta izaera erraz pertsonalizatzeko. Hau erabiltzaile guztientzat ikusgai egongo da.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Atzeko planoko irudi baten ordez atzeko planoko kolore arrunta ezar dezakezu. Atzeko planoko irudi bat erabiltzen baduzu kolore hori aldatzeak aplikazioen menuko ikonoen kolorean eragina izango du.", + "Background color" : "Atzeko planoaren kolorea", + "Upload new logo" : "Igo logo berria", + "Logo" : "Logoa", + "Upload new background and login image" : "Igo atzeko planoa eta saioa hasteko irudi berria", + "Background and login image" : "Atzeko planoa eta saioa hasteko irudia", + "Advanced options" : "Ezarpen aurreratuak", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instalatu ImageMagick PHP luzapena SVG irudietarako laguntzarekin automatikoki sortzeko igotako logotipo eta kolorean oinarritutako gogoko-ikonoak.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Arazoren bat aurkitzen baduzu, ez izan zalantzarik eta jakinarazi {issuetracker}gure arazoen jarraipena{linkend} zerbitzuan. Eta parte hartu nahi baduzu, etorri {designteam}gure diseinu taldera{linkend}!", + "Appearance and accessibility settings" : "Itxura eta irisgarritasun ezarpenak", + "Misc accessibility options" : "Irisgarritasun-aukera desberdinak", + "Enable blur background filter (may increase GPU load)" : "Gaitu atzeko planoa lausotzeko iragazkia (baliteke GPUaren karga handitzea)", + "Customization has been disabled by your administrator" : "Zure administratzaileak pertsonalizazioa desgaitu du", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Ezarri kolore nagusi bat elementu garrantzitsuak nabarmentzeko. Botoi nagusiak bezalako elementuetarako erabiltzen den kolorea apur bat desberdina izan daiteke irisgarritasun-baldintzak betetzeko doitzen baita.", + "Background and color" : "Atzeko planoa eta kolorea", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Atzeko planoa multzo lehenetsiko irudi bat, kargatutako irudi pertsonalizatua edo kolore arrunta izan daiteke.", + "Keyboard shortcuts" : "Teklatuaren lasterbideak", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Zenbait kasutan, teklatuko lasterbideek erabilerraztasun-tresnekin oztopatu dezakete. Zure tresna behar bezala zentratu ahal izateko, hemen teklatuko lasterbide guztiak desgaitu ditzakezu. Honek aplikazioetan erabilgarri dauden lasterbide guztiak ere desgaituko ditu.", + "Disable all keyboard shortcuts" : "Desgaitu teklatuaren lasterbide guztiak", + "Current selected app: {app}, position {position} of {total}" : "Unean hautatutako aplikazioa: {app}, posizioa {total}(e)tik {position}", + "Move up" : "Eraman gora", + "Move down" : "Eraman behera", + "Select a background from your files" : "Hautatu atzeko plano bat zure fitxategietatik", + "Select background" : "Hautatu atzeko planoa", + "No background has been selected" : "Ez da atzeko planorik hautatu", + "Custom background" : "Atzeko plano pertsonalizatua", + "Plain background" : "Atzeko plano arrunta", + "Default background" : "Atzeko plano lehenetsia", + "Theme selection is enforced" : "Gaiaren hautaketa behartuta dago", + "Could not set the app order" : "Ezin izan da aplikazioaren ordena ezarri", + "Could not reset the app order" : "Ezin izan da aplikazioaren ordena berrezarri", + "Navigation bar settings" : "Nabigazio barraren ezarpenak", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Nabigazio-barran erabilitako aplikazioen ordena konfigura dezakezu. Lehenengo sarrera aplikazio lehenetsia izango da, saioa hasi ondoren edo logoan klik egitean irekita.", + "The default app can not be changed because it was configured by the administrator." : "Aplikazio lehenetsia ezin da aldatu administratzaile batek konfiguratu duelako.", + "The app order was changed, to see it in action you have to reload the page." : "Aplikazioen ordena aldatu da, ikusteko orria freskatu behar duzu.", + "Reset default app order" : "Berrezarri aplikazioen orden lehenetsia", + "Could not set primary color" : "Ezin izan da kolore nagusia ezarri", + "Reset primary color" : "Berrezarri kolore nagusia", + "Could not set global default apps" : "Ezin izan dira aplikazio lehenetsi globalak ezarri", + "Default app" : "Aplikazio lehenetsia", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Aplikazio lehenetsia, adibidez, saioa hasi ondoren edo menuko logoan klik egiten denean irekitzen den aplikazioa da.", + "Use custom default app" : "Erabili aplikazio lehenetsi pertsonalizatua", + "Global default app" : "Aplikazio lehenetsi globala", + "Global default apps" : "Aplikazio lehenetsi globalak", + "Default app priority" : "Aplikazioen prioritate lehenetsia", + "If an app is not enabled for a user, the next app with lower priority is used." : "Erabiltzaile batentzako aplikazio bat gaituta ez badago, lehentasun txikiagoa duen hurrengo aplikazioa erabiltzen da.", + "Select a custom color" : "Hautatu kolore pertsonalizatu bat", + "Reset to default" : "Berezarri balio lehenetsira", + "Upload" : "Igo", + "Remove background image" : "Kendu atzeko-planoko irudia", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sarbide unibertsala izatea oso garrantzitsua da guretzat. Web estadandarrak jarraitu eta guztia sagurik gabe erabili ahal izatea bermatzen dugu, pantaila-irakurle moduko software laguntzaileak barne. Helburu bezala jartzen dugu {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 AA mailan betetzea, kontraste altuko modua AAA mailaraino betez." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/fa.js b/apps/theming/l10n/fa.js new file mode 100644 index 00000000000..1d1ff5288db --- /dev/null +++ b/apps/theming/l10n/fa.js @@ -0,0 +1,87 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "نام داده شده بیش از حد بلند است", + "The given web address is too long" : "نشانی وب داده شده بیش از حد بلند است", + "The given web address is not a valid URL" : "نشانی وب داده شده معتبر نیست", + "The given legal notice address is too long" : "نشانی توصیهٔ حقوقی داده شده بیش از حد بلند است", + "The given legal notice address is not a valid URL" : "نشانی توصیهٔ حقوقی داده شده معتبر نیست", + "The given privacy policy address is too long" : "نشانی سیاست محرمانگی داده شده بیش از حد بلند است", + "The given privacy policy address is not a valid URL" : "نشانی سیاست محرمانگی داده شده معتبر نیست", + "The given slogan is too long" : "شعار داده شده بیش از حد بلند است", + "The given color is invalid" : "رنگ داده شده نامعتبر است", + "Disable-user-theming should be true or false" : "مقدار Disable-user-theming باید true یا false باشد", + "Saved" : "ذخیره شد", + "The file was uploaded" : "پرونده بارگذاری شد", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم پروندهٔ بارگذاری شده بیشتر از upload_max_filesize در php.ini است", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم پروندهٔ بارگذاری شده بیشتر از MAX_FILE_SIZE مشخّص شده در فرم HTML است", + "The file was only partially uploaded" : "پرونده به صورت ناقص بارگذاری شده بود", + "No file was uploaded" : "هیچ پروندهای بارگذاری نشده", + "Missing a temporary folder" : "یک شاخهٔ موقّتی گم شده", + "Could not write file to disk" : "نتوانست پرونده را روی دیسک بنویسد", + "A PHP extension stopped the file upload" : "یک افزونهٔ پیاچپی بارگذاری پرونده را متوقّف کرد", + "No file uploaded" : "هیچ پروندهای بارگذاری نشد", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "هماکنون در حال استفاده از یک زمینهٔ شخصی هستید. ممکن است تنظمیات کارهٔ زمینش به دستش پایکال شوند.", + "Theming" : "زمینش", + "Appearance and accessibility" : "ظاهر و دسترسیپذیری", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "Dark theme with high contrast mode" : "زمینهٔ تیره با حالت سایهروشن بالا", + "Enable dark high contrast mode" : "به کار انداختن حالت سایهروشن تاریک", + "Similar to the high contrast mode, but with dark colours." : "شبیه حالت سایهروشن بالا، ولی با رنگهای تیره", + "Dark theme" : "زمینهٔ تیره", + "Enable dark theme" : "به کار انداختن زمینهٔ تیره", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "زمینهای تاریک برای آسایش چشمانتان با کاستن نوردهی و روشنایی کلّی.", + "System default theme" : "زمینه ی پیش فرض سامانه", + "Enable the system default" : "به کار انداختن پیشگزیدهٔ سامانه", + "Using the default system appearance." : "استفاده از ظاهر پیش فرض سامانه", + "Dyslexia font" : "قلم خوانشپریش", + "Enable dyslexia font" : "به کار انداختن قلم خوانشپریش", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "اُپندیسلکسیک قلمی آزاد است که برای کاهش برخی از خطاهای معمول در خواندن ناشی از خوانشپریشی طرّاحی شده.", + "High contrast mode" : "حالت سایهروشن بالا", + "Enable high contrast mode" : "به کار انداختن حالت سایهروشن بالا", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "حالتی با سایهروشن بالا برای آسایش ناوبریتان. کیفیت بصری کاهش خواهد یافت؛ ولی وضوح افزایش میباید.", + "Light theme" : "زمینهٔ روشن", + "Enable the default light theme" : "به کار انداختن زمینهٔ روشن پیشگزیده", + "The default light appearance." : "ظاهر روشن پیش گزیده.", + "Legal notice" : "توصیهٔ حقوقی", + "Privacy policy" : "سیاست محرمانگی", + "Adjust the Nextcloud theme" : "تنظیم زمینهٔ نکستکلود", + "Name" : "نام", + "Web link" : "پیوند وب", + "a safe home for all your data" : "خانهای امن برای تمامی دادههایتان", + "Slogan" : "شعار", + "Legal notice link" : "پیوند توصیهٔ حقوقی", + "Privacy policy link" : "پیوند سیاست محرمانگی", + "Header logo" : "نشان سرایند", + "Upload new header logo" : "بارگذاری نشان سرایند جدید", + "Favicon" : "نقشک صفحه", + "Upload new favicon" : "بارگذاری نقشک صفحهٔ جدید", + "User settings" : "تنظمبات کاربری", + "Disable user theming" : "از کار انداختن زمینش کاربری", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.", + "Upload new logo" : "بارگذاری نشان جدید", + "Logo" : "نشان", + "Upload new background and login image" : "بارگذاری تصویر پسزمینه و ورود جدید", + "Background and login image" : "تصویر پسزمینه و ورود", + "Advanced options" : "گزینههای پیشرفته", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Customization has been disabled by your administrator" : "شخصیسازی به دست مدیرتان از کار افتاده", + "Keyboard shortcuts" : "میانبرهای صفحهکلید", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "از کار انداختن تمامی میانبرهای صفحهکلید", + "Move up" : "Move up", + "Move down" : "حرکت به پایین", + "Select a background from your files" : "Select a background from your files", + "Custom background" : "Custom background", + "Plain background" : "پسزمینهٔ ساده", + "Default background" : "Default background", + "Theme selection is enforced" : "گزینش زمینه اجباری است", + "Select a custom color" : "گزینش رنگی شخصی", + "Reset to default" : "بازنشانی به پیشگزیده", + "Upload" : "بارگذاری", + "Remove background image" : "برداشتن تصویر پسزمینه", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "دسترسی جهانی برای ما بسیار مهم است. ما از استانداردهای وب پیروی میکنیم و دقیت میکنیم تا همه چیز بدون موشواره و نرمافزارهای کمکی مانند صفحهخوانها نیز قابل استفاده باشند. هدف ما این است که مطابق با دستورالعمل {guidelines}راهنماهای دسترسپذیری محتوا تحت وب{linkend} نسخه 2.1 در سطح AA، و حتی با زمینه کنتراست بالا در سطح AAA باشیم." +}, +"nplurals=2; plural=(n > 1);"); diff --git a/apps/theming/l10n/fa.json b/apps/theming/l10n/fa.json new file mode 100644 index 00000000000..6779e8e5715 --- /dev/null +++ b/apps/theming/l10n/fa.json @@ -0,0 +1,85 @@ +{ "translations": { + "The given name is too long" : "نام داده شده بیش از حد بلند است", + "The given web address is too long" : "نشانی وب داده شده بیش از حد بلند است", + "The given web address is not a valid URL" : "نشانی وب داده شده معتبر نیست", + "The given legal notice address is too long" : "نشانی توصیهٔ حقوقی داده شده بیش از حد بلند است", + "The given legal notice address is not a valid URL" : "نشانی توصیهٔ حقوقی داده شده معتبر نیست", + "The given privacy policy address is too long" : "نشانی سیاست محرمانگی داده شده بیش از حد بلند است", + "The given privacy policy address is not a valid URL" : "نشانی سیاست محرمانگی داده شده معتبر نیست", + "The given slogan is too long" : "شعار داده شده بیش از حد بلند است", + "The given color is invalid" : "رنگ داده شده نامعتبر است", + "Disable-user-theming should be true or false" : "مقدار Disable-user-theming باید true یا false باشد", + "Saved" : "ذخیره شد", + "The file was uploaded" : "پرونده بارگذاری شد", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "حجم پروندهٔ بارگذاری شده بیشتر از upload_max_filesize در php.ini است", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "حجم پروندهٔ بارگذاری شده بیشتر از MAX_FILE_SIZE مشخّص شده در فرم HTML است", + "The file was only partially uploaded" : "پرونده به صورت ناقص بارگذاری شده بود", + "No file was uploaded" : "هیچ پروندهای بارگذاری نشده", + "Missing a temporary folder" : "یک شاخهٔ موقّتی گم شده", + "Could not write file to disk" : "نتوانست پرونده را روی دیسک بنویسد", + "A PHP extension stopped the file upload" : "یک افزونهٔ پیاچپی بارگذاری پرونده را متوقّف کرد", + "No file uploaded" : "هیچ پروندهای بارگذاری نشد", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "هماکنون در حال استفاده از یک زمینهٔ شخصی هستید. ممکن است تنظمیات کارهٔ زمینش به دستش پایکال شوند.", + "Theming" : "زمینش", + "Appearance and accessibility" : "ظاهر و دسترسیپذیری", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "Dark theme with high contrast mode" : "زمینهٔ تیره با حالت سایهروشن بالا", + "Enable dark high contrast mode" : "به کار انداختن حالت سایهروشن تاریک", + "Similar to the high contrast mode, but with dark colours." : "شبیه حالت سایهروشن بالا، ولی با رنگهای تیره", + "Dark theme" : "زمینهٔ تیره", + "Enable dark theme" : "به کار انداختن زمینهٔ تیره", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "زمینهای تاریک برای آسایش چشمانتان با کاستن نوردهی و روشنایی کلّی.", + "System default theme" : "زمینه ی پیش فرض سامانه", + "Enable the system default" : "به کار انداختن پیشگزیدهٔ سامانه", + "Using the default system appearance." : "استفاده از ظاهر پیش فرض سامانه", + "Dyslexia font" : "قلم خوانشپریش", + "Enable dyslexia font" : "به کار انداختن قلم خوانشپریش", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "اُپندیسلکسیک قلمی آزاد است که برای کاهش برخی از خطاهای معمول در خواندن ناشی از خوانشپریشی طرّاحی شده.", + "High contrast mode" : "حالت سایهروشن بالا", + "Enable high contrast mode" : "به کار انداختن حالت سایهروشن بالا", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "حالتی با سایهروشن بالا برای آسایش ناوبریتان. کیفیت بصری کاهش خواهد یافت؛ ولی وضوح افزایش میباید.", + "Light theme" : "زمینهٔ روشن", + "Enable the default light theme" : "به کار انداختن زمینهٔ روشن پیشگزیده", + "The default light appearance." : "ظاهر روشن پیش گزیده.", + "Legal notice" : "توصیهٔ حقوقی", + "Privacy policy" : "سیاست محرمانگی", + "Adjust the Nextcloud theme" : "تنظیم زمینهٔ نکستکلود", + "Name" : "نام", + "Web link" : "پیوند وب", + "a safe home for all your data" : "خانهای امن برای تمامی دادههایتان", + "Slogan" : "شعار", + "Legal notice link" : "پیوند توصیهٔ حقوقی", + "Privacy policy link" : "پیوند سیاست محرمانگی", + "Header logo" : "نشان سرایند", + "Upload new header logo" : "بارگذاری نشان سرایند جدید", + "Favicon" : "نقشک صفحه", + "Upload new favicon" : "بارگذاری نقشک صفحهٔ جدید", + "User settings" : "تنظمبات کاربری", + "Disable user theming" : "از کار انداختن زمینش کاربری", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.", + "Upload new logo" : "بارگذاری نشان جدید", + "Logo" : "نشان", + "Upload new background and login image" : "بارگذاری تصویر پسزمینه و ورود جدید", + "Background and login image" : "تصویر پسزمینه و ورود", + "Advanced options" : "گزینههای پیشرفته", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Customization has been disabled by your administrator" : "شخصیسازی به دست مدیرتان از کار افتاده", + "Keyboard shortcuts" : "میانبرهای صفحهکلید", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "از کار انداختن تمامی میانبرهای صفحهکلید", + "Move up" : "Move up", + "Move down" : "حرکت به پایین", + "Select a background from your files" : "Select a background from your files", + "Custom background" : "Custom background", + "Plain background" : "پسزمینهٔ ساده", + "Default background" : "Default background", + "Theme selection is enforced" : "گزینش زمینه اجباری است", + "Select a custom color" : "گزینش رنگی شخصی", + "Reset to default" : "بازنشانی به پیشگزیده", + "Upload" : "بارگذاری", + "Remove background image" : "برداشتن تصویر پسزمینه", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "دسترسی جهانی برای ما بسیار مهم است. ما از استانداردهای وب پیروی میکنیم و دقیت میکنیم تا همه چیز بدون موشواره و نرمافزارهای کمکی مانند صفحهخوانها نیز قابل استفاده باشند. هدف ما این است که مطابق با دستورالعمل {guidelines}راهنماهای دسترسپذیری محتوا تحت وب{linkend} نسخه 2.1 در سطح AA، و حتی با زمینه کنتراست بالا در سطح AAA باشیم." +},"pluralForm" :"nplurals=2; plural=(n > 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/fi.js b/apps/theming/l10n/fi.js new file mode 100644 index 00000000000..3c121a097d8 --- /dev/null +++ b/apps/theming/l10n/fi.js @@ -0,0 +1,89 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Nimi on liian pitkä", + "The given web address is too long" : "Verkko-osoite on liian pitkä", + "The given web address is not a valid URL" : "Annettu verkko-osoite ei ole kelvollinen URL", + "The given legal notice address is too long" : "Annettu lainopillisen huomautuksen osoite on liian pitkä", + "The given legal notice address is not a valid URL" : "Annettu lainopillisen huomautuksen osoite ei ole kelvollinen URL", + "The given privacy policy address is too long" : "Annettu yksityiskäytännön osoite on liian pitkä", + "The given privacy policy address is not a valid URL" : "Annettu yksityiskäytännön osoite ei ole kelvollinen URL", + "The given slogan is too long" : "Slogani on liian pitkä", + "The given color is invalid" : "Väri on virheellinen", + "Saved" : "Tallennettu", + "The file was uploaded" : "Tiedosto lähetettiin", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Lähetetty tiedosto ylittää php.ini-tiedoston upload_max_filesize-tietueen arvon", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Lähetettävän tiedoston enimmäiskoko ylittää HTML-lomakkeessa määritellyn MAX_FILE_SIZE-säännön", + "The file was only partially uploaded" : "Tiedosto lähetettiin vain osittain", + "No file was uploaded" : "Tiedostoa ei lähetetty", + "Missing a temporary folder" : "Väliaikaiskansio puuttuu", + "Could not write file to disk" : "Tiedostoa ei voitu kirjoittaa levylle", + "A PHP extension stopped the file upload" : "PHP-laajennus pysäytti tiedoston lähettämisen", + "No file uploaded" : "Ei tiedostoa lähetetty", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Käytät jo mukautettua teemaa. Teemoitussovelluksen asetukset saatetaan ohittaa.", + "Theming" : "Teema", + "Appearance and accessibility" : "Ulkoasu ja saavutettavuus", + "PHP Imagick module" : "PHP:n Imagick-moduuli", + "Dark theme with high contrast mode" : "Tumma teema korkean kontrastin tilalla", + "Enable dark high contrast mode" : "Ota käyttöön tumma korkean kontrastin tila", + "Similar to the high contrast mode, but with dark colours." : "Samankaltainen korkean kontrastin tilan kanssa, mutta tummien värien kera.", + "Dark theme" : "Tumma teema", + "Enable dark theme" : "Käytä tummaa teemaa", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tumma teema, joka estää silmien rasittumista vähentämällä kirkkautta.", + "System default theme" : "Järjestelmän oletusteema", + "Enable the system default" : "Käytä järjestelmän oletusta", + "Using the default system appearance." : "Käytetään järjestelmän oletusarvoista ulkoasua.", + "Dyslexia font" : "Lukihäiriökirjasin", + "Enable dyslexia font" : "Käytä lukihäiriökirjasinta", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic on vapaa kirjasin, joka on suunniteltu lieventämään lukihäiriön aiheuttamia lukuvirheitä.", + "High contrast mode" : "Suuren kontrastin tila", + "Enable high contrast mode" : "Käytä suuren kontrastin tilaa", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Suuren kontrasin tila helpottaa liikkumista. Visuaalista näyttävyyttä karsitaan hieman, jotta käyttöliittymä olisi jopa aiempaa selkeämpi.", + "Light theme" : "Vaalea teema", + "Enable the default light theme" : "Ota käyttöön oletusarvoinen vaalea teema", + "The default light appearance." : "Oletusarvoinen vaalea ulkoasu.", + "Legal notice" : "Lainopillinen huomautus", + "Privacy policy" : "Yksityisyyskäytäntö", + "Adjust the Nextcloud theme" : "Mukauta Nextcloudin teemaa", + "Name" : "Nimi", + "Web link" : "Verkkolinkki", + "a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi", + "Slogan" : "Slogani", + "Legal notice link" : "Lainopillisen huomautuksen linkki", + "Privacy policy link" : "Yksityisyyskäytännön linkki", + "Header logo" : "Otsakelogo", + "Upload new header logo" : "Lähetä uusi otsakelogo", + "Favicon" : "Favicon", + "Upload new favicon" : "Lähetä uusi favicon", + "User settings" : "Käyttäjäasetukset", + "Disable user theming" : "Poista käyttäjäteemoitus käytöstä", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Vaikka voit mukauttaa instanssia, käyttäjät voivat vaihtaa taustakuvaansa ja värejään. Jos haluat pakottaa mukautukset käyttäjille, ota tämä asetus käyttöön.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teeman avulla voit helposti kustomoida web-käyttöliittymän ja tuettujen sovelluksien ulkonäköä ja tuntumaa. Teema näkyy kaikille käyttäjille.", + "Upload new logo" : "Lähetä uusi logo", + "Logo" : "Logo", + "Upload new background and login image" : "Lähetä uusi taustakuva ja kirjautumissivun kuva", + "Background and login image" : "Tausta- ja kirjautumiskuva", + "Advanced options" : "Lisävalinnat", + "Appearance and accessibility settings" : "Ulkoasun ja saavutettavuuden asetukset", + "Customization has been disabled by your administrator" : "Mukauttaminen on poistettu käytöstä ylläpitäjän toimesta", + "Keyboard shortcuts" : "Pikanäppäimet", + "Disable all keyboard shortcuts" : "Poista käytöstä kaikki pikanäppäimet", + "Move up" : "Siirrä ylös", + "Move down" : "Siirrä alas", + "Select a background from your files" : "Valitse taustakuva tiedostoista", + "Select background" : "Valitse tausta", + "No background has been selected" : "Taustaa ei ole valittu", + "Custom background" : "Mukautettu taustakuva", + "Plain background" : "Yksinkertainen tausta", + "Default background" : "Oletustausta", + "Theme selection is enforced" : "Teemavalinta on pakotettu", + "Navigation bar settings" : "Navigointipalkin asetukset", + "Default app" : "Oletussovellus", + "Use custom default app" : "Käytä mukautettua oletussovellusta", + "Select a custom color" : "Valitse mukautettu väri", + "Reset to default" : "Palauta oletukseksi", + "Upload" : "Lähetä", + "Remove background image" : "Poista taustakuva", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Saavutettavuus on erittäin tärkeää meille. Seuraamme verkkostandardeja ja varmistamme, että kaikki on käytettävissä ilman hiirtä sekä avustavien ohjelmistojen kuten ruudunlukijoiden avulla. Pyrimme olemaan yhteensopivia {guidelines}Web Content Accessibility Guidelines{linkend} -ohjeistuksen version 2.1 AA-tason kanssa, suuren kontrastin teemalla pyrimme jopa AAA-tasoon." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/fi.json b/apps/theming/l10n/fi.json new file mode 100644 index 00000000000..73e04274155 --- /dev/null +++ b/apps/theming/l10n/fi.json @@ -0,0 +1,87 @@ +{ "translations": { + "The given name is too long" : "Nimi on liian pitkä", + "The given web address is too long" : "Verkko-osoite on liian pitkä", + "The given web address is not a valid URL" : "Annettu verkko-osoite ei ole kelvollinen URL", + "The given legal notice address is too long" : "Annettu lainopillisen huomautuksen osoite on liian pitkä", + "The given legal notice address is not a valid URL" : "Annettu lainopillisen huomautuksen osoite ei ole kelvollinen URL", + "The given privacy policy address is too long" : "Annettu yksityiskäytännön osoite on liian pitkä", + "The given privacy policy address is not a valid URL" : "Annettu yksityiskäytännön osoite ei ole kelvollinen URL", + "The given slogan is too long" : "Slogani on liian pitkä", + "The given color is invalid" : "Väri on virheellinen", + "Saved" : "Tallennettu", + "The file was uploaded" : "Tiedosto lähetettiin", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Lähetetty tiedosto ylittää php.ini-tiedoston upload_max_filesize-tietueen arvon", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Lähetettävän tiedoston enimmäiskoko ylittää HTML-lomakkeessa määritellyn MAX_FILE_SIZE-säännön", + "The file was only partially uploaded" : "Tiedosto lähetettiin vain osittain", + "No file was uploaded" : "Tiedostoa ei lähetetty", + "Missing a temporary folder" : "Väliaikaiskansio puuttuu", + "Could not write file to disk" : "Tiedostoa ei voitu kirjoittaa levylle", + "A PHP extension stopped the file upload" : "PHP-laajennus pysäytti tiedoston lähettämisen", + "No file uploaded" : "Ei tiedostoa lähetetty", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Käytät jo mukautettua teemaa. Teemoitussovelluksen asetukset saatetaan ohittaa.", + "Theming" : "Teema", + "Appearance and accessibility" : "Ulkoasu ja saavutettavuus", + "PHP Imagick module" : "PHP:n Imagick-moduuli", + "Dark theme with high contrast mode" : "Tumma teema korkean kontrastin tilalla", + "Enable dark high contrast mode" : "Ota käyttöön tumma korkean kontrastin tila", + "Similar to the high contrast mode, but with dark colours." : "Samankaltainen korkean kontrastin tilan kanssa, mutta tummien värien kera.", + "Dark theme" : "Tumma teema", + "Enable dark theme" : "Käytä tummaa teemaa", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tumma teema, joka estää silmien rasittumista vähentämällä kirkkautta.", + "System default theme" : "Järjestelmän oletusteema", + "Enable the system default" : "Käytä järjestelmän oletusta", + "Using the default system appearance." : "Käytetään järjestelmän oletusarvoista ulkoasua.", + "Dyslexia font" : "Lukihäiriökirjasin", + "Enable dyslexia font" : "Käytä lukihäiriökirjasinta", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic on vapaa kirjasin, joka on suunniteltu lieventämään lukihäiriön aiheuttamia lukuvirheitä.", + "High contrast mode" : "Suuren kontrastin tila", + "Enable high contrast mode" : "Käytä suuren kontrastin tilaa", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Suuren kontrasin tila helpottaa liikkumista. Visuaalista näyttävyyttä karsitaan hieman, jotta käyttöliittymä olisi jopa aiempaa selkeämpi.", + "Light theme" : "Vaalea teema", + "Enable the default light theme" : "Ota käyttöön oletusarvoinen vaalea teema", + "The default light appearance." : "Oletusarvoinen vaalea ulkoasu.", + "Legal notice" : "Lainopillinen huomautus", + "Privacy policy" : "Yksityisyyskäytäntö", + "Adjust the Nextcloud theme" : "Mukauta Nextcloudin teemaa", + "Name" : "Nimi", + "Web link" : "Verkkolinkki", + "a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi", + "Slogan" : "Slogani", + "Legal notice link" : "Lainopillisen huomautuksen linkki", + "Privacy policy link" : "Yksityisyyskäytännön linkki", + "Header logo" : "Otsakelogo", + "Upload new header logo" : "Lähetä uusi otsakelogo", + "Favicon" : "Favicon", + "Upload new favicon" : "Lähetä uusi favicon", + "User settings" : "Käyttäjäasetukset", + "Disable user theming" : "Poista käyttäjäteemoitus käytöstä", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Vaikka voit mukauttaa instanssia, käyttäjät voivat vaihtaa taustakuvaansa ja värejään. Jos haluat pakottaa mukautukset käyttäjille, ota tämä asetus käyttöön.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teeman avulla voit helposti kustomoida web-käyttöliittymän ja tuettujen sovelluksien ulkonäköä ja tuntumaa. Teema näkyy kaikille käyttäjille.", + "Upload new logo" : "Lähetä uusi logo", + "Logo" : "Logo", + "Upload new background and login image" : "Lähetä uusi taustakuva ja kirjautumissivun kuva", + "Background and login image" : "Tausta- ja kirjautumiskuva", + "Advanced options" : "Lisävalinnat", + "Appearance and accessibility settings" : "Ulkoasun ja saavutettavuuden asetukset", + "Customization has been disabled by your administrator" : "Mukauttaminen on poistettu käytöstä ylläpitäjän toimesta", + "Keyboard shortcuts" : "Pikanäppäimet", + "Disable all keyboard shortcuts" : "Poista käytöstä kaikki pikanäppäimet", + "Move up" : "Siirrä ylös", + "Move down" : "Siirrä alas", + "Select a background from your files" : "Valitse taustakuva tiedostoista", + "Select background" : "Valitse tausta", + "No background has been selected" : "Taustaa ei ole valittu", + "Custom background" : "Mukautettu taustakuva", + "Plain background" : "Yksinkertainen tausta", + "Default background" : "Oletustausta", + "Theme selection is enforced" : "Teemavalinta on pakotettu", + "Navigation bar settings" : "Navigointipalkin asetukset", + "Default app" : "Oletussovellus", + "Use custom default app" : "Käytä mukautettua oletussovellusta", + "Select a custom color" : "Valitse mukautettu väri", + "Reset to default" : "Palauta oletukseksi", + "Upload" : "Lähetä", + "Remove background image" : "Poista taustakuva", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Saavutettavuus on erittäin tärkeää meille. Seuraamme verkkostandardeja ja varmistamme, että kaikki on käytettävissä ilman hiirtä sekä avustavien ohjelmistojen kuten ruudunlukijoiden avulla. Pyrimme olemaan yhteensopivia {guidelines}Web Content Accessibility Guidelines{linkend} -ohjeistuksen version 2.1 AA-tason kanssa, suuren kontrastin teemalla pyrimme jopa AAA-tasoon." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/fr.js b/apps/theming/l10n/fr.js new file mode 100644 index 00000000000..074ab2a9cdf --- /dev/null +++ b/apps/theming/l10n/fr.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Le nom donné est trop long", + "The given web address is too long" : "L’adresse web donnée est trop longue", + "The given web address is not a valid URL" : "L'adresse web n'est pas une URL valide", + "The given legal notice address is too long" : "L'adresse fournie pour la notice légale est trop longue", + "The given legal notice address is not a valid URL" : "L'adresse de la notice légale n'est pas une URL valide", + "The given privacy policy address is too long" : "L'adresse de la politique de confidentialité est trop longue", + "The given privacy policy address is not a valid URL" : "L'adresse de la politique de confidentialité n'est pas une URL valide", + "The given slogan is too long" : "Le slogan donné est trop long", + "The given color is invalid" : "La couleur donnée est invalide", + "Disable-user-theming should be true or false" : "Désactiver le thème de l'utilisateur doit valoir vrai ou faux.", + "Saved" : "Enregistré", + "Invalid app given" : "Application invalide indiquée", + "Invalid type for setting \"defaultApp\" given" : "Type non valide pour le paramètre \"defaultApp\" donné", + "Invalid setting key" : "Clé de réglage non valide", + "The file was uploaded" : "Le fichier a été téléversé", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier téléversé dépasse la valeur MAX_FILE_SIZE spécifiée dans le formulaire HTML", + "The file was only partially uploaded" : "Le fichier n'a été que partiellement téléversé", + "No file was uploaded" : "Aucun fichier n'a été téléversé", + "Missing a temporary folder" : "Absence de dossier temporaire", + "Could not write file to disk" : "Impossible d'écrire le fichier sur le disque", + "A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier", + "No file uploaded" : "Aucun fichier téléversé", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Vous utilisez déjà un thème personnalisé. Les paramètres de l'application Theming peuvent être remplacés par ceux-ci.", + "Theming" : "Personnaliser l'apparence", + "Appearance and accessibility" : "Apparence et accessibilité", + "PHP Imagick module" : "Module PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n’est pas actif mais l’application Theming est activée. Pour que la génération du Favicon fonctionne correctement, ce module doit être installé et actif.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Le module PHP « imagick » n’a aucun support SVG dans cette instance. Pour une meilleure compatibilité, il est recommandé de l’installer.", + "Dark theme with high contrast mode" : "Thème sombre avec mode de contraste élevé", + "Enable dark high contrast mode" : "Activer le mode sombre à contraste élevé", + "Similar to the high contrast mode, but with dark colours." : "Similaire au mode de contraste élevé, mais avec des couleurs sombres.", + "Dark theme" : "Thème sombre", + "Enable dark theme" : "Activer le thème sombre", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un thème sombre pour soulager vos yeux en réduisant la luminosité et l'éclat général.", + "System default theme" : "Thème par défaut du système", + "Enable the system default" : "Activer le thème par défaut du système", + "Using the default system appearance." : "Utiliser l'apparence par défaut du système.", + "Dyslexia font" : "Police pour dyslexiques", + "Enable dyslexia font" : "Activer la police pour dyslexiques", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est une police de caractères libre conçue pour atténuer certaines des erreurs de lecture courantes causées par la dyslexie.", + "High contrast mode" : "Thème à contraste élevé", + "Enable high contrast mode" : "Activer le thème à contraste élevé", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera accrue.", + "Light theme" : "Thème clair", + "Enable the default light theme" : "Activer le thème clair par défaut", + "The default light appearance." : "L'apparence claire par défaut.", + "Legal notice" : "Notice légale", + "Privacy policy" : "Politique de confidentialité", + "Adjust the Nextcloud theme" : "Modifier le thème Nextcloud", + "Name" : "Nom", + "Web link" : "Lien web", + "a safe home for all your data" : "un lieu sûr pour toutes vos données", + "Slogan" : "Slogan", + "Primary color" : "Couleur principale", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "La couleur principale est utilisée pour mettre en évidence des éléments tels que les boutons importants. Elle peut être légèrement modifiée en fonction du schéma de couleurs actuel.", + "Legal notice link" : "Lien vers la notice légale", + "Privacy policy link" : "Lien vers la politique de confidentialité", + "Header logo" : "Logo d'en-tête", + "Upload new header logo" : "Téléverser un nouveau logo d'en-tête", + "Favicon" : "Favicon", + "Upload new favicon" : "Téléverser un nouveau favicon", + "User settings" : "Paramètres utilisateurs", + "Disable user theming" : "Désactiver la gestion du thème par l'utilisateur", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Bien que vous puissiez sélectionner et personnaliser votre instance, les utilisateurs peuvent modifier leur arrière-plan et leurs couleurs. Si vous voulez imposer votre personnalisation, vous pouvez activer cette option.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Cette extension permet de personnaliser facilement l'apparence de votre instance et des clients supportés. La personnalisation de l'apparence sera visible par tous les utilisateurs.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Au lieu d'une image d'arrière-plan, vous pouvez également définir une couleur unie d'arrière-plan. Si vous utilisez une image d'arrière-plan, la modification de cette couleur influencera la couleur des icônes du menu de l'application.", + "Background color" : "Couleur d'arrière-plan", + "Upload new logo" : "Téléverser un nouveau logo", + "Logo" : "Logo", + "Upload new background and login image" : "Téléverser une nouvelle image d'arrière-plan et de connexion", + "Background and login image" : "Image d'arrière-plan et de connexion", + "Advanced options" : "Options avancées", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installez l'extension PHP ImageMagick qui prend en charge les images SVG pour générer automatiquement des favicons à partir du logo téléversé et de la couleur indiquée.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d’assistance technique tels que les lecteurs d’écran. Nous visons à respecter les {linkstart}Règles pour l’accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez des problèmes, n'hésitez pas à les signaler sur {issuetracker}notre outil de suivi des problèmes{linkend}. Et si vous voulez vous impliquer, venez rejoindre {designteam}notre équipe de design{linkend} !", + "Unable to apply the setting." : "Impossible d'appliquer le réglage.", + "Appearance and accessibility settings" : "Paramètres d’apparence et d’accessibilité", + "Misc accessibility options" : "Diverses options d'accessibilité", + "Enable blur background filter (may increase GPU load)" : "Activer le filtre flou de l'arrière-plan (peut augmenter la charge du GPU)", + "Customization has been disabled by your administrator" : "La personnalisation a été désactivée par votre administrateur", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Définissez une couleur principale pour mettre en évidence les éléments importants. La couleur utilisée pour les éléments tels que les boutons primaires peut varier légèrement en fonction des exigences d'accessibilité.", + "Background and color" : "Image d’arrière-plan et couleur", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "L'arrière-plan peut être une image du catalogue par défaut, une image personnalisée téléversée ou une couleur unie.", + "Keyboard shortcuts" : "Raccourcis clavier", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Dans certains cas, les raccourcis clavier peuvent interférer avec les outils d'accessibilité. Afin de vous permettre de vous concentrer correctement sur votre outil, vous pouvez désactiver tous les raccourcis clavier ici. Cela désactivera également tous les raccourcis disponibles dans les applications.", + "Disable all keyboard shortcuts" : "Désactiver tous les raccourcis clavier", + "Current selected app: {app}, position {position} of {total}" : "L'application sélectionnée actuelle : {app}, position {position} de {total}", + "Move up" : "Monter", + "Move down" : "Descendre", + "Select a background from your files" : "Sélectionner un arrière-plan parmi vos fichiers", + "Select background" : "Sélectionner un arrière-plan", + "No background has been selected" : "Aucun arrière-plan n'a été sélectionné", + "Custom background" : "Arrière-plan personnalisé", + "Plain background" : "Arrière-plan uni", + "Default background" : "Arrière-plan par défaut", + "Theme selection is enforced" : "La sélection du thème est imposée", + "Could not set the app order" : "Impossible de définir l'ordre des applications", + "Could not reset the app order" : "Impossible de réinitialiser l'ordre des applications", + "Navigation bar settings" : "Paramètres de la barre de navigation", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Vous pouvez configurer l'ordre des applications utilisées dans la barre de navigation. La première entrée sera l'application par défaut, ouverte après la connexion ou en cliquant sur le logo.", + "The default app can not be changed because it was configured by the administrator." : "L'application par défaut ne peut pas être changée, car elle a été configurée par l'administrateur.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordre des applications a été changé, pour le voir en action, vous devez recharger la page.", + "Reset default app order" : "Rétablir l'ordre par défaut des applications ", + "Could not set primary color" : "Impossible de définir la couleur principale", + "Reset primary color" : "Réinitialiser la couleur principale", + "Could not set global default apps" : "Impossible de définir les applications globales par défaut", + "Default app" : "Application par défaut", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'application par défaut est l'application qui, par exemple, s'ouvre après une connexion ou lorsque l'on clique sur le logo du menu.", + "Use custom default app" : "Utiliser l'application par défaut personnalisée", + "Global default app" : "Application par défaut globale", + "Global default apps" : "Applications par défaut globales", + "Default app priority" : "Priorité de l'application par défaut", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si une application n'est pas activée pour un utilisateur, l'application suivante avec une priorité plus basse sera utilisée.", + "Select a custom color" : "Sélectionnez une couleur personnalisée", + "Reset to default" : "Restaurer les valeurs par défaut", + "Upload" : "Téléverser", + "Remove background image" : "Retirer l'image d'arrière-plan", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous vérifions que tout est utilisable même sans souris et sans logiciel d'assistance comme les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + ". Unable to apply the setting." : ". Impossible d'appliquer le réglage." +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/fr.json b/apps/theming/l10n/fr.json new file mode 100644 index 00000000000..8daa7ef3e89 --- /dev/null +++ b/apps/theming/l10n/fr.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Le nom donné est trop long", + "The given web address is too long" : "L’adresse web donnée est trop longue", + "The given web address is not a valid URL" : "L'adresse web n'est pas une URL valide", + "The given legal notice address is too long" : "L'adresse fournie pour la notice légale est trop longue", + "The given legal notice address is not a valid URL" : "L'adresse de la notice légale n'est pas une URL valide", + "The given privacy policy address is too long" : "L'adresse de la politique de confidentialité est trop longue", + "The given privacy policy address is not a valid URL" : "L'adresse de la politique de confidentialité n'est pas une URL valide", + "The given slogan is too long" : "Le slogan donné est trop long", + "The given color is invalid" : "La couleur donnée est invalide", + "Disable-user-theming should be true or false" : "Désactiver le thème de l'utilisateur doit valoir vrai ou faux.", + "Saved" : "Enregistré", + "Invalid app given" : "Application invalide indiquée", + "Invalid type for setting \"defaultApp\" given" : "Type non valide pour le paramètre \"defaultApp\" donné", + "Invalid setting key" : "Clé de réglage non valide", + "The file was uploaded" : "Le fichier a été téléversé", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier téléversé dépasse la valeur MAX_FILE_SIZE spécifiée dans le formulaire HTML", + "The file was only partially uploaded" : "Le fichier n'a été que partiellement téléversé", + "No file was uploaded" : "Aucun fichier n'a été téléversé", + "Missing a temporary folder" : "Absence de dossier temporaire", + "Could not write file to disk" : "Impossible d'écrire le fichier sur le disque", + "A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier", + "No file uploaded" : "Aucun fichier téléversé", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Vous utilisez déjà un thème personnalisé. Les paramètres de l'application Theming peuvent être remplacés par ceux-ci.", + "Theming" : "Personnaliser l'apparence", + "Appearance and accessibility" : "Apparence et accessibilité", + "PHP Imagick module" : "Module PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n’est pas actif mais l’application Theming est activée. Pour que la génération du Favicon fonctionne correctement, ce module doit être installé et actif.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Le module PHP « imagick » n’a aucun support SVG dans cette instance. Pour une meilleure compatibilité, il est recommandé de l’installer.", + "Dark theme with high contrast mode" : "Thème sombre avec mode de contraste élevé", + "Enable dark high contrast mode" : "Activer le mode sombre à contraste élevé", + "Similar to the high contrast mode, but with dark colours." : "Similaire au mode de contraste élevé, mais avec des couleurs sombres.", + "Dark theme" : "Thème sombre", + "Enable dark theme" : "Activer le thème sombre", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un thème sombre pour soulager vos yeux en réduisant la luminosité et l'éclat général.", + "System default theme" : "Thème par défaut du système", + "Enable the system default" : "Activer le thème par défaut du système", + "Using the default system appearance." : "Utiliser l'apparence par défaut du système.", + "Dyslexia font" : "Police pour dyslexiques", + "Enable dyslexia font" : "Activer la police pour dyslexiques", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est une police de caractères libre conçue pour atténuer certaines des erreurs de lecture courantes causées par la dyslexie.", + "High contrast mode" : "Thème à contraste élevé", + "Enable high contrast mode" : "Activer le thème à contraste élevé", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un thème au contraste élevé pour faciliter votre navigation. La qualité visuelle sera réduite, mais la clarté sera accrue.", + "Light theme" : "Thème clair", + "Enable the default light theme" : "Activer le thème clair par défaut", + "The default light appearance." : "L'apparence claire par défaut.", + "Legal notice" : "Notice légale", + "Privacy policy" : "Politique de confidentialité", + "Adjust the Nextcloud theme" : "Modifier le thème Nextcloud", + "Name" : "Nom", + "Web link" : "Lien web", + "a safe home for all your data" : "un lieu sûr pour toutes vos données", + "Slogan" : "Slogan", + "Primary color" : "Couleur principale", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "La couleur principale est utilisée pour mettre en évidence des éléments tels que les boutons importants. Elle peut être légèrement modifiée en fonction du schéma de couleurs actuel.", + "Legal notice link" : "Lien vers la notice légale", + "Privacy policy link" : "Lien vers la politique de confidentialité", + "Header logo" : "Logo d'en-tête", + "Upload new header logo" : "Téléverser un nouveau logo d'en-tête", + "Favicon" : "Favicon", + "Upload new favicon" : "Téléverser un nouveau favicon", + "User settings" : "Paramètres utilisateurs", + "Disable user theming" : "Désactiver la gestion du thème par l'utilisateur", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Bien que vous puissiez sélectionner et personnaliser votre instance, les utilisateurs peuvent modifier leur arrière-plan et leurs couleurs. Si vous voulez imposer votre personnalisation, vous pouvez activer cette option.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Cette extension permet de personnaliser facilement l'apparence de votre instance et des clients supportés. La personnalisation de l'apparence sera visible par tous les utilisateurs.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Au lieu d'une image d'arrière-plan, vous pouvez également définir une couleur unie d'arrière-plan. Si vous utilisez une image d'arrière-plan, la modification de cette couleur influencera la couleur des icônes du menu de l'application.", + "Background color" : "Couleur d'arrière-plan", + "Upload new logo" : "Téléverser un nouveau logo", + "Logo" : "Logo", + "Upload new background and login image" : "Téléverser une nouvelle image d'arrière-plan et de connexion", + "Background and login image" : "Image d'arrière-plan et de connexion", + "Advanced options" : "Options avancées", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installez l'extension PHP ImageMagick qui prend en charge les images SVG pour générer automatiquement des favicons à partir du logo téléversé et de la couleur indiquée.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d’assistance technique tels que les lecteurs d’écran. Nous visons à respecter les {linkstart}Règles pour l’accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si vous rencontrez des problèmes, n'hésitez pas à les signaler sur {issuetracker}notre outil de suivi des problèmes{linkend}. Et si vous voulez vous impliquer, venez rejoindre {designteam}notre équipe de design{linkend} !", + "Unable to apply the setting." : "Impossible d'appliquer le réglage.", + "Appearance and accessibility settings" : "Paramètres d’apparence et d’accessibilité", + "Misc accessibility options" : "Diverses options d'accessibilité", + "Enable blur background filter (may increase GPU load)" : "Activer le filtre flou de l'arrière-plan (peut augmenter la charge du GPU)", + "Customization has been disabled by your administrator" : "La personnalisation a été désactivée par votre administrateur", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Définissez une couleur principale pour mettre en évidence les éléments importants. La couleur utilisée pour les éléments tels que les boutons primaires peut varier légèrement en fonction des exigences d'accessibilité.", + "Background and color" : "Image d’arrière-plan et couleur", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "L'arrière-plan peut être une image du catalogue par défaut, une image personnalisée téléversée ou une couleur unie.", + "Keyboard shortcuts" : "Raccourcis clavier", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Dans certains cas, les raccourcis clavier peuvent interférer avec les outils d'accessibilité. Afin de vous permettre de vous concentrer correctement sur votre outil, vous pouvez désactiver tous les raccourcis clavier ici. Cela désactivera également tous les raccourcis disponibles dans les applications.", + "Disable all keyboard shortcuts" : "Désactiver tous les raccourcis clavier", + "Current selected app: {app}, position {position} of {total}" : "L'application sélectionnée actuelle : {app}, position {position} de {total}", + "Move up" : "Monter", + "Move down" : "Descendre", + "Select a background from your files" : "Sélectionner un arrière-plan parmi vos fichiers", + "Select background" : "Sélectionner un arrière-plan", + "No background has been selected" : "Aucun arrière-plan n'a été sélectionné", + "Custom background" : "Arrière-plan personnalisé", + "Plain background" : "Arrière-plan uni", + "Default background" : "Arrière-plan par défaut", + "Theme selection is enforced" : "La sélection du thème est imposée", + "Could not set the app order" : "Impossible de définir l'ordre des applications", + "Could not reset the app order" : "Impossible de réinitialiser l'ordre des applications", + "Navigation bar settings" : "Paramètres de la barre de navigation", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Vous pouvez configurer l'ordre des applications utilisées dans la barre de navigation. La première entrée sera l'application par défaut, ouverte après la connexion ou en cliquant sur le logo.", + "The default app can not be changed because it was configured by the administrator." : "L'application par défaut ne peut pas être changée, car elle a été configurée par l'administrateur.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordre des applications a été changé, pour le voir en action, vous devez recharger la page.", + "Reset default app order" : "Rétablir l'ordre par défaut des applications ", + "Could not set primary color" : "Impossible de définir la couleur principale", + "Reset primary color" : "Réinitialiser la couleur principale", + "Could not set global default apps" : "Impossible de définir les applications globales par défaut", + "Default app" : "Application par défaut", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'application par défaut est l'application qui, par exemple, s'ouvre après une connexion ou lorsque l'on clique sur le logo du menu.", + "Use custom default app" : "Utiliser l'application par défaut personnalisée", + "Global default app" : "Application par défaut globale", + "Global default apps" : "Applications par défaut globales", + "Default app priority" : "Priorité de l'application par défaut", + "If an app is not enabled for a user, the next app with lower priority is used." : "Si une application n'est pas activée pour un utilisateur, l'application suivante avec une priorité plus basse sera utilisée.", + "Select a custom color" : "Sélectionnez une couleur personnalisée", + "Reset to default" : "Restaurer les valeurs par défaut", + "Upload" : "Téléverser", + "Remove background image" : "Retirer l'image d'arrière-plan", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous vérifions que tout est utilisable même sans souris et sans logiciel d'assistance comme les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.", + ". Unable to apply the setting." : ". Impossible d'appliquer le réglage." +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ga.js b/apps/theming/l10n/ga.js new file mode 100644 index 00000000000..f4048d65971 --- /dev/null +++ b/apps/theming/l10n/ga.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Tá an t-ainm a thugtar rófhada", + "The given web address is too long" : "Tá an seoladh gréasáin a thugtar rófhada", + "The given web address is not a valid URL" : "Níl an seoladh gréasáin a thugtar mar URL bailí", + "The given legal notice address is too long" : "Tá an seoladh fógra dlí a thugtar rófhada", + "The given legal notice address is not a valid URL" : "Ní URL bailí an seoladh fógra dlíthiúil a tugadh", + "The given privacy policy address is too long" : "Tá an seoladh polasaí príobháideachta a thugtar ró-fhada", + "The given privacy policy address is not a valid URL" : "Ní URL bailí an seoladh polasaí príobháideachta a tugadh", + "The given slogan is too long" : "Tá an mana a thugtar ró-fhada", + "The given color is invalid" : "Tá an dath a thugtar neamhbhailí", + "Disable-user-theming should be true or false" : "Díchumasaigh-úsáideoir-téamaí ba chóir a bheith fíor nó bréagach", + "Saved" : "Shábháil", + "Invalid app given" : "Aip neamhbhailí tugtha", + "Invalid type for setting \"defaultApp\" given" : "Cineál neamhbhailí don socrú \"defaultApp\" tugtha", + "Invalid setting key" : "Eochair shocruithe neamhbhailí", + "The file was uploaded" : "Uaslódáladh an comhad", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Sáraíonn an comhad uaslódáilte an treoir upload_max_filesize i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Sáraíonn an comhad uaslódáilte an treoir MAX_FILE_SIZE a sonraíodh san fhoirm HTML", + "The file was only partially uploaded" : "Níor uaslódáladh an comhad ach go páirteach", + "No file was uploaded" : "Níor uaslódáladh aon chomhad", + "Missing a temporary folder" : "Fillteán sealadach ar iarraidh", + "Could not write file to disk" : "Níorbh fhéidir an comhad a scríobh ar an diosca", + "A PHP extension stopped the file upload" : "Chuir síneadh PHP stop le huaslódáil an chomhaid", + "No file uploaded" : "Níor uaslódáladh aon chomhad", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Tá téama saincheaptha in úsáid agat cheana féin. Seans go mbeidh socruithe feidhmchláir téamaí forscríofa leis sin.", + "Theming" : "Téamaí", + "Appearance and accessibility" : "Cuma agus inrochtaineacht", + "PHP Imagick module" : "Modúl PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Níl an modúl PHP \"imagick\" cumasaithe cé go bhfuil an app téamaí. Chun go n-oibreoidh giniúint favicon i gceart, ní mór duit an modúl seo a shuiteáil agus a chumasú.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Níl aon tacaíocht SVG ag an modúl PHP \"imagick\" sa chás seo. Le haghaidh comhoiriúnacht níos fearr moltar é a shuiteáil.", + "Dark theme with high contrast mode" : "Téama dorcha le modh ardchodarsnachta", + "Enable dark high contrast mode" : "Cumasaigh mód dorcha ardchodarsnachta", + "Similar to the high contrast mode, but with dark colours." : "Cosúil leis an modh ardchodarsnachta, ach le dathanna dorcha.", + "Dark theme" : "Téama dorcha", + "Enable dark theme" : "Cumasaigh téama dorcha", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Téama dorcha chun do shúile a mhaolú tríd an luminosity agus gile iomlán a laghdú.", + "System default theme" : "Téama réamhshocraithe an chórais", + "Enable the system default" : "Cumasaigh réamhshocrú an chórais", + "Using the default system appearance." : "Ag baint úsáide as cuma an chórais réamhshocraithe.", + "Dyslexia font" : "cló disléicse", + "Enable dyslexia font" : "Cumasaigh cló disléicse", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Is cló saor in aisce OpenDyslexic é a cruthaíodh chun cuid de na botúin léitheoireachta coitianta a chóireáil a bhaineann le disléicse.", + "High contrast mode" : "Modh ardchodarsnachta", + "Enable high contrast mode" : "Cumasaigh modh ardchodarsnachta", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Modh ardchodarsnachta chun do sheoltóireacht a shaoradh. Beidh caighdeán radharcach laghdaithe ach ardófar an soiléireacht.", + "Light theme" : "Téama éadrom", + "Enable the default light theme" : "Cumasaigh an téama réamhshocraithe solais", + "The default light appearance." : "An chuma éadrom réamhshocraithe.", + "Legal notice" : "Fógra dlíthiúil", + "Privacy policy" : "Beartas Príobháideachais", + "Adjust the Nextcloud theme" : "Coigeartaigh an téama Nextcloud", + "Name" : "Ainm", + "Web link" : "Nasc gréasáin", + "a safe home for all your data" : "baile sábháilte do do shonraí go léir", + "Slogan" : "mana", + "Primary color" : "Dath bunscoile", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Úsáidtear an dath príomhúil chun gnéithe cosúil le cnaipí tábhachtacha a aibhsiú. D'fhéadfadh sé go ndéanfaí é a choigeartú beagán ag brath ar an scéimre datha reatha.", + "Legal notice link" : "Nasc fógra dlíthiúil", + "Privacy policy link" : "Nasc polasaí príobháideachta", + "Header logo" : "Lógó ceanntásca", + "Upload new header logo" : "Íoslódáil an ceanntásc lógó nua", + "Favicon" : "Favicon", + "Upload new favicon" : "Íosluchtaigh favicon nua", + "User settings" : "Socruithe úsáideora", + "Disable user theming" : "Díchumasaigh téamaí úsáideora", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Cé gur féidir leat do chás a roghnú agus a shaincheapadh, is féidir le húsáideoirí a gcúlra agus a ndathanna a athrú. Más mian leat do shaincheapadh a fhorfheidhmiú, is féidir leat é seo a scoránaigh.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Is féidir cuma agus mothú do chás agus do chliaint a dtacaítear leo a shaincheapadh go héasca le téamaí. Beidh sé seo le feiceáil do gach úsáideoir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "In ionad íomhá chúlra is féidir leat dath cúlra simplí a chumrú freisin. Má úsáideann tú íomhá cúlra beidh tionchar ag athrú an datha seo ar dhath deilbhíní roghchláir na haipe.", + "Background color" : "Dath an chúlra", + "Upload new logo" : "Íosluchtaigh lógó nua", + "Logo" : "Lógó", + "Upload new background and login image" : "Íosluchtaigh cúlra nua agus logáil isteach", + "Background and login image" : "Cúlra agus íomhá logáil isteach", + "Advanced options" : "Ardroghanna", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Suiteáil an síneadh ImageMagick PHP le tacaíocht d'íomhánna SVG chun favicons a ghiniúint go huathoibríoch bunaithe ar an lógó agus an dath uaslódáilte.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Tá rochtain uilíoch an-tábhachtach dúinne. Leanaimid caighdeáin ghréasáin agus seiceálann muid chun gach rud a dhéanamh inúsáidte freisin gan luch, agus bogearraí cúnta cosúil le léitheoirí scáileáin. Tá sé mar aidhm againn cloí leis na {linkstart}Treoirlínte um Inrochtaineacht Ábhar Gréasáin{linkend} 2.1 ar leibhéal AA, leis an téama ardchodarsnachta fiú ar leibhéal AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Má fhaigheann tú aon fhadhb, ná bíodh drogall ort iad a thuairisciú ar {issuetracker}ár lorgaire saincheisteanna{linkend}. Agus más mian leat a bheith páirteach, tar isteach i {designteam}ár bhfoireann deartha{linkend}!", + "Unable to apply the setting." : "Ní féidir an socrú a chur i bhfeidhm.", + "Appearance and accessibility settings" : "Cuma agus socruithe inrochtaineachta", + "Misc accessibility options" : "Roghanna inrochtaineachta éagsúla", + "Enable blur background filter (may increase GPU load)" : "Cumasaigh an scagaire cúlra doiléir (d'fhéadfadh sé ualach GPU a mhéadú)", + "Customization has been disabled by your administrator" : "Dhíchumasaigh do riarthóir an oiriúnú", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Socraigh dath príomhúil chun aird a tharraingt ar ghnéithe tábhachtacha. D’fhéadfadh difríocht bheag a bheith idir an dath a úsáidtear le haghaidh eilimintí mar chnaipí príomhúla de réir mar a choigeartaítear é chun riachtanais inrochtaineachta a chomhlíonadh.", + "Background and color" : "Cúlra agus dath", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Is féidir an cúlra a shocrú d'íomhá ón tacar réamhshocraithe, íomhá saincheaptha uaslódáilte, nó dath simplí.", + "Keyboard shortcuts" : "Aicearraí méarchláir", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I gcásanna áirithe is féidir le aicearraí méarchláir cur isteach ar uirlisí inrochtaineachta. Chun gur féidir díriú ar d’uirlis i gceart is féidir leat gach aicearra méarchláir a dhíchumasú anseo. Díchumasóidh sé seo gach aicearra atá ar fáil in aipeanna freisin.", + "Disable all keyboard shortcuts" : "Díchumasaigh gach aicearra méarchláir", + "Current selected app: {app}, position {position} of {total}" : "Aip roghnaithe reatha: {app}, suíomh {position} de {total}", + "Move up" : "Éirí suas", + "Move down" : "Bog síos", + "Select a background from your files" : "Roghnaigh cúlra ó do chuid comhad", + "Select background" : "Roghnaigh cúlra", + "No background has been selected" : "Níor roghnaíodh aon chúlra", + "Custom background" : "Cúlra saincheaptha", + "Plain background" : "Cúlra simplí", + "Default background" : "Cúlra réamhshocraithe", + "Theme selection is enforced" : "Cuirtear an rogha téamaí i bhfeidhm", + "Could not set the app order" : "Níorbh fhéidir an t-ordú aipe a shocrú", + "Could not reset the app order" : "Níorbh fhéidir an t-ordú aipe a athshocrú", + "Navigation bar settings" : "Socruithe barra nascleanúna", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Is féidir leat an t-ordú app a úsáidtear don bharra nascleanúna a chumrú. Is é an chéad iontráil an aip réamhshocraithe, a osclaítear tar éis logáil isteach nó nuair a chliceáiltear ar an lógó.", + "The default app can not be changed because it was configured by the administrator." : "Ní féidir an app réamhshocraithe a athrú toisc go raibh sé cumraithe ag an riarthóir.", + "The app order was changed, to see it in action you have to reload the page." : "Athraíodh an t-ordú aip, chun é a fheiceáil i ngníomh caithfidh tú an leathanach a athlódáil.", + "Reset default app order" : "Athshocraigh ordú app réamhshocraithe", + "Could not set primary color" : "Níorbh fhéidir an príomhdath a shocrú", + "Reset primary color" : "Athshocraigh dath príomhúil", + "Could not set global default apps" : "Níorbh fhéidir aipeanna réamhshocraithe domhanda a shocrú", + "Default app" : "Aip réamhshocraithe", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Is é an app réamhshocraithe an app atá e.g. a osclaítear tar éis logáil isteach nó nuair a chliceáiltear an lógó sa roghchlár.", + "Use custom default app" : "Bain úsáid as aip réamhshocraithe saincheaptha", + "Global default app" : "Aip réamhshocraithe domhanda", + "Global default apps" : "Aipeanna réamhshocraithe domhanda", + "Default app priority" : "Tosaíocht réamhshocraithe aipe", + "If an app is not enabled for a user, the next app with lower priority is used." : "Mura bhfuil aip cumasaithe d’úsáideoir, úsáidtear an chéad aip eile le tosaíocht níos ísle.", + "Select a custom color" : "Roghnaigh dath saincheaptha", + "Reset to default" : "Athshocraigh go réamhshocrú", + "Upload" : "Uaslódáil", + "Remove background image" : "Bain íomhá cúlra", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Is tábhachtach go mór dúinn rochtain uilepháirtíoch a chur ar fáil. Leanaimid na caighdeáin ghréasáin agus déanaimid seiceáil chun gach rud a úsáid a dhéanamh gan luchóg, agus bogearraí chabhrach cosúil le léitheoirí scáileáin. Táimid ag tógáil leis an gcomhlíonadh {guidelines}Treoracha Rochtanaíochta Ábhar Gréasáin{linkend} 2.1 ar leibhéal AA, leis an téama ardshaincheaptha fiú ar leibhéal AAA.", + ". Unable to apply the setting." : ". Ní féidir an socrú a chur i bhfeidhm." +}, +"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); diff --git a/apps/theming/l10n/ga.json b/apps/theming/l10n/ga.json new file mode 100644 index 00000000000..05cafbbe6d4 --- /dev/null +++ b/apps/theming/l10n/ga.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Tá an t-ainm a thugtar rófhada", + "The given web address is too long" : "Tá an seoladh gréasáin a thugtar rófhada", + "The given web address is not a valid URL" : "Níl an seoladh gréasáin a thugtar mar URL bailí", + "The given legal notice address is too long" : "Tá an seoladh fógra dlí a thugtar rófhada", + "The given legal notice address is not a valid URL" : "Ní URL bailí an seoladh fógra dlíthiúil a tugadh", + "The given privacy policy address is too long" : "Tá an seoladh polasaí príobháideachta a thugtar ró-fhada", + "The given privacy policy address is not a valid URL" : "Ní URL bailí an seoladh polasaí príobháideachta a tugadh", + "The given slogan is too long" : "Tá an mana a thugtar ró-fhada", + "The given color is invalid" : "Tá an dath a thugtar neamhbhailí", + "Disable-user-theming should be true or false" : "Díchumasaigh-úsáideoir-téamaí ba chóir a bheith fíor nó bréagach", + "Saved" : "Shábháil", + "Invalid app given" : "Aip neamhbhailí tugtha", + "Invalid type for setting \"defaultApp\" given" : "Cineál neamhbhailí don socrú \"defaultApp\" tugtha", + "Invalid setting key" : "Eochair shocruithe neamhbhailí", + "The file was uploaded" : "Uaslódáladh an comhad", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Sáraíonn an comhad uaslódáilte an treoir upload_max_filesize i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Sáraíonn an comhad uaslódáilte an treoir MAX_FILE_SIZE a sonraíodh san fhoirm HTML", + "The file was only partially uploaded" : "Níor uaslódáladh an comhad ach go páirteach", + "No file was uploaded" : "Níor uaslódáladh aon chomhad", + "Missing a temporary folder" : "Fillteán sealadach ar iarraidh", + "Could not write file to disk" : "Níorbh fhéidir an comhad a scríobh ar an diosca", + "A PHP extension stopped the file upload" : "Chuir síneadh PHP stop le huaslódáil an chomhaid", + "No file uploaded" : "Níor uaslódáladh aon chomhad", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Tá téama saincheaptha in úsáid agat cheana féin. Seans go mbeidh socruithe feidhmchláir téamaí forscríofa leis sin.", + "Theming" : "Téamaí", + "Appearance and accessibility" : "Cuma agus inrochtaineacht", + "PHP Imagick module" : "Modúl PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Níl an modúl PHP \"imagick\" cumasaithe cé go bhfuil an app téamaí. Chun go n-oibreoidh giniúint favicon i gceart, ní mór duit an modúl seo a shuiteáil agus a chumasú.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Níl aon tacaíocht SVG ag an modúl PHP \"imagick\" sa chás seo. Le haghaidh comhoiriúnacht níos fearr moltar é a shuiteáil.", + "Dark theme with high contrast mode" : "Téama dorcha le modh ardchodarsnachta", + "Enable dark high contrast mode" : "Cumasaigh mód dorcha ardchodarsnachta", + "Similar to the high contrast mode, but with dark colours." : "Cosúil leis an modh ardchodarsnachta, ach le dathanna dorcha.", + "Dark theme" : "Téama dorcha", + "Enable dark theme" : "Cumasaigh téama dorcha", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Téama dorcha chun do shúile a mhaolú tríd an luminosity agus gile iomlán a laghdú.", + "System default theme" : "Téama réamhshocraithe an chórais", + "Enable the system default" : "Cumasaigh réamhshocrú an chórais", + "Using the default system appearance." : "Ag baint úsáide as cuma an chórais réamhshocraithe.", + "Dyslexia font" : "cló disléicse", + "Enable dyslexia font" : "Cumasaigh cló disléicse", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Is cló saor in aisce OpenDyslexic é a cruthaíodh chun cuid de na botúin léitheoireachta coitianta a chóireáil a bhaineann le disléicse.", + "High contrast mode" : "Modh ardchodarsnachta", + "Enable high contrast mode" : "Cumasaigh modh ardchodarsnachta", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Modh ardchodarsnachta chun do sheoltóireacht a shaoradh. Beidh caighdeán radharcach laghdaithe ach ardófar an soiléireacht.", + "Light theme" : "Téama éadrom", + "Enable the default light theme" : "Cumasaigh an téama réamhshocraithe solais", + "The default light appearance." : "An chuma éadrom réamhshocraithe.", + "Legal notice" : "Fógra dlíthiúil", + "Privacy policy" : "Beartas Príobháideachais", + "Adjust the Nextcloud theme" : "Coigeartaigh an téama Nextcloud", + "Name" : "Ainm", + "Web link" : "Nasc gréasáin", + "a safe home for all your data" : "baile sábháilte do do shonraí go léir", + "Slogan" : "mana", + "Primary color" : "Dath bunscoile", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Úsáidtear an dath príomhúil chun gnéithe cosúil le cnaipí tábhachtacha a aibhsiú. D'fhéadfadh sé go ndéanfaí é a choigeartú beagán ag brath ar an scéimre datha reatha.", + "Legal notice link" : "Nasc fógra dlíthiúil", + "Privacy policy link" : "Nasc polasaí príobháideachta", + "Header logo" : "Lógó ceanntásca", + "Upload new header logo" : "Íoslódáil an ceanntásc lógó nua", + "Favicon" : "Favicon", + "Upload new favicon" : "Íosluchtaigh favicon nua", + "User settings" : "Socruithe úsáideora", + "Disable user theming" : "Díchumasaigh téamaí úsáideora", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Cé gur féidir leat do chás a roghnú agus a shaincheapadh, is féidir le húsáideoirí a gcúlra agus a ndathanna a athrú. Más mian leat do shaincheapadh a fhorfheidhmiú, is féidir leat é seo a scoránaigh.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Is féidir cuma agus mothú do chás agus do chliaint a dtacaítear leo a shaincheapadh go héasca le téamaí. Beidh sé seo le feiceáil do gach úsáideoir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "In ionad íomhá chúlra is féidir leat dath cúlra simplí a chumrú freisin. Má úsáideann tú íomhá cúlra beidh tionchar ag athrú an datha seo ar dhath deilbhíní roghchláir na haipe.", + "Background color" : "Dath an chúlra", + "Upload new logo" : "Íosluchtaigh lógó nua", + "Logo" : "Lógó", + "Upload new background and login image" : "Íosluchtaigh cúlra nua agus logáil isteach", + "Background and login image" : "Cúlra agus íomhá logáil isteach", + "Advanced options" : "Ardroghanna", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Suiteáil an síneadh ImageMagick PHP le tacaíocht d'íomhánna SVG chun favicons a ghiniúint go huathoibríoch bunaithe ar an lógó agus an dath uaslódáilte.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Tá rochtain uilíoch an-tábhachtach dúinne. Leanaimid caighdeáin ghréasáin agus seiceálann muid chun gach rud a dhéanamh inúsáidte freisin gan luch, agus bogearraí cúnta cosúil le léitheoirí scáileáin. Tá sé mar aidhm againn cloí leis na {linkstart}Treoirlínte um Inrochtaineacht Ábhar Gréasáin{linkend} 2.1 ar leibhéal AA, leis an téama ardchodarsnachta fiú ar leibhéal AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Má fhaigheann tú aon fhadhb, ná bíodh drogall ort iad a thuairisciú ar {issuetracker}ár lorgaire saincheisteanna{linkend}. Agus más mian leat a bheith páirteach, tar isteach i {designteam}ár bhfoireann deartha{linkend}!", + "Unable to apply the setting." : "Ní féidir an socrú a chur i bhfeidhm.", + "Appearance and accessibility settings" : "Cuma agus socruithe inrochtaineachta", + "Misc accessibility options" : "Roghanna inrochtaineachta éagsúla", + "Enable blur background filter (may increase GPU load)" : "Cumasaigh an scagaire cúlra doiléir (d'fhéadfadh sé ualach GPU a mhéadú)", + "Customization has been disabled by your administrator" : "Dhíchumasaigh do riarthóir an oiriúnú", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Socraigh dath príomhúil chun aird a tharraingt ar ghnéithe tábhachtacha. D’fhéadfadh difríocht bheag a bheith idir an dath a úsáidtear le haghaidh eilimintí mar chnaipí príomhúla de réir mar a choigeartaítear é chun riachtanais inrochtaineachta a chomhlíonadh.", + "Background and color" : "Cúlra agus dath", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Is féidir an cúlra a shocrú d'íomhá ón tacar réamhshocraithe, íomhá saincheaptha uaslódáilte, nó dath simplí.", + "Keyboard shortcuts" : "Aicearraí méarchláir", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I gcásanna áirithe is féidir le aicearraí méarchláir cur isteach ar uirlisí inrochtaineachta. Chun gur féidir díriú ar d’uirlis i gceart is féidir leat gach aicearra méarchláir a dhíchumasú anseo. Díchumasóidh sé seo gach aicearra atá ar fáil in aipeanna freisin.", + "Disable all keyboard shortcuts" : "Díchumasaigh gach aicearra méarchláir", + "Current selected app: {app}, position {position} of {total}" : "Aip roghnaithe reatha: {app}, suíomh {position} de {total}", + "Move up" : "Éirí suas", + "Move down" : "Bog síos", + "Select a background from your files" : "Roghnaigh cúlra ó do chuid comhad", + "Select background" : "Roghnaigh cúlra", + "No background has been selected" : "Níor roghnaíodh aon chúlra", + "Custom background" : "Cúlra saincheaptha", + "Plain background" : "Cúlra simplí", + "Default background" : "Cúlra réamhshocraithe", + "Theme selection is enforced" : "Cuirtear an rogha téamaí i bhfeidhm", + "Could not set the app order" : "Níorbh fhéidir an t-ordú aipe a shocrú", + "Could not reset the app order" : "Níorbh fhéidir an t-ordú aipe a athshocrú", + "Navigation bar settings" : "Socruithe barra nascleanúna", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Is féidir leat an t-ordú app a úsáidtear don bharra nascleanúna a chumrú. Is é an chéad iontráil an aip réamhshocraithe, a osclaítear tar éis logáil isteach nó nuair a chliceáiltear ar an lógó.", + "The default app can not be changed because it was configured by the administrator." : "Ní féidir an app réamhshocraithe a athrú toisc go raibh sé cumraithe ag an riarthóir.", + "The app order was changed, to see it in action you have to reload the page." : "Athraíodh an t-ordú aip, chun é a fheiceáil i ngníomh caithfidh tú an leathanach a athlódáil.", + "Reset default app order" : "Athshocraigh ordú app réamhshocraithe", + "Could not set primary color" : "Níorbh fhéidir an príomhdath a shocrú", + "Reset primary color" : "Athshocraigh dath príomhúil", + "Could not set global default apps" : "Níorbh fhéidir aipeanna réamhshocraithe domhanda a shocrú", + "Default app" : "Aip réamhshocraithe", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Is é an app réamhshocraithe an app atá e.g. a osclaítear tar éis logáil isteach nó nuair a chliceáiltear an lógó sa roghchlár.", + "Use custom default app" : "Bain úsáid as aip réamhshocraithe saincheaptha", + "Global default app" : "Aip réamhshocraithe domhanda", + "Global default apps" : "Aipeanna réamhshocraithe domhanda", + "Default app priority" : "Tosaíocht réamhshocraithe aipe", + "If an app is not enabled for a user, the next app with lower priority is used." : "Mura bhfuil aip cumasaithe d’úsáideoir, úsáidtear an chéad aip eile le tosaíocht níos ísle.", + "Select a custom color" : "Roghnaigh dath saincheaptha", + "Reset to default" : "Athshocraigh go réamhshocrú", + "Upload" : "Uaslódáil", + "Remove background image" : "Bain íomhá cúlra", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Is tábhachtach go mór dúinn rochtain uilepháirtíoch a chur ar fáil. Leanaimid na caighdeáin ghréasáin agus déanaimid seiceáil chun gach rud a úsáid a dhéanamh gan luchóg, agus bogearraí chabhrach cosúil le léitheoirí scáileáin. Táimid ag tógáil leis an gcomhlíonadh {guidelines}Treoracha Rochtanaíochta Ábhar Gréasáin{linkend} 2.1 ar leibhéal AA, leis an téama ardshaincheaptha fiú ar leibhéal AAA.", + ". Unable to apply the setting." : ". Ní féidir an socrú a chur i bhfeidhm." +},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/gl.js b/apps/theming/l10n/gl.js new file mode 100644 index 00000000000..1f9d5bd0019 --- /dev/null +++ b/apps/theming/l10n/gl.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "O nome indicado é longo de máis", + "The given web address is too long" : "O enderezo web indicado é longo de máis", + "The given web address is not a valid URL" : "O enderezo web indicado non é un URL válido", + "The given legal notice address is too long" : "O enderezo do aviso legal indicado é longo de máis", + "The given legal notice address is not a valid URL" : "O enderezo do aviso legal indicado non é un URL válido", + "The given privacy policy address is too long" : "O enderezo da directiva de privacidade indicado é longo de máis", + "The given privacy policy address is not a valid URL" : "O enderezo da directiva de privacidade indicado non é un URL válido", + "The given slogan is too long" : "O lema indicado é longo de máis", + "The given color is invalid" : "A cor indicada é incorrecta", + "Disable-user-theming should be true or false" : "Disable-user-theming (desactivar o tema do usuario) debe ser verdadeiro ou falso", + "Saved" : "Gardado", + "Invalid app given" : "A aplicación non é válida", + "Invalid type for setting \"defaultApp\" given" : "O tipo non é válido para o axuste «defaultApp».", + "Invalid setting key" : "Chave de axuste incorrecta", + "The file was uploaded" : "O ficheiro foi enviado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro enviado excede a directiva indicada por upload_max_filesize de php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro enviado excede da directiva MAX_FILE_SIZE especificada no formulario HTML", + "The file was only partially uploaded" : "O ficheiro só foi parcialmente enviado", + "No file was uploaded" : "Non se enviou ningún ficheiro", + "Missing a temporary folder" : "Falta un cartafol temporal", + "Could not write file to disk" : "Non foi posíbel escribir o ficheiro no disco", + "A PHP extension stopped the file upload" : "Unha extensión PHP detivo o envío de ficheiros", + "No file uploaded" : "Non se enviou ningún ficheiro", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Está a empregar un tema personalizado. Os axustes da aplicación de temas poden ser sobrescritos por el.", + "Theming" : "Temas", + "Appearance and accessibility" : "Aparencia e accesibilidade", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "O módulo PHP «imagick» non está activado aínda que a aplicación de temas si o estea. Para que a xeración de favicon funcione correctamente, é necesario instalar e activar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "O módulo PHP «imagick» nesta instancia non ten compatibilidade con SVG. Para unha mellor compatibilidade recoméndase instalalo.", + "Dark theme with high contrast mode" : "Tema escuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar o modo escuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Semellante ao modo de alto contraste, mais con cores escuras.", + "Dark theme" : "Tema escuro", + "Enable dark theme" : "Activar o tema escuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema escuro para aliviar os seus ollos reducindo a luminosidade e o brillo xerais.", + "System default theme" : "Tema predeterminado do sistema", + "Enable the system default" : "Activar o predeterminado do sistema ", + "Using the default system appearance." : "Usando a aparencia predeterminada do sistema.", + "Dyslexia font" : "Tipo de letra para disléxicos", + "Enable dyslexia font" : "Activar o tipo de letra para disléxicos", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic é un tipo de letra libre deseñada para mitigar algúns dos erros comúns de lectura causados pola dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Activar o modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar a navegación. A calidade visual será reducida, mais a claridade aumentará.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar o tema claro predeterminado", + "The default light appearance." : "A aparencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Directiva de privacidade", + "Adjust the Nextcloud theme" : "Axustar o tema de Nextcloud", + "Name" : "Nome", + "Web link" : "Ligazón web", + "a safe home for all your data" : "un acubillo seguro para todos os seus datos", + "Slogan" : "Lema", + "Primary color" : "Cor principal", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "A cor principal úsase para resaltar elementos como botóns importantes. Pode axustarse lixeiramente dependendo do esquema de cores actual.", + "Legal notice link" : "Ligazón ao aviso legal", + "Privacy policy link" : "Ligazón á directiva de privacidade", + "Header logo" : "Logotipo da cabeceira", + "Upload new header logo" : "Enviar un novo logotipo da cabeceira", + "Favicon" : "Favicon", + "Upload new favicon" : "Enviar un novo favicon", + "User settings" : "Axustes de usuario", + "Disable user theming" : "Desactivar o tema do usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aínda que pode seleccionar e personalizar a súa instancia, os usuarios poden cambiar o seu fondo e cores. Se quere impor a súa personalización, pode activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Os temas fan posíbel personalizar facilmente a aparencia da súa instancia e os clientes compatíbeis. Isto será visíbel para todos os usuarios.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En troques dunha imaxe de fondo, tamén pode configurar unha cor de fondo liso. Se usa unha imaxe de fondo, o cambio da cor influirá na cor das iconas do menú da aplicación.", + "Background color" : "Cor de fondo", + "Upload new logo" : "Enviar un novo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Enviar unha nova imaxe de fondo e de acceso", + "Background and login image" : "Imaxe de fondo e acceso", + "Advanced options" : "Opcións avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instalar a extensión PHP ImageMagick con compatibilidade con imaxes SVG para xerar automaticamente favicons baseados no logotipo e na cor enviados.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Para nós o acceso universal é moi importante. Seguimos os estándares web e comprobamos que todo poida ser utilizado sen rato e software de axuda como os lectores de pantalla. O noso obxectivo é ter cumprir ás {linkstart}Directrices de accesibilidade ao contido web{linkend} 2.1 a nivel AA, co tema de alto contraste incluso a nivel AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se atopa algúnha incidencia, non dubide en informalo no {issuetracker}noso seguidor de incidencias{linkend} E se quere involucrarse, únase ao {designteam}noso equipo de deseño {linkend}!", + "Unable to apply the setting." : "Non é posíbel aplicar o axuste.", + "Appearance and accessibility settings" : "Axustes de aparencia e accesibilidade", + "Misc accessibility options" : "Varias opcións de accesibilidade", + "Enable blur background filter (may increase GPU load)" : "Activar o filtro de fondo esvaído (pode aumentar a carga da GPU)", + "Customization has been disabled by your administrator" : "O seu administrador desactivou a personalización", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Defina unha cor principal para resaltar elementos importantes. A cor utilizada para elementos como os botóns principais pode diferir un pouco a medida que se axusta para cumprir cos requisitos de accesibilidade.", + "Background and color" : "Fondo e cor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "O fondo pódese definir cunha imaxe predeterminada, unha imaxe personalizada ou unha cor lisa.", + "Keyboard shortcuts" : "Atallos de teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Nalgúns casos, os atallos de teclado poden interferir coas ferramentas de accesibilidade. Para poder centrarse na súa ferramenta correctamente, pode desactivar aquí todos os atallos de teclado. Isto tamén desactivará todos os atallos dispoñíbeis nas aplicacións.", + "Disable all keyboard shortcuts" : "Desactivar todos os atallos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada actual: {app}, posición {position} de {total}", + "Move up" : "Mover cara arriba", + "Move down" : "Mover cara abaixo", + "Select a background from your files" : "Seleccione un fondo desde os seus ficheiros", + "Select background" : "Seleccione o fondo", + "No background has been selected" : "Non foi seleccionado ningún fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo sinxelo", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "Imponse a selección de temas", + "Could not set the app order" : "Non foi posíbel definir a orde das aplicacións", + "Could not reset the app order" : "Non foi posíbel restabelecer a orde das aplicacións", + "Navigation bar settings" : "Axustes da barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pode configurar a orde das aplicacións utilizadas na barra de navegación. A primeira entrada será a aplicación predeterminada, abriráse tras de acceder ou ao premer no logotipo.", + "The default app can not be changed because it was configured by the administrator." : "A aplicación predeterminada non se pode cambiar porque foi configurada pola administración.", + "The app order was changed, to see it in action you have to reload the page." : "Cambiouse a orde das aplicacións, para vela en acción ten que cargar de novo a páxina.", + "Reset default app order" : "Restablecer a orde predeterminada das aplicacións", + "Could not set primary color" : "Non foi posíbel definir a cor principal", + "Reset primary color" : "Restabelecer a cor principal", + "Could not set global default apps" : "Non foi posíbel definir as aplicacións predeterminadas globais", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "A aplicación predeterminada é a aplicación que se abre p. ex. após acceder ou cando se preme no logotipo do menú.", + "Use custom default app" : "Usar a aplicación predeterminada personalizada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicacións predeterminadas globais", + "Default app priority" : "Prioridade predeterminada da aplicación", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se unha aplicación non está activada para un usuario, utilízase a seguinte aplicación con menor prioridade.", + "Select a custom color" : "Seleccione unha cor personalizada", + "Reset to default" : "Restabelecer os valores predeterminados", + "Upload" : "Enviar", + "Remove background image" : "Retirar a imaxe de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Para nós o acceso universal é moi importante. Seguimos os estándares web e comprobamos que todo poida ser utilizado sen rato e software de axuda como os lectores de pantalla. O noso obxectivo é ter cumprir ás {guidelines}Directrices de accesibilidade ao contido web{linkend} 2.1 a nivel AA, co tema de alto contraste incluso a nivel AAA.", + ". Unable to apply the setting." : ". Non é posíbel aplicar o axuste." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/gl.json b/apps/theming/l10n/gl.json new file mode 100644 index 00000000000..ce7508c9149 --- /dev/null +++ b/apps/theming/l10n/gl.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "O nome indicado é longo de máis", + "The given web address is too long" : "O enderezo web indicado é longo de máis", + "The given web address is not a valid URL" : "O enderezo web indicado non é un URL válido", + "The given legal notice address is too long" : "O enderezo do aviso legal indicado é longo de máis", + "The given legal notice address is not a valid URL" : "O enderezo do aviso legal indicado non é un URL válido", + "The given privacy policy address is too long" : "O enderezo da directiva de privacidade indicado é longo de máis", + "The given privacy policy address is not a valid URL" : "O enderezo da directiva de privacidade indicado non é un URL válido", + "The given slogan is too long" : "O lema indicado é longo de máis", + "The given color is invalid" : "A cor indicada é incorrecta", + "Disable-user-theming should be true or false" : "Disable-user-theming (desactivar o tema do usuario) debe ser verdadeiro ou falso", + "Saved" : "Gardado", + "Invalid app given" : "A aplicación non é válida", + "Invalid type for setting \"defaultApp\" given" : "O tipo non é válido para o axuste «defaultApp».", + "Invalid setting key" : "Chave de axuste incorrecta", + "The file was uploaded" : "O ficheiro foi enviado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro enviado excede a directiva indicada por upload_max_filesize de php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro enviado excede da directiva MAX_FILE_SIZE especificada no formulario HTML", + "The file was only partially uploaded" : "O ficheiro só foi parcialmente enviado", + "No file was uploaded" : "Non se enviou ningún ficheiro", + "Missing a temporary folder" : "Falta un cartafol temporal", + "Could not write file to disk" : "Non foi posíbel escribir o ficheiro no disco", + "A PHP extension stopped the file upload" : "Unha extensión PHP detivo o envío de ficheiros", + "No file uploaded" : "Non se enviou ningún ficheiro", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Está a empregar un tema personalizado. Os axustes da aplicación de temas poden ser sobrescritos por el.", + "Theming" : "Temas", + "Appearance and accessibility" : "Aparencia e accesibilidade", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "O módulo PHP «imagick» non está activado aínda que a aplicación de temas si o estea. Para que a xeración de favicon funcione correctamente, é necesario instalar e activar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "O módulo PHP «imagick» nesta instancia non ten compatibilidade con SVG. Para unha mellor compatibilidade recoméndase instalalo.", + "Dark theme with high contrast mode" : "Tema escuro con modo de alto contraste", + "Enable dark high contrast mode" : "Activar o modo escuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Semellante ao modo de alto contraste, mais con cores escuras.", + "Dark theme" : "Tema escuro", + "Enable dark theme" : "Activar o tema escuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema escuro para aliviar os seus ollos reducindo a luminosidade e o brillo xerais.", + "System default theme" : "Tema predeterminado do sistema", + "Enable the system default" : "Activar o predeterminado do sistema ", + "Using the default system appearance." : "Usando a aparencia predeterminada do sistema.", + "Dyslexia font" : "Tipo de letra para disléxicos", + "Enable dyslexia font" : "Activar o tipo de letra para disléxicos", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic é un tipo de letra libre deseñada para mitigar algúns dos erros comúns de lectura causados pola dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Activar o modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un modo de alto contraste para facilitar a navegación. A calidade visual será reducida, mais a claridade aumentará.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Activar o tema claro predeterminado", + "The default light appearance." : "A aparencia clara predeterminada.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Directiva de privacidade", + "Adjust the Nextcloud theme" : "Axustar o tema de Nextcloud", + "Name" : "Nome", + "Web link" : "Ligazón web", + "a safe home for all your data" : "un acubillo seguro para todos os seus datos", + "Slogan" : "Lema", + "Primary color" : "Cor principal", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "A cor principal úsase para resaltar elementos como botóns importantes. Pode axustarse lixeiramente dependendo do esquema de cores actual.", + "Legal notice link" : "Ligazón ao aviso legal", + "Privacy policy link" : "Ligazón á directiva de privacidade", + "Header logo" : "Logotipo da cabeceira", + "Upload new header logo" : "Enviar un novo logotipo da cabeceira", + "Favicon" : "Favicon", + "Upload new favicon" : "Enviar un novo favicon", + "User settings" : "Axustes de usuario", + "Disable user theming" : "Desactivar o tema do usuario", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Aínda que pode seleccionar e personalizar a súa instancia, os usuarios poden cambiar o seu fondo e cores. Se quere impor a súa personalización, pode activar esta opción.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Os temas fan posíbel personalizar facilmente a aparencia da súa instancia e os clientes compatíbeis. Isto será visíbel para todos os usuarios.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "En troques dunha imaxe de fondo, tamén pode configurar unha cor de fondo liso. Se usa unha imaxe de fondo, o cambio da cor influirá na cor das iconas do menú da aplicación.", + "Background color" : "Cor de fondo", + "Upload new logo" : "Enviar un novo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Enviar unha nova imaxe de fondo e de acceso", + "Background and login image" : "Imaxe de fondo e acceso", + "Advanced options" : "Opcións avanzadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instalar a extensión PHP ImageMagick con compatibilidade con imaxes SVG para xerar automaticamente favicons baseados no logotipo e na cor enviados.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Para nós o acceso universal é moi importante. Seguimos os estándares web e comprobamos que todo poida ser utilizado sen rato e software de axuda como os lectores de pantalla. O noso obxectivo é ter cumprir ás {linkstart}Directrices de accesibilidade ao contido web{linkend} 2.1 a nivel AA, co tema de alto contraste incluso a nivel AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se atopa algúnha incidencia, non dubide en informalo no {issuetracker}noso seguidor de incidencias{linkend} E se quere involucrarse, únase ao {designteam}noso equipo de deseño {linkend}!", + "Unable to apply the setting." : "Non é posíbel aplicar o axuste.", + "Appearance and accessibility settings" : "Axustes de aparencia e accesibilidade", + "Misc accessibility options" : "Varias opcións de accesibilidade", + "Enable blur background filter (may increase GPU load)" : "Activar o filtro de fondo esvaído (pode aumentar a carga da GPU)", + "Customization has been disabled by your administrator" : "O seu administrador desactivou a personalización", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Defina unha cor principal para resaltar elementos importantes. A cor utilizada para elementos como os botóns principais pode diferir un pouco a medida que se axusta para cumprir cos requisitos de accesibilidade.", + "Background and color" : "Fondo e cor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "O fondo pódese definir cunha imaxe predeterminada, unha imaxe personalizada ou unha cor lisa.", + "Keyboard shortcuts" : "Atallos de teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Nalgúns casos, os atallos de teclado poden interferir coas ferramentas de accesibilidade. Para poder centrarse na súa ferramenta correctamente, pode desactivar aquí todos os atallos de teclado. Isto tamén desactivará todos os atallos dispoñíbeis nas aplicacións.", + "Disable all keyboard shortcuts" : "Desactivar todos os atallos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicación seleccionada actual: {app}, posición {position} de {total}", + "Move up" : "Mover cara arriba", + "Move down" : "Mover cara abaixo", + "Select a background from your files" : "Seleccione un fondo desde os seus ficheiros", + "Select background" : "Seleccione o fondo", + "No background has been selected" : "Non foi seleccionado ningún fondo", + "Custom background" : "Fondo personalizado", + "Plain background" : "Fondo sinxelo", + "Default background" : "Fondo predeterminado", + "Theme selection is enforced" : "Imponse a selección de temas", + "Could not set the app order" : "Non foi posíbel definir a orde das aplicacións", + "Could not reset the app order" : "Non foi posíbel restabelecer a orde das aplicacións", + "Navigation bar settings" : "Axustes da barra de navegación", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Pode configurar a orde das aplicacións utilizadas na barra de navegación. A primeira entrada será a aplicación predeterminada, abriráse tras de acceder ou ao premer no logotipo.", + "The default app can not be changed because it was configured by the administrator." : "A aplicación predeterminada non se pode cambiar porque foi configurada pola administración.", + "The app order was changed, to see it in action you have to reload the page." : "Cambiouse a orde das aplicacións, para vela en acción ten que cargar de novo a páxina.", + "Reset default app order" : "Restablecer a orde predeterminada das aplicacións", + "Could not set primary color" : "Non foi posíbel definir a cor principal", + "Reset primary color" : "Restabelecer a cor principal", + "Could not set global default apps" : "Non foi posíbel definir as aplicacións predeterminadas globais", + "Default app" : "Aplicación predeterminada", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "A aplicación predeterminada é a aplicación que se abre p. ex. após acceder ou cando se preme no logotipo do menú.", + "Use custom default app" : "Usar a aplicación predeterminada personalizada", + "Global default app" : "Aplicación predeterminada global", + "Global default apps" : "Aplicacións predeterminadas globais", + "Default app priority" : "Prioridade predeterminada da aplicación", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se unha aplicación non está activada para un usuario, utilízase a seguinte aplicación con menor prioridade.", + "Select a custom color" : "Seleccione unha cor personalizada", + "Reset to default" : "Restabelecer os valores predeterminados", + "Upload" : "Enviar", + "Remove background image" : "Retirar a imaxe de fondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Para nós o acceso universal é moi importante. Seguimos os estándares web e comprobamos que todo poida ser utilizado sen rato e software de axuda como os lectores de pantalla. O noso obxectivo é ter cumprir ás {guidelines}Directrices de accesibilidade ao contido web{linkend} 2.1 a nivel AA, co tema de alto contraste incluso a nivel AAA.", + ". Unable to apply the setting." : ". Non é posíbel aplicar o axuste." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/hu.js b/apps/theming/l10n/hu.js new file mode 100644 index 00000000000..3b6ad529091 --- /dev/null +++ b/apps/theming/l10n/hu.js @@ -0,0 +1,122 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "A megadott név túl hosszú", + "The given web address is too long" : "A megadott webcím túl hosszú", + "The given web address is not a valid URL" : "A megadott webcím URL címe érvénytelen", + "The given legal notice address is too long" : "A megadott jogi nyilatkozat címe túl hosszú", + "The given legal notice address is not a valid URL" : "A megadott jogi nyilatkozat URL címe érvénytelen", + "The given privacy policy address is too long" : "A megadott adatvédelmi irányelvek címe túl hosszú", + "The given privacy policy address is not a valid URL" : "A megadott adatvédelmi irányelvek URL címe érvénytelen", + "The given slogan is too long" : "A megadott szlogen túl hosszú", + "The given color is invalid" : "A megadott szín érvénytelen", + "Disable-user-theming should be true or false" : "A felhasználói témázás letiltásának igaznak vagy hamisnak kell lennie", + "Saved" : "Mentve", + "Invalid app given" : "Érvénytelen alkalmazás", + "Invalid type for setting \"defaultApp\" given" : "A megadott „defaultApp” beállítás típusa érvénytelen", + "Invalid setting key" : "Érvénytelen konfigurációs kulcs", + "The file was uploaded" : "A fájl fel lett töltve", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "A feltöltött fájl meghaladja a php.ini upload_max_filesize direktívájában meghatározott méretet.", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "A feltöltött fájl meghaladja a HTML űrlapon megadott MAX_FILE_SIZE direktívájában meghatározott méretet.", + "The file was only partially uploaded" : "A fájl csak részlegesen lett feltöltve", + "No file was uploaded" : "Nincs feltöltött fájl", + "Missing a temporary folder" : "Átmeneti mappa hiányzik", + "Could not write file to disk" : "A fájlt nem sikerült a lemezre írni", + "A PHP extension stopped the file upload" : "Egy PHP kiterjesztés megállította a fájl feltöltését", + "No file uploaded" : "Nincs fájl feltöltve", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Már egyéni témát használ. Lehet, hogy a témázó alkalmazás beállításai felülírták.", + "Theming" : "Témázás", + "Appearance and accessibility" : "Megjelenés és akadálymentesítés", + "PHP Imagick module" : "PHP Imagick modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Az „imagick” PHP-modul nem engedélyezett, de a témázó alkalmazás igen. A webhelyikonok előállításához telepítenie és engedélyeznie kell ezt a modult.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Az „imagick” PHP-modul ebben az esetben nem támogatja az SVG-t. A jobb kompatibilitás érdekében ajánlott telepíteni.", + "Dark theme with high contrast mode" : "Sötét téma magas kontrasztú móddal", + "Enable dark high contrast mode" : "Sötét, magas kontrasztú mód engedélyezése", + "Similar to the high contrast mode, but with dark colours." : "Hasonló a magas kontrasztú módhoz, de sötét színekkel.", + "Dark theme" : "Sötét téma", + "Enable dark theme" : "Sötét téma engedélyezése", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Egy szemkímélő sötét téma, amely csökkenti az átlagos fényességet és fényerőt.", + "System default theme" : "Rendszer alapértelmezett témája", + "Enable the system default" : "Rendszer alapértelmezésének engedélyezése", + "Using the default system appearance." : "Az alapértelmezett rendszermegjelenés használata.", + "Dyslexia font" : "Diszlexia betűkészlet", + "Enable dyslexia font" : "Diszlexia betűkészlet engedélyezése", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Az OpenDyslexic egy szabad betűkészlet, amely egyes, diszlexia által okozott, gyakori olvasási hibák csökkentésére lett tervezve.", + "High contrast mode" : "Magas kontrasztú mód", + "Enable high contrast mode" : "Magas kontrasztú mód engedélyezése", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.", + "Light theme" : "Világos téma", + "Enable the default light theme" : "Alapértelmezett világos téma engedélyezése", + "The default light appearance." : "Az alapértelmezett világos megjelenés.", + "Legal notice" : "Jogi nyilatkozat", + "Privacy policy" : "Adatvédelmi irányelvek", + "Adjust the Nextcloud theme" : "A Nextcloud téma módosítása", + "Name" : "Név", + "Web link" : "Webes hivatkozás", + "a safe home for all your data" : "biztonságos hely az adatai számára", + "Slogan" : "Szlogen", + "Primary color" : "Elsődleges szín", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Az elsődleges szín az elemek, például a fontos gombok kiemelésére szolgál. Az aktuális színsémától függően kissé módosulhat.", + "Legal notice link" : "Jogi nyilatkozat hivatkozása", + "Privacy policy link" : "Adatvédelmi irányelvek hivatkozása", + "Header logo" : "Fejléc logó", + "Upload new header logo" : "Fejléc logó feltöltése", + "Favicon" : "Kedvencek ikon", + "Upload new favicon" : "Kedvencek ikon feltöltése", + "User settings" : "Felhasználói beállítások", + "Disable user theming" : "Felhasználói témázás letiltása", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Bár kiválaszthatja és testreszabhatja a példányát, a felhasználók módosíthatják a hátterüket és a színeiket. Ha ki akarja kényszeríteni a saját testreszabását, akkor bekapcsolja ezt. ", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A témák lehetővé teszik, hogy könnyedén személyre szabja a példány és a támogatott kliensek megjelenését. Ez minden felhasználó számára látható lesz.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "A háttérkép helyett sima háttérszínt is beállíthat. Ha háttérképet használ, ez a szín megváltoztatja az alkalmazásmenü ikonjainak színét.", + "Background color" : "Háttérszín", + "Upload new logo" : "Új logó feltöltése", + "Logo" : "Logó", + "Upload new background and login image" : "Új háttér és bejelentkezőkép feltöltése", + "Background and login image" : "Háttér és bejelentkezőkép", + "Advanced options" : "Speciális beállítások", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Telepítse az ImageMagick PHP kiterjesztést SVG képtámogatással, hogy automatikusan előállítsa a kedvencek ikont a feltöltött logó és szín alapján.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}dizájn csapatunkhoz{linkend}!", + "Appearance and accessibility settings" : "Megjelenési és akadálymentesítési beállítások", + "Misc accessibility options" : "Egyéb kisegítő lehetőségek", + "Enable blur background filter (may increase GPU load)" : "Háttérelmosó szűrő engedélyezése (megnövelheti a GPU terhelést)", + "Customization has been disabled by your administrator" : "A testreszabást letiltotta a rendszergazda", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Elsődleges szín beállítása a fontos elemek kiemeléséhez. Az olyan elemek színe, mint az elsődleges gombok, kissé eltérhetnek, ahogyan az akadálymentesítési követelményekhez igazodnak.", + "Background and color" : "Háttér és szín", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "A háttér beállítható az alapértelmezett készletből származó képre, egyéni feltöltött képre vagy sima színre.", + "Keyboard shortcuts" : "Gyorsbillentyűk", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Egyes esetekben a gyorsbillentyűk összeakadhatnak az akadálymentesítési eszközökkel. Hogy helyesen tudjon fókuszálni az eszközre, itt letilthatja a gyorsbillentyűket. Ez az alkalmazásokban is letiltja az összes elérhető gyorsbillentyűt.", + "Disable all keyboard shortcuts" : "Összes gyorsbillentyű letiltása", + "Current selected app: {app}, position {position} of {total}" : "Jelenleg kiválasztott app: {app}, pozíció: {position}a/az {total}-ból/ből", + "Move up" : "Mozgatás fel", + "Move down" : "Mozgatás le", + "Select a background from your files" : "Válasszon hátteret a fájljai közül", + "Select background" : "Háttér választása", + "No background has been selected" : "Nincs kiválasztott háttér", + "Custom background" : "Egyéni háttér", + "Plain background" : "Egyszerű háttér", + "Default background" : "Alapértelmezett háttér", + "Theme selection is enforced" : "A témaválasztás kényszerített", + "Could not set the app order" : "Nem sikerült az alkalmazások sorrendjének beállítása", + "Could not reset the app order" : "Nem sikerült visszaállítani az alkalmazás sorrendet", + "Navigation bar settings" : "Navigációs sáv beállítás", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Beállíthatja a navigációs sávhoz használt alkalmazások sorrendjét. Az első az alapértelmezett alkalmazás lesz, amely bejelentkezés után vagy a logóra kattintva nyílik meg.", + "The default app can not be changed because it was configured by the administrator." : "Az alapértelmezett alkalmazást nem lehet megváltoztatni, mert azt a rendszergazda konfigurálta.", + "The app order was changed, to see it in action you have to reload the page." : "Az alkalmazás sorrend megváltozott, hogy élesben lássa, újra kell töltenie a lapot.", + "Reset default app order" : "Alapértelmezett alkalmazás sorrend visszaállítása", + "Could not set primary color" : "Nem sikerült beállítani az elsődleges színt", + "Reset primary color" : "Elsődleges szín visszaállítása", + "Could not set global default apps" : "Nem sikerült a globális alapértelmezett alkalmazások beállítása", + "Default app" : "Alapértelmezett alkalmazás", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Az alapértelmezett alkalmazás az az alkalmazás, amely pl. bejelentkezés után vagy a menüben lévő logóra kattintva nyílik meg.", + "Use custom default app" : "Egyéni alapértelmezett alkalmazás", + "Global default app" : "Globális alapértelmezett alkalmazás", + "Global default apps" : "Globális alapértelmezett alkalmazások", + "Default app priority" : "Alapértelmezett alkalmazás prioritás", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ha egy alkalmazás nincs engedélyezve egy felhasználó számára, akkor a következő alacsonyabb prioritású alkalmazás kerül felhasználásra.", + "Select a custom color" : "Válasszon egyéni színt", + "Reset to default" : "Visszaállítás alapértelmezettre", + "Upload" : "Feltöltés", + "Remove background image" : "Háttérkép eltávolítása", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines}Webes tartalomra vonatkozó akadálymentesítési irányelvek{linkend} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/hu.json b/apps/theming/l10n/hu.json new file mode 100644 index 00000000000..92963ccc3b2 --- /dev/null +++ b/apps/theming/l10n/hu.json @@ -0,0 +1,120 @@ +{ "translations": { + "The given name is too long" : "A megadott név túl hosszú", + "The given web address is too long" : "A megadott webcím túl hosszú", + "The given web address is not a valid URL" : "A megadott webcím URL címe érvénytelen", + "The given legal notice address is too long" : "A megadott jogi nyilatkozat címe túl hosszú", + "The given legal notice address is not a valid URL" : "A megadott jogi nyilatkozat URL címe érvénytelen", + "The given privacy policy address is too long" : "A megadott adatvédelmi irányelvek címe túl hosszú", + "The given privacy policy address is not a valid URL" : "A megadott adatvédelmi irányelvek URL címe érvénytelen", + "The given slogan is too long" : "A megadott szlogen túl hosszú", + "The given color is invalid" : "A megadott szín érvénytelen", + "Disable-user-theming should be true or false" : "A felhasználói témázás letiltásának igaznak vagy hamisnak kell lennie", + "Saved" : "Mentve", + "Invalid app given" : "Érvénytelen alkalmazás", + "Invalid type for setting \"defaultApp\" given" : "A megadott „defaultApp” beállítás típusa érvénytelen", + "Invalid setting key" : "Érvénytelen konfigurációs kulcs", + "The file was uploaded" : "A fájl fel lett töltve", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "A feltöltött fájl meghaladja a php.ini upload_max_filesize direktívájában meghatározott méretet.", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "A feltöltött fájl meghaladja a HTML űrlapon megadott MAX_FILE_SIZE direktívájában meghatározott méretet.", + "The file was only partially uploaded" : "A fájl csak részlegesen lett feltöltve", + "No file was uploaded" : "Nincs feltöltött fájl", + "Missing a temporary folder" : "Átmeneti mappa hiányzik", + "Could not write file to disk" : "A fájlt nem sikerült a lemezre írni", + "A PHP extension stopped the file upload" : "Egy PHP kiterjesztés megállította a fájl feltöltését", + "No file uploaded" : "Nincs fájl feltöltve", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Már egyéni témát használ. Lehet, hogy a témázó alkalmazás beállításai felülírták.", + "Theming" : "Témázás", + "Appearance and accessibility" : "Megjelenés és akadálymentesítés", + "PHP Imagick module" : "PHP Imagick modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Az „imagick” PHP-modul nem engedélyezett, de a témázó alkalmazás igen. A webhelyikonok előállításához telepítenie és engedélyeznie kell ezt a modult.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Az „imagick” PHP-modul ebben az esetben nem támogatja az SVG-t. A jobb kompatibilitás érdekében ajánlott telepíteni.", + "Dark theme with high contrast mode" : "Sötét téma magas kontrasztú móddal", + "Enable dark high contrast mode" : "Sötét, magas kontrasztú mód engedélyezése", + "Similar to the high contrast mode, but with dark colours." : "Hasonló a magas kontrasztú módhoz, de sötét színekkel.", + "Dark theme" : "Sötét téma", + "Enable dark theme" : "Sötét téma engedélyezése", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Egy szemkímélő sötét téma, amely csökkenti az átlagos fényességet és fényerőt.", + "System default theme" : "Rendszer alapértelmezett témája", + "Enable the system default" : "Rendszer alapértelmezésének engedélyezése", + "Using the default system appearance." : "Az alapértelmezett rendszermegjelenés használata.", + "Dyslexia font" : "Diszlexia betűkészlet", + "Enable dyslexia font" : "Diszlexia betűkészlet engedélyezése", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Az OpenDyslexic egy szabad betűkészlet, amely egyes, diszlexia által okozott, gyakori olvasási hibák csökkentésére lett tervezve.", + "High contrast mode" : "Magas kontrasztú mód", + "Enable high contrast mode" : "Magas kontrasztú mód engedélyezése", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A magas kontrasztú téma megkönnyíti a navigációt. A képi minőség csökken, de az olvashatóság javul.", + "Light theme" : "Világos téma", + "Enable the default light theme" : "Alapértelmezett világos téma engedélyezése", + "The default light appearance." : "Az alapértelmezett világos megjelenés.", + "Legal notice" : "Jogi nyilatkozat", + "Privacy policy" : "Adatvédelmi irányelvek", + "Adjust the Nextcloud theme" : "A Nextcloud téma módosítása", + "Name" : "Név", + "Web link" : "Webes hivatkozás", + "a safe home for all your data" : "biztonságos hely az adatai számára", + "Slogan" : "Szlogen", + "Primary color" : "Elsődleges szín", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Az elsődleges szín az elemek, például a fontos gombok kiemelésére szolgál. Az aktuális színsémától függően kissé módosulhat.", + "Legal notice link" : "Jogi nyilatkozat hivatkozása", + "Privacy policy link" : "Adatvédelmi irányelvek hivatkozása", + "Header logo" : "Fejléc logó", + "Upload new header logo" : "Fejléc logó feltöltése", + "Favicon" : "Kedvencek ikon", + "Upload new favicon" : "Kedvencek ikon feltöltése", + "User settings" : "Felhasználói beállítások", + "Disable user theming" : "Felhasználói témázás letiltása", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Bár kiválaszthatja és testreszabhatja a példányát, a felhasználók módosíthatják a hátterüket és a színeiket. Ha ki akarja kényszeríteni a saját testreszabását, akkor bekapcsolja ezt. ", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A témák lehetővé teszik, hogy könnyedén személyre szabja a példány és a támogatott kliensek megjelenését. Ez minden felhasználó számára látható lesz.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "A háttérkép helyett sima háttérszínt is beállíthat. Ha háttérképet használ, ez a szín megváltoztatja az alkalmazásmenü ikonjainak színét.", + "Background color" : "Háttérszín", + "Upload new logo" : "Új logó feltöltése", + "Logo" : "Logó", + "Upload new background and login image" : "Új háttér és bejelentkezőkép feltöltése", + "Background and login image" : "Háttér és bejelentkezőkép", + "Advanced options" : "Speciális beállítások", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Telepítse az ImageMagick PHP kiterjesztést SVG képtámogatással, hogy automatikusan előállítsa a kedvencek ikont a feltöltött logó és szín alapján.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ha problémákat tapasztal, jelentse a {issuetracker}hibakövetőnkben{linkend}. És ha segíteni szeretne, csatlakozzon a {designteam}dizájn csapatunkhoz{linkend}!", + "Appearance and accessibility settings" : "Megjelenési és akadálymentesítési beállítások", + "Misc accessibility options" : "Egyéb kisegítő lehetőségek", + "Enable blur background filter (may increase GPU load)" : "Háttérelmosó szűrő engedélyezése (megnövelheti a GPU terhelést)", + "Customization has been disabled by your administrator" : "A testreszabást letiltotta a rendszergazda", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Elsődleges szín beállítása a fontos elemek kiemeléséhez. Az olyan elemek színe, mint az elsődleges gombok, kissé eltérhetnek, ahogyan az akadálymentesítési követelményekhez igazodnak.", + "Background and color" : "Háttér és szín", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "A háttér beállítható az alapértelmezett készletből származó képre, egyéni feltöltött képre vagy sima színre.", + "Keyboard shortcuts" : "Gyorsbillentyűk", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Egyes esetekben a gyorsbillentyűk összeakadhatnak az akadálymentesítési eszközökkel. Hogy helyesen tudjon fókuszálni az eszközre, itt letilthatja a gyorsbillentyűket. Ez az alkalmazásokban is letiltja az összes elérhető gyorsbillentyűt.", + "Disable all keyboard shortcuts" : "Összes gyorsbillentyű letiltása", + "Current selected app: {app}, position {position} of {total}" : "Jelenleg kiválasztott app: {app}, pozíció: {position}a/az {total}-ból/ből", + "Move up" : "Mozgatás fel", + "Move down" : "Mozgatás le", + "Select a background from your files" : "Válasszon hátteret a fájljai közül", + "Select background" : "Háttér választása", + "No background has been selected" : "Nincs kiválasztott háttér", + "Custom background" : "Egyéni háttér", + "Plain background" : "Egyszerű háttér", + "Default background" : "Alapértelmezett háttér", + "Theme selection is enforced" : "A témaválasztás kényszerített", + "Could not set the app order" : "Nem sikerült az alkalmazások sorrendjének beállítása", + "Could not reset the app order" : "Nem sikerült visszaállítani az alkalmazás sorrendet", + "Navigation bar settings" : "Navigációs sáv beállítás", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Beállíthatja a navigációs sávhoz használt alkalmazások sorrendjét. Az első az alapértelmezett alkalmazás lesz, amely bejelentkezés után vagy a logóra kattintva nyílik meg.", + "The default app can not be changed because it was configured by the administrator." : "Az alapértelmezett alkalmazást nem lehet megváltoztatni, mert azt a rendszergazda konfigurálta.", + "The app order was changed, to see it in action you have to reload the page." : "Az alkalmazás sorrend megváltozott, hogy élesben lássa, újra kell töltenie a lapot.", + "Reset default app order" : "Alapértelmezett alkalmazás sorrend visszaállítása", + "Could not set primary color" : "Nem sikerült beállítani az elsődleges színt", + "Reset primary color" : "Elsődleges szín visszaállítása", + "Could not set global default apps" : "Nem sikerült a globális alapértelmezett alkalmazások beállítása", + "Default app" : "Alapértelmezett alkalmazás", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Az alapértelmezett alkalmazás az az alkalmazás, amely pl. bejelentkezés után vagy a menüben lévő logóra kattintva nyílik meg.", + "Use custom default app" : "Egyéni alapértelmezett alkalmazás", + "Global default app" : "Globális alapértelmezett alkalmazás", + "Global default apps" : "Globális alapértelmezett alkalmazások", + "Default app priority" : "Alapértelmezett alkalmazás prioritás", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ha egy alkalmazás nincs engedélyezve egy felhasználó számára, akkor a következő alacsonyabb prioritású alkalmazás kerül felhasználásra.", + "Select a custom color" : "Válasszon egyéni színt", + "Reset to default" : "Visszaállítás alapértelmezettre", + "Upload" : "Feltöltés", + "Remove background image" : "Háttérkép eltávolítása", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Az akadálymentesítés fontos számunka. A webes szabványokat követjük, és ellenőrizzük, hogy minden használható egér nélkül, illetve akadálymentesítési technológiákkal, például képernyőolvasókkal. Arra törekszünk, hogy a {guidelines}Webes tartalomra vonatkozó akadálymentesítési irányelvek{linkend} 2.1-es változatának AA szinten, a magas kontrasztú témával pedig AAA szinten megfeleljünk." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/is.js b/apps/theming/l10n/is.js new file mode 100644 index 00000000000..d21e6d86b24 --- /dev/null +++ b/apps/theming/l10n/is.js @@ -0,0 +1,111 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Uppgefið nafn er of langt", + "The given web address is too long" : "Uppgefið veffang er of langt", + "The given web address is not a valid URL" : "Uppgefið veffang er ekki gild vefslóð", + "The given legal notice address is too long" : "Uppgefið veffang lagatexta er of langt", + "The given legal notice address is not a valid URL" : "Uppgefið veffang lagatexta er ekki gild vefslóð", + "The given privacy policy address is too long" : "Veffang á stefnu um meðferð persónulegra gagna er of langt", + "The given privacy policy address is not a valid URL" : "Veffang á stefnu um meðferð persónulegra gagna er ekki gild vefslóð", + "The given slogan is too long" : "Uppgefið slagorð er of langt", + "The given color is invalid" : "Uppgefinn litur er ógildur", + "Disable-user-theming should be true or false" : "Gera-þemu-notanda-óvirk ætti að vera satt eða ósatt", + "Saved" : "Vistað", + "Invalid app given" : "Ógilt forrit gefið", + "Invalid type for setting \"defaultApp\" given" : "Ógild tegund gefin fyrir stillinguna \"defaultApp\"", + "Invalid setting key" : "Ógildur stillingalykill", + "The file was uploaded" : "Skráin var send inn", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Innsend skrá er stærri en upload_max stillingin í php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Innsenda skráin er stærri en MAX_FILE_SIZE sem skilgreint er í HTML sniðinu", + "The file was only partially uploaded" : "Einungis hluti af innsendri skrá skilaði sér", + "No file was uploaded" : "Engin skrá skilaði sér", + "Missing a temporary folder" : "Vantar bráðabirgðamöppu", + "Could not write file to disk" : "Tókst ekki að skrifa skrá á disk.", + "A PHP extension stopped the file upload" : "PHP-viðbót stöðvaði innsendingu skráar", + "No file uploaded" : "Engin skrá var send inn", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Þú ert nú þegar að nota sérsniðið þema. Mögulega gæti það skrifað yfir stillingar í þemaforriti.", + "Theming" : "Þemu", + "Appearance and accessibility" : "Útlit og aðgengi", + "PHP Imagick module" : "PHP Imagick eining", + "Dark theme with high contrast mode" : "Dökkt þema með mikil birtuskil", + "Enable dark high contrast mode" : "Virkja dökkt þema með mikil birtuskil", + "Similar to the high contrast mode, but with dark colours." : "Svipað þemanu með mikil birtuskil, en með dökka liti.", + "Dark theme" : "Dökkt þema", + "Enable dark theme" : "Virkja dökkt þema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Dökkt þema til að minnka álag á augun meðal annars með því að minnka heildarljósmagn og birtustig.", + "System default theme" : "Sjálfgefið þema í kerfinu", + "Enable the system default" : "Virkja sjálfgefið þema kerfis", + "Using the default system appearance." : "Nota sjálfgefið útlit kerfisins.", + "Dyslexia font" : "Dyslexia letur", + "Enable dyslexia font" : "Virkja letur fyrir lesblinda", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic eru frjálsar leturgerðir sem eru hannaðar til að ráða bug á eða minnka vægi ýmissa villna sem stafa af lesblindu (dyslexia).", + "High contrast mode" : "Mikil birtuskil", + "Enable high contrast mode" : "Virkja ham með mikil birtuskil", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Þema með mikil birtuskil til að auðvelda vafur. Sjónræn gæði minnka en skýrleiki eykst", + "Light theme" : "Ljóst þema", + "Enable the default light theme" : "Virkja sjálfgefið ljóst þema", + "The default light appearance." : "Sjálfgefna ljósa útlitið.", + "Legal notice" : "Lagaleg atriði", + "Privacy policy" : "Stefna um meðferð persónulegra gagna", + "Adjust the Nextcloud theme" : "Laga Nextcloud þema", + "Name" : "Heiti", + "Web link" : "Veftengill", + "a safe home for all your data" : "öruggur staður fyrir öll gögnin þín", + "Slogan" : "Slagorð", + "Primary color" : "Aðallitur", + "Legal notice link" : "Tengill á lagaleg atriði", + "Privacy policy link" : "Tengill á stefnu um meðferð persónulegra gagna", + "Header logo" : "Táknmerki í haus", + "Upload new header logo" : "Senda inn nýtt táknmerki fyrir síðuhaus", + "Favicon" : "Veftákn", + "Upload new favicon" : "Senda inn nýja táknmynd", + "User settings" : "Notandastillingar", + "Disable user theming" : "Gera þemu notanda óvirk", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Þemu gera þér kleift að breyta útliti og hegðun þíns eintaks af viðmótinu auk studdra biðlaraforrita. Það verður sýnilegt öllum notendum.", + "Background color" : "Bakgrunnslitur", + "Upload new logo" : "Senda inn nýtt táknmerki", + "Logo" : "Táknmerki", + "Upload new background and login image" : "Senda inn nýjan bakgrunn og innskráningarmynd", + "Background and login image" : "Bakgrunnur og innskráningarmynd", + "Advanced options" : "Ítarlegir valkostir", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Settu inn ImageMagick PHP forritsviðaukann með stuðningi við SVG-myndir til að útbúa sjálfvirkt veftáknmyndir byggðar á innsendu táknmerki og lit.", + "Appearance and accessibility settings" : "Stillingar útlits og aðgengis", + "Misc accessibility options" : "Ýmsir valkostir fyrir auðveldað aðgengi", + "Customization has been disabled by your administrator" : "Sérsníðing hefur verið gerð óvirk af kerfisstjóra", + "Background and color" : "Bakgrunnur og litir", + "Keyboard shortcuts" : "Flýtileiðir á lyklaborði", + "Disable all keyboard shortcuts" : "Gera alla flýtilykla óvirka", + "Current selected app: {app}, position {position} of {total}" : "Valið forrit: {app}, staða {position} af {total}", + "Move up" : "Færa upp", + "Move down" : "Færa niður", + "Select a background from your files" : "Veldu bakgrunn úr skránum þínum", + "Select background" : "Veldu bakgrunn", + "No background has been selected" : "Enginn bakgrunnur hefur verið valinn", + "Custom background" : "Sérsniðinn bakgrunnur", + "Plain background" : "Einfaldur bakgrunnur", + "Default background" : "Sjálfgefinn bakgrunnur", + "Theme selection is enforced" : "Val á þema er þvingað", + "Could not set the app order" : "Gat ekki stillt röð forrita", + "Could not reset the app order" : "Gat ekki endurstillt röð forrita", + "Navigation bar settings" : "Stillingar flakkstiku", + "The default app can not be changed because it was configured by the administrator." : "Ekki er hægt að breyta sjálfgefnu forriti því það var stillt af kerfisstjóra.", + "The app order was changed, to see it in action you have to reload the page." : "Röð forrita var breytt, til að sjá það í verki ættirðu að hlaða síðunni aftur inn.", + "Reset default app order" : "Endurstilla sjálfgefna röð forrita", + "Could not set primary color" : "Ekki tókst að setja aðallit", + "Reset primary color" : "Endursetja aðallit", + "Could not set global default apps" : "Gat ekki sett víðvær sjálfgefin forrit", + "Default app" : "Sjálfgefið forrit", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Sjálfgefna forritið er það forrit sem t.d. opnast eftir innskráningu eða þegar smellt er á táknmerkið í valmyndinni.", + "Use custom default app" : "Nota sérsniðið sjálfgefið forrit", + "Global default app" : "Víðvært sjálfgefið forrit", + "Global default apps" : "Víðvær sjálfgefin forrit", + "Default app priority" : "Sjálfgefinn forgangur forrits", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ef forrit er ekki virkjað fyrir notanda, verður næsta forrit með lægri forgangi notað.", + "Select a custom color" : "Veldu sérsniðinn lit", + "Reset to default" : "Endurstilla á sjálfgefið", + "Upload" : "Senda inn", + "Remove background image" : "Fjarlægja bakgrunnsmynd", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Aðgengi fyrir alla er okkur mikilvægt. Við fylgjum vefstöðlum oggöngum úr skugga um að allt sé nothæft án þess að nota tölvumús, auk þess að hjálpartæki á borð við skjálesara virki. Við miðum að samhæfni við {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 á stigi AA, og höfum meira að segja háskerpuþemað miðað við stig AAA." +}, +"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/theming/l10n/is.json b/apps/theming/l10n/is.json new file mode 100644 index 00000000000..74876777d65 --- /dev/null +++ b/apps/theming/l10n/is.json @@ -0,0 +1,109 @@ +{ "translations": { + "The given name is too long" : "Uppgefið nafn er of langt", + "The given web address is too long" : "Uppgefið veffang er of langt", + "The given web address is not a valid URL" : "Uppgefið veffang er ekki gild vefslóð", + "The given legal notice address is too long" : "Uppgefið veffang lagatexta er of langt", + "The given legal notice address is not a valid URL" : "Uppgefið veffang lagatexta er ekki gild vefslóð", + "The given privacy policy address is too long" : "Veffang á stefnu um meðferð persónulegra gagna er of langt", + "The given privacy policy address is not a valid URL" : "Veffang á stefnu um meðferð persónulegra gagna er ekki gild vefslóð", + "The given slogan is too long" : "Uppgefið slagorð er of langt", + "The given color is invalid" : "Uppgefinn litur er ógildur", + "Disable-user-theming should be true or false" : "Gera-þemu-notanda-óvirk ætti að vera satt eða ósatt", + "Saved" : "Vistað", + "Invalid app given" : "Ógilt forrit gefið", + "Invalid type for setting \"defaultApp\" given" : "Ógild tegund gefin fyrir stillinguna \"defaultApp\"", + "Invalid setting key" : "Ógildur stillingalykill", + "The file was uploaded" : "Skráin var send inn", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Innsend skrá er stærri en upload_max stillingin í php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Innsenda skráin er stærri en MAX_FILE_SIZE sem skilgreint er í HTML sniðinu", + "The file was only partially uploaded" : "Einungis hluti af innsendri skrá skilaði sér", + "No file was uploaded" : "Engin skrá skilaði sér", + "Missing a temporary folder" : "Vantar bráðabirgðamöppu", + "Could not write file to disk" : "Tókst ekki að skrifa skrá á disk.", + "A PHP extension stopped the file upload" : "PHP-viðbót stöðvaði innsendingu skráar", + "No file uploaded" : "Engin skrá var send inn", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Þú ert nú þegar að nota sérsniðið þema. Mögulega gæti það skrifað yfir stillingar í þemaforriti.", + "Theming" : "Þemu", + "Appearance and accessibility" : "Útlit og aðgengi", + "PHP Imagick module" : "PHP Imagick eining", + "Dark theme with high contrast mode" : "Dökkt þema með mikil birtuskil", + "Enable dark high contrast mode" : "Virkja dökkt þema með mikil birtuskil", + "Similar to the high contrast mode, but with dark colours." : "Svipað þemanu með mikil birtuskil, en með dökka liti.", + "Dark theme" : "Dökkt þema", + "Enable dark theme" : "Virkja dökkt þema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Dökkt þema til að minnka álag á augun meðal annars með því að minnka heildarljósmagn og birtustig.", + "System default theme" : "Sjálfgefið þema í kerfinu", + "Enable the system default" : "Virkja sjálfgefið þema kerfis", + "Using the default system appearance." : "Nota sjálfgefið útlit kerfisins.", + "Dyslexia font" : "Dyslexia letur", + "Enable dyslexia font" : "Virkja letur fyrir lesblinda", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic eru frjálsar leturgerðir sem eru hannaðar til að ráða bug á eða minnka vægi ýmissa villna sem stafa af lesblindu (dyslexia).", + "High contrast mode" : "Mikil birtuskil", + "Enable high contrast mode" : "Virkja ham með mikil birtuskil", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Þema með mikil birtuskil til að auðvelda vafur. Sjónræn gæði minnka en skýrleiki eykst", + "Light theme" : "Ljóst þema", + "Enable the default light theme" : "Virkja sjálfgefið ljóst þema", + "The default light appearance." : "Sjálfgefna ljósa útlitið.", + "Legal notice" : "Lagaleg atriði", + "Privacy policy" : "Stefna um meðferð persónulegra gagna", + "Adjust the Nextcloud theme" : "Laga Nextcloud þema", + "Name" : "Heiti", + "Web link" : "Veftengill", + "a safe home for all your data" : "öruggur staður fyrir öll gögnin þín", + "Slogan" : "Slagorð", + "Primary color" : "Aðallitur", + "Legal notice link" : "Tengill á lagaleg atriði", + "Privacy policy link" : "Tengill á stefnu um meðferð persónulegra gagna", + "Header logo" : "Táknmerki í haus", + "Upload new header logo" : "Senda inn nýtt táknmerki fyrir síðuhaus", + "Favicon" : "Veftákn", + "Upload new favicon" : "Senda inn nýja táknmynd", + "User settings" : "Notandastillingar", + "Disable user theming" : "Gera þemu notanda óvirk", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Þemu gera þér kleift að breyta útliti og hegðun þíns eintaks af viðmótinu auk studdra biðlaraforrita. Það verður sýnilegt öllum notendum.", + "Background color" : "Bakgrunnslitur", + "Upload new logo" : "Senda inn nýtt táknmerki", + "Logo" : "Táknmerki", + "Upload new background and login image" : "Senda inn nýjan bakgrunn og innskráningarmynd", + "Background and login image" : "Bakgrunnur og innskráningarmynd", + "Advanced options" : "Ítarlegir valkostir", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Settu inn ImageMagick PHP forritsviðaukann með stuðningi við SVG-myndir til að útbúa sjálfvirkt veftáknmyndir byggðar á innsendu táknmerki og lit.", + "Appearance and accessibility settings" : "Stillingar útlits og aðgengis", + "Misc accessibility options" : "Ýmsir valkostir fyrir auðveldað aðgengi", + "Customization has been disabled by your administrator" : "Sérsníðing hefur verið gerð óvirk af kerfisstjóra", + "Background and color" : "Bakgrunnur og litir", + "Keyboard shortcuts" : "Flýtileiðir á lyklaborði", + "Disable all keyboard shortcuts" : "Gera alla flýtilykla óvirka", + "Current selected app: {app}, position {position} of {total}" : "Valið forrit: {app}, staða {position} af {total}", + "Move up" : "Færa upp", + "Move down" : "Færa niður", + "Select a background from your files" : "Veldu bakgrunn úr skránum þínum", + "Select background" : "Veldu bakgrunn", + "No background has been selected" : "Enginn bakgrunnur hefur verið valinn", + "Custom background" : "Sérsniðinn bakgrunnur", + "Plain background" : "Einfaldur bakgrunnur", + "Default background" : "Sjálfgefinn bakgrunnur", + "Theme selection is enforced" : "Val á þema er þvingað", + "Could not set the app order" : "Gat ekki stillt röð forrita", + "Could not reset the app order" : "Gat ekki endurstillt röð forrita", + "Navigation bar settings" : "Stillingar flakkstiku", + "The default app can not be changed because it was configured by the administrator." : "Ekki er hægt að breyta sjálfgefnu forriti því það var stillt af kerfisstjóra.", + "The app order was changed, to see it in action you have to reload the page." : "Röð forrita var breytt, til að sjá það í verki ættirðu að hlaða síðunni aftur inn.", + "Reset default app order" : "Endurstilla sjálfgefna röð forrita", + "Could not set primary color" : "Ekki tókst að setja aðallit", + "Reset primary color" : "Endursetja aðallit", + "Could not set global default apps" : "Gat ekki sett víðvær sjálfgefin forrit", + "Default app" : "Sjálfgefið forrit", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Sjálfgefna forritið er það forrit sem t.d. opnast eftir innskráningu eða þegar smellt er á táknmerkið í valmyndinni.", + "Use custom default app" : "Nota sérsniðið sjálfgefið forrit", + "Global default app" : "Víðvært sjálfgefið forrit", + "Global default apps" : "Víðvær sjálfgefin forrit", + "Default app priority" : "Sjálfgefinn forgangur forrits", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ef forrit er ekki virkjað fyrir notanda, verður næsta forrit með lægri forgangi notað.", + "Select a custom color" : "Veldu sérsniðinn lit", + "Reset to default" : "Endurstilla á sjálfgefið", + "Upload" : "Senda inn", + "Remove background image" : "Fjarlægja bakgrunnsmynd", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Aðgengi fyrir alla er okkur mikilvægt. Við fylgjum vefstöðlum oggöngum úr skugga um að allt sé nothæft án þess að nota tölvumús, auk þess að hjálpartæki á borð við skjálesara virki. Við miðum að samhæfni við {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 á stigi AA, og höfum meira að segja háskerpuþemað miðað við stig AAA." +},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/it.js b/apps/theming/l10n/it.js new file mode 100644 index 00000000000..c80ae5afad3 --- /dev/null +++ b/apps/theming/l10n/it.js @@ -0,0 +1,123 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Questo nome è troppo lungo", + "The given web address is too long" : "Questo indirizzo web è troppo lungo", + "The given web address is not a valid URL" : "L'indirizzo web specifico non è un URL valido", + "The given legal notice address is too long" : "L'indirizzo dell'avviso legale specificato è troppo lungo", + "The given legal notice address is not a valid URL" : "L'indirizzo delle specifiche note legali non è un URL valido", + "The given privacy policy address is too long" : "L'indirizzo dello specifico criterio di riservatezza è troppo lungo", + "The given privacy policy address is not a valid URL" : "L'indirizzo dello specifico criterio di riservatezza non è un URL valido", + "The given slogan is too long" : "Questo slogan è troppo lungo", + "The given color is invalid" : "Questo colore non è valido", + "Disable-user-theming should be true or false" : "Disattiva-temi-utente deve essere true o false", + "Saved" : "Salvato", + "Invalid app given" : "Applicazione non valida", + "Invalid type for setting \"defaultApp\" given" : "Tipo per l'impostazione \"defaultApp\" non valido", + "Invalid setting key" : "Voce di impostazione non valida", + "The file was uploaded" : "Il file è stato caricato", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", + "The file was only partially uploaded" : "Il file è stato caricato solo parzialmente", + "No file was uploaded" : "Non è stato caricato alcun file", + "Missing a temporary folder" : "Manca una cartella temporanea", + "Could not write file to disk" : "Impossibile scrivere il file su disco", + "A PHP extension stopped the file upload" : "Un'estensione PHP ha fermato il caricamento del file", + "No file uploaded" : "Nessun file caricato", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Stai già utilizzando un tema personalizzato. Le impostazioni dell'applicazione dei temi potrebbero essere sovrascritte.", + "Theming" : "Tema", + "Appearance and accessibility" : "Aspetto e accessibilità", + "PHP Imagick module" : "Modulo Imagick PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Il modulo PHP \"imagick\" non è attivato sebbene l'applicazione dei temi lo sia. Affinché la generazione di favicon funzioni bene, devi installare ed attivare questo modulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Al modulo \"imagick\" di PHP manca il supporto SVG. Per una migliore compatibilità si consiglia di installarlo.", + "Dark theme with high contrast mode" : "Tema scuro con modalità di contrasto elevato", + "Enable dark high contrast mode" : "Abilita la modalità scuro ad alto contrasto", + "Similar to the high contrast mode, but with dark colours." : "Simile alla modalità a contrasto elevato, ma con colori scuri.", + "Dark theme" : "Tema scuro", + "Enable dark theme" : "Abilita il tema scuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema scuro per alleviare la vista riducendo la luminosità e la brillantezza generale.", + "System default theme" : "Tema predefinito del sistema", + "Enable the system default" : "Abilita predefinito del sistema", + "Using the default system appearance." : "Utilizzo dell'aspetto di sistema predefinito.", + "Dyslexia font" : "Carattere per dislessici", + "Enable dyslexia font" : "Abilita il carattere per dislessici", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic è un carattere libero progettato per mitigare alcuni dei comuni errori di lettura causati dalla dislessia.", + "High contrast mode" : "Modalità ad alto contrasto", + "Enable high contrast mode" : "Abilita la modalità ad alto contrasto", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Una modalità ad alto contrasto per semplificare la tua navigazione. La qualità visiva sarà ridotta per incrementare la chiarezza.", + "Light theme" : "Tema chiaro", + "Enable the default light theme" : "Abilita il tema chiaro predefinito", + "The default light appearance." : "L'aspetto del tema chiaro predefinito.", + "Legal notice" : "Avviso legale", + "Privacy policy" : "Criterio di riservatezza", + "Adjust the Nextcloud theme" : "Modifica il tema di Nextcloud", + "Name" : "Nome", + "Web link" : "Collegamento web", + "a safe home for all your data" : "un posto sicuro per tutti i tuoi dati", + "Slogan" : "Slogan", + "Primary color" : "Colore primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Il colore primario è usato per evidenziare elementi, come pulsanti importanti. Può essere regolato un po' a seconda dello schema di colori attuale.", + "Legal notice link" : "Collegamento avviso legale", + "Privacy policy link" : "Collegamento criteri di riservatezza", + "Header logo" : "Logo dell'intestazione", + "Upload new header logo" : "Carica nuovo logo dell'intestazione", + "Favicon" : "Favicon", + "Upload new favicon" : "Carica nuova favicon", + "User settings" : "Impostazioni utente", + "Disable user theming" : "Disattiva temi utente", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Sebbene tu possa selezionare e personalizzare la tua istanza, gli utenti possono cambiare il loro sfondo e colore. Se vuoi forzare la tua personalizzazione, puoi attivare questo.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "La gestione dei temi rende semplice la personalizzazione dell'aspetto della tua istanza e dei client supportati. Ciò sarà visibile a tutti gli utenti.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Al posto di un'immagine, puoi anche configurare un colore di sfondo. Se usi un'immagine di sfondo, cambiare questo colore influenzerà il colore delle icone dei menu.", + "Background color" : "Colore di sfondo", + "Upload new logo" : "Carica nuovo logo", + "Logo" : "Logo", + "Upload new background and login image" : "Carica nuova immagine di sfondo e di accesso", + "Background and login image" : "Immagine di sfondo e di accesso", + "Advanced options" : "Opzioni avanzate", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installa l'estensione ImageMagick di PHP con supporto per le immagini SVG per generare automaticamente favicon basate sul logo caricato e sul colore.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se trovi qualsiasi problema, non esitare a segnalarlo sul {issuetracker}nostro sistema di segnalazione dei bug{linkend}. E se vuoi partecipare, unisciti alla {designteam}nostra squadra di progettazione{linkend}!", + "Appearance and accessibility settings" : "Impostazioni di aspetto e accessibilità", + "Misc accessibility options" : "Altre opzioni di accessibilità ", + "Enable blur background filter (may increase GPU load)" : "Abilita filtro di sfocamento dello sfondo (può aumentare il carico sulla GPU)", + "Customization has been disabled by your administrator" : "La personalizzazione è stata disattivata dall'amministratore", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Imposta un colore primario per evidenziare elementi importanti. Il colore usato per elementi come pulsanti principali può essere leggermente diverso, dato che viene regolato per soddisfare i requisiti di accessibilità.", + "Background and color" : "Sfondo e colore", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Lo sfondo può essere impostato ad un'immagine dal set predefinito, un'immagine caricata a mano, o un colore unico.", + "Keyboard shortcuts" : "Scorciatoie da tastiera", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In alcuni casi le scorciatoie da tastiera possono interferire con gli strumenti di accessibilità. Per concentrarti correttamente sullo strumento, è possibile disattivare tutte le scorciatoie da tastiera. Verranno disattivate anche tutte le scorciatoie disponibili nelle applicazioni.", + "Disable all keyboard shortcuts" : "Disattiva tutte le scorciatoie da tastiera", + "Current selected app: {app}, position {position} of {total}" : "Applicazione attualmente selezionata: {app}, posizione {position} di {total}", + "Move up" : "Sposta su", + "Move down" : "Sposta giù", + "Select a background from your files" : "Seleziona uno sfondo dai tuoi file", + "Select background" : "Seleziona sfondo", + "No background has been selected" : "Nessuno sfondo selezionato", + "Custom background" : "Sfondo personalizzato", + "Plain background" : "Sfondo semplice", + "Default background" : "Sfondo predefinito", + "Theme selection is enforced" : "La selezione del tema è obbligata", + "Could not set the app order" : "Impossibile impostare l'ordine delle applicazioni", + "Could not reset the app order" : "Impossibile ripristinare l'ordine delle applicazioni", + "Navigation bar settings" : "Impostazioni barra di navigazione", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puoi configurare l'ordine delle applicazioni usato per la barra di navigazione. La prima voce sarà l'applicazione predefinita, aperta dopo l'accesso o quando si fa clic sul logo.", + "The default app can not be changed because it was configured by the administrator." : "L'applicazione predefinita non può essere cambiata perché è stata configurata dall'amministratore.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordine delle applicazioni è stato cambiato, per vedere le modifiche devi ricaricare la pagina.", + "Reset default app order" : "Ripristina ordine predefinito delle applicazioni", + "Could not set primary color" : "Impossibile impostare il colore primario", + "Reset primary color" : "Ripristina colore primario", + "Could not set global default apps" : "Impossibile impostare le app predefinite globali", + "Default app" : "Applicazione predefinita", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'applicazione predefinita è quella che viene aperta dopo l'accesso o quando si fa clic sul logo nel menu.", + "Use custom default app" : "Usa app predefinita personalizzata", + "Global default app" : "App predefinita globale", + "Global default apps" : "App predefinite globali", + "Default app priority" : "Priorità app predefinita", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se un'app non è abilitata per un utente, viene usata quella successiva con priorità più bassa.", + "Select a custom color" : "Seleziona un colore personalizzato", + "Reset to default" : "Ripristina valori predefiniti", + "Upload" : "Carica", + "Remove background image" : "Rimuovi immagine di sfondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accesso universale è molto importante per noi. Seguiamo gli standard web e cerchiamo di rendere tutto utilizzabile anche senza mouse, e programmi di assistenza come i lettori dello schermo. Il nostro obiettivo è la compatibilità con la {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 a livello AA, con il tema ad alto contrasto anche a livello AAA. ", + ". Unable to apply the setting." : "Impossiblie applicare l'impostazione." +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/it.json b/apps/theming/l10n/it.json new file mode 100644 index 00000000000..1f8e838ca5f --- /dev/null +++ b/apps/theming/l10n/it.json @@ -0,0 +1,121 @@ +{ "translations": { + "The given name is too long" : "Questo nome è troppo lungo", + "The given web address is too long" : "Questo indirizzo web è troppo lungo", + "The given web address is not a valid URL" : "L'indirizzo web specifico non è un URL valido", + "The given legal notice address is too long" : "L'indirizzo dell'avviso legale specificato è troppo lungo", + "The given legal notice address is not a valid URL" : "L'indirizzo delle specifiche note legali non è un URL valido", + "The given privacy policy address is too long" : "L'indirizzo dello specifico criterio di riservatezza è troppo lungo", + "The given privacy policy address is not a valid URL" : "L'indirizzo dello specifico criterio di riservatezza non è un URL valido", + "The given slogan is too long" : "Questo slogan è troppo lungo", + "The given color is invalid" : "Questo colore non è valido", + "Disable-user-theming should be true or false" : "Disattiva-temi-utente deve essere true o false", + "Saved" : "Salvato", + "Invalid app given" : "Applicazione non valida", + "Invalid type for setting \"defaultApp\" given" : "Tipo per l'impostazione \"defaultApp\" non valido", + "Invalid setting key" : "Voce di impostazione non valida", + "The file was uploaded" : "Il file è stato caricato", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", + "The file was only partially uploaded" : "Il file è stato caricato solo parzialmente", + "No file was uploaded" : "Non è stato caricato alcun file", + "Missing a temporary folder" : "Manca una cartella temporanea", + "Could not write file to disk" : "Impossibile scrivere il file su disco", + "A PHP extension stopped the file upload" : "Un'estensione PHP ha fermato il caricamento del file", + "No file uploaded" : "Nessun file caricato", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Stai già utilizzando un tema personalizzato. Le impostazioni dell'applicazione dei temi potrebbero essere sovrascritte.", + "Theming" : "Tema", + "Appearance and accessibility" : "Aspetto e accessibilità", + "PHP Imagick module" : "Modulo Imagick PHP", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Il modulo PHP \"imagick\" non è attivato sebbene l'applicazione dei temi lo sia. Affinché la generazione di favicon funzioni bene, devi installare ed attivare questo modulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Al modulo \"imagick\" di PHP manca il supporto SVG. Per una migliore compatibilità si consiglia di installarlo.", + "Dark theme with high contrast mode" : "Tema scuro con modalità di contrasto elevato", + "Enable dark high contrast mode" : "Abilita la modalità scuro ad alto contrasto", + "Similar to the high contrast mode, but with dark colours." : "Simile alla modalità a contrasto elevato, ma con colori scuri.", + "Dark theme" : "Tema scuro", + "Enable dark theme" : "Abilita il tema scuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Un tema scuro per alleviare la vista riducendo la luminosità e la brillantezza generale.", + "System default theme" : "Tema predefinito del sistema", + "Enable the system default" : "Abilita predefinito del sistema", + "Using the default system appearance." : "Utilizzo dell'aspetto di sistema predefinito.", + "Dyslexia font" : "Carattere per dislessici", + "Enable dyslexia font" : "Abilita il carattere per dislessici", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic è un carattere libero progettato per mitigare alcuni dei comuni errori di lettura causati dalla dislessia.", + "High contrast mode" : "Modalità ad alto contrasto", + "Enable high contrast mode" : "Abilita la modalità ad alto contrasto", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Una modalità ad alto contrasto per semplificare la tua navigazione. La qualità visiva sarà ridotta per incrementare la chiarezza.", + "Light theme" : "Tema chiaro", + "Enable the default light theme" : "Abilita il tema chiaro predefinito", + "The default light appearance." : "L'aspetto del tema chiaro predefinito.", + "Legal notice" : "Avviso legale", + "Privacy policy" : "Criterio di riservatezza", + "Adjust the Nextcloud theme" : "Modifica il tema di Nextcloud", + "Name" : "Nome", + "Web link" : "Collegamento web", + "a safe home for all your data" : "un posto sicuro per tutti i tuoi dati", + "Slogan" : "Slogan", + "Primary color" : "Colore primario", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Il colore primario è usato per evidenziare elementi, come pulsanti importanti. Può essere regolato un po' a seconda dello schema di colori attuale.", + "Legal notice link" : "Collegamento avviso legale", + "Privacy policy link" : "Collegamento criteri di riservatezza", + "Header logo" : "Logo dell'intestazione", + "Upload new header logo" : "Carica nuovo logo dell'intestazione", + "Favicon" : "Favicon", + "Upload new favicon" : "Carica nuova favicon", + "User settings" : "Impostazioni utente", + "Disable user theming" : "Disattiva temi utente", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Sebbene tu possa selezionare e personalizzare la tua istanza, gli utenti possono cambiare il loro sfondo e colore. Se vuoi forzare la tua personalizzazione, puoi attivare questo.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "La gestione dei temi rende semplice la personalizzazione dell'aspetto della tua istanza e dei client supportati. Ciò sarà visibile a tutti gli utenti.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Al posto di un'immagine, puoi anche configurare un colore di sfondo. Se usi un'immagine di sfondo, cambiare questo colore influenzerà il colore delle icone dei menu.", + "Background color" : "Colore di sfondo", + "Upload new logo" : "Carica nuovo logo", + "Logo" : "Logo", + "Upload new background and login image" : "Carica nuova immagine di sfondo e di accesso", + "Background and login image" : "Immagine di sfondo e di accesso", + "Advanced options" : "Opzioni avanzate", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installa l'estensione ImageMagick di PHP con supporto per le immagini SVG per generare automaticamente favicon basate sul logo caricato e sul colore.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se trovi qualsiasi problema, non esitare a segnalarlo sul {issuetracker}nostro sistema di segnalazione dei bug{linkend}. E se vuoi partecipare, unisciti alla {designteam}nostra squadra di progettazione{linkend}!", + "Appearance and accessibility settings" : "Impostazioni di aspetto e accessibilità", + "Misc accessibility options" : "Altre opzioni di accessibilità ", + "Enable blur background filter (may increase GPU load)" : "Abilita filtro di sfocamento dello sfondo (può aumentare il carico sulla GPU)", + "Customization has been disabled by your administrator" : "La personalizzazione è stata disattivata dall'amministratore", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Imposta un colore primario per evidenziare elementi importanti. Il colore usato per elementi come pulsanti principali può essere leggermente diverso, dato che viene regolato per soddisfare i requisiti di accessibilità.", + "Background and color" : "Sfondo e colore", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Lo sfondo può essere impostato ad un'immagine dal set predefinito, un'immagine caricata a mano, o un colore unico.", + "Keyboard shortcuts" : "Scorciatoie da tastiera", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In alcuni casi le scorciatoie da tastiera possono interferire con gli strumenti di accessibilità. Per concentrarti correttamente sullo strumento, è possibile disattivare tutte le scorciatoie da tastiera. Verranno disattivate anche tutte le scorciatoie disponibili nelle applicazioni.", + "Disable all keyboard shortcuts" : "Disattiva tutte le scorciatoie da tastiera", + "Current selected app: {app}, position {position} of {total}" : "Applicazione attualmente selezionata: {app}, posizione {position} di {total}", + "Move up" : "Sposta su", + "Move down" : "Sposta giù", + "Select a background from your files" : "Seleziona uno sfondo dai tuoi file", + "Select background" : "Seleziona sfondo", + "No background has been selected" : "Nessuno sfondo selezionato", + "Custom background" : "Sfondo personalizzato", + "Plain background" : "Sfondo semplice", + "Default background" : "Sfondo predefinito", + "Theme selection is enforced" : "La selezione del tema è obbligata", + "Could not set the app order" : "Impossibile impostare l'ordine delle applicazioni", + "Could not reset the app order" : "Impossibile ripristinare l'ordine delle applicazioni", + "Navigation bar settings" : "Impostazioni barra di navigazione", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Puoi configurare l'ordine delle applicazioni usato per la barra di navigazione. La prima voce sarà l'applicazione predefinita, aperta dopo l'accesso o quando si fa clic sul logo.", + "The default app can not be changed because it was configured by the administrator." : "L'applicazione predefinita non può essere cambiata perché è stata configurata dall'amministratore.", + "The app order was changed, to see it in action you have to reload the page." : "L'ordine delle applicazioni è stato cambiato, per vedere le modifiche devi ricaricare la pagina.", + "Reset default app order" : "Ripristina ordine predefinito delle applicazioni", + "Could not set primary color" : "Impossibile impostare il colore primario", + "Reset primary color" : "Ripristina colore primario", + "Could not set global default apps" : "Impossibile impostare le app predefinite globali", + "Default app" : "Applicazione predefinita", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "L'applicazione predefinita è quella che viene aperta dopo l'accesso o quando si fa clic sul logo nel menu.", + "Use custom default app" : "Usa app predefinita personalizzata", + "Global default app" : "App predefinita globale", + "Global default apps" : "App predefinite globali", + "Default app priority" : "Priorità app predefinita", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se un'app non è abilitata per un utente, viene usata quella successiva con priorità più bassa.", + "Select a custom color" : "Seleziona un colore personalizzato", + "Reset to default" : "Ripristina valori predefiniti", + "Upload" : "Carica", + "Remove background image" : "Rimuovi immagine di sfondo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accesso universale è molto importante per noi. Seguiamo gli standard web e cerchiamo di rendere tutto utilizzabile anche senza mouse, e programmi di assistenza come i lettori dello schermo. Il nostro obiettivo è la compatibilità con la {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 a livello AA, con il tema ad alto contrasto anche a livello AAA. ", + ". Unable to apply the setting." : "Impossiblie applicare l'impostazione." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ja.js b/apps/theming/l10n/ja.js new file mode 100644 index 00000000000..c995ea41a0a --- /dev/null +++ b/apps/theming/l10n/ja.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "名前が長すぎます", + "The given web address is too long" : "Webアドレスが長すぎます", + "The given web address is not a valid URL" : "指定されたWebアドレスは有効なURLではありません", + "The given legal notice address is too long" : "指定された法的通知アドレスが長すぎます", + "The given legal notice address is not a valid URL" : "指定された法的通知アドレスは有効なURLではありません", + "The given privacy policy address is too long" : "指定された個人情報保護方針のアドレスが長すぎます", + "The given privacy policy address is not a valid URL" : "指定された個人情報保護方針アドレスは有効なURLではありません", + "The given slogan is too long" : "スローガンが長すぎます", + "The given color is invalid" : "無効な色です", + "Disable-user-theming should be true or false" : "Disable-user-themingは、trueまたはfalseで指定してください", + "Saved" : "保存済み", + "Invalid app given" : "無効なアプリが指定されました", + "Invalid type for setting \"defaultApp\" given" : "\"defaultApp\"の設定に無効なタイプが指定されました", + "Invalid setting key" : "無効な設定キー", + "The file was uploaded" : "ファイルがアップロードされました", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "アップロードファイルサイズが、php.ini の upload_max_filesize を超過しています", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています", + "The file was only partially uploaded" : "ファイルは一部分にしかアップロードされていません", + "No file was uploaded" : "ファイルはアップロードされませんでした", + "Missing a temporary folder" : "一時領域フォルダーがありません", + "Could not write file to disk" : "ディスクにファイルを書き込めませんでした", + "A PHP extension stopped the file upload" : "PHP拡張でファイルのアップロードが停止されています", + "No file uploaded" : "ファイルがアップロードされていません", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "あなたはすでにカスタムテーマを使用しています。 テーマ設定の設定が上書きされる可能性があります。", + "Theming" : "テーマ", + "Appearance and accessibility" : "外観とアクセシビリティ", + "PHP Imagick module" : "PHP Imagickモジュール", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "テーマ別アプリは有効ですが、PHPモジュール「imagick」が有効ではありません。ファビコン生成を正しく行うには、このモジュールをインストールし、有効化する必要があります。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "このインスタンス内のPHPモジュール\"imagick\"はSVGをサポートしていません。互換性を高めるために、インストールすることをおすすめします。", + "Dark theme with high contrast mode" : "ハイコントラストモードのダークテーマ", + "Enable dark high contrast mode" : "ハイコントラストモードのダークテーマを有効化", + "Similar to the high contrast mode, but with dark colours." : "暗い色調でのハイコントラストモード", + "Dark theme" : "ダークテーマ", + "Enable dark theme" : "ダークテーマを有効にする", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "全体的な明度と明るさを下げることで目を楽にする暗い色調のテーマ", + "System default theme" : "システムのデフォルトに合わせたテーマ", + "Enable the system default" : "システムデフォルトを有効化", + "Using the default system appearance." : "デフォルトの外観を利用", + "Dyslexia font" : "Dyslexia フォント", + "Enable dyslexia font" : "Dyslexia フォントを有効にする", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexicは、ディスレクシアによって引き起こされる一般的な読み間違いの一部を軽減するためにデザインされた、無料で利用できる書体/フォントです。", + "High contrast mode" : "ハイ・コントラストモード", + "Enable high contrast mode" : "ハイ・コントラストモードを有効にする。", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "操作をわかりやすくするためのハイ・コントラストモード。\n見た目の美しさは低下しますが、明確さが向上します。", + "Light theme" : "ライトテーマ", + "Enable the default light theme" : "デフォルトの明るいテーマを有効化", + "The default light appearance." : "デフォルトの明るい外観", + "Legal notice" : "法的通知", + "Privacy policy" : "個人情報保護方針", + "Adjust the Nextcloud theme" : "Nextcloudテーマを調整する", + "Name" : "名前", + "Web link" : "Webリンク", + "a safe home for all your data" : "あなたのすべてのデータを安全に保管する場所", + "Slogan" : "標語", + "Primary color" : "プライマリカラー", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本色は、重要なボタンなどの要素を強調表示するために使用されます。現在のカラースキーマに応じて若干調整される場合があります。", + "Legal notice link" : "法的通知のリンク", + "Privacy policy link" : "個人情報保護方針のリンク", + "Header logo" : "ヘッダーロゴ", + "Upload new header logo" : "新しいヘッダーロゴをアップロード", + "Favicon" : "Favicon", + "Upload new favicon" : "新しいfaviconをアップロード", + "User settings" : "ユーザー設定", + "Disable user theming" : "ユーザー毎のテーマを無効", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "このサーバーの外観のカスタマイズと画像を変更を変更できますが、さらにユーザーは背景と色を変更できます。外観のカスタマイズを強制する場合は以下のチェック設定をオンにしてください。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "テーマでは、あなたのインスタンスとサポートされたクライアントのルック&フィールを簡単に変更できます。この変更はすべてのユーザーが対象となります。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "背景画像の代わりに、無地の背景色を設定することもできます。背景画像を使用する場合、この色を変更すると、アプリメニューアイコンの色に影響します。", + "Background color" : "背景色", + "Upload new logo" : "新しいロゴをアップロード", + "Logo" : "ロゴ", + "Upload new background and login image" : "新しい背景とログイン画像", + "Background and login image" : "背景とログイン画像", + "Advanced options" : "詳細オプション", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "SVG画像をサポートするPHP拡張機能 ImageMagick をインストールすると、アップロードされたロゴと色に基づいてファビコンを自動生成することができます。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ユニバーサルアクセスは私たちにとって非常に重要なことです。そのためウェブ標準に従い、マウスやスクリーンリーダーなどの支援ソフトウェアが無くても全ての機能をご利用いただけるようにチェックしています。 {linkstart}Webコンテンツアクセシビリティガイドライン{linkend} 2.1 のAAレベルに準拠することを、また、ハイコントラストのテーマを採用することでAAAレベルにまで準拠することを目指しています。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "何か問題を見つけた場合は、{issuetracker}私たちの問題トラッカー{linkend}で遠慮なく報告してください。参加したい場合は、{designteam}私たちのデザイン チーム{linkend}に参加してください!", + "Unable to apply the setting." : "設定を適用できません。", + "Appearance and accessibility settings" : "外観とアクセシビリティの設定", + "Misc accessibility options" : "その他のアクセシビリティオプション", + "Enable blur background filter (may increase GPU load)" : "背景ぼかしフィルターを有効にする (GPU負荷が増加する可能性があります)", + "Customization has been disabled by your administrator" : "カスタマイズは管理者によって無効にされています", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "重要な要素を強調表示するための原色を設定します。主ボタンなどの要素に使用される色は、アクセシビリティ要件を満たすように調整されるため、多少異なる場合があります。", + "Background and color" : "背景と色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景は、既定のセットのイメージ、カスタムアップロードされたイメージ、または無地に設定できます。", + "Keyboard shortcuts" : "キーボードショートカット", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "場合によっては、キーボードショートカットがアクセシビリティツールに干渉することがあります。ツールに正しくフォーカスできるようにするために、ここですべてのキーボード ショートカットを無効にできます。この場合、アプリで使用可能なすべてのショートカットも無効になります。", + "Disable all keyboard shortcuts" : "全てのキーボードショートカットを無効化", + "Current selected app: {app}, position {position} of {total}" : "現在の選択済みアプリ: {app}、{total} の {position} 番目", + "Move up" : "上に移動", + "Move down" : "下に移動", + "Select a background from your files" : "あなたのファイルから背景を選択する", + "Select background" : "背景を選択する", + "No background has been selected" : "選択済みの背景はありません", + "Custom background" : "カスタム背景", + "Plain background" : "シンプルな背景", + "Default background" : "デフォルト背景", + "Theme selection is enforced" : "テーマ選択を強制", + "Could not set the app order" : "アプリの順番を設定できませんでした", + "Could not reset the app order" : "アプリの順番をリセットできませんでした", + "Navigation bar settings" : "ナビゲーションバーの設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "アプリのナビゲーションバーで使用されるアプリの順序を設定できます。最初のエントリは、ログイン後またはロゴをクリックしたときに開かれるデフォルトのアプリになります。", + "The default app can not be changed because it was configured by the administrator." : "デフォルトのアプリは、管理者によって設定されたため変更できません。", + "The app order was changed, to see it in action you have to reload the page." : "アプリの順番が変更されました。それを実際に見るには、ページをリロードする必要があります。", + "Reset default app order" : "デフォルトのアプリの順序をリセットする", + "Could not set primary color" : "プライマリカラーを設定できませんでした", + "Reset primary color" : "プライマリカラーをリセット", + "Could not set global default apps" : "グローバルなデフォルトアプリを設定できなかった", + "Default app" : "デフォルトアプリ", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "デフォルトのアプリは、ログイン後やメニューのロゴをクリックした後に開かれるアプリです。", + "Use custom default app" : "カスタムデフォルトアプリを使用する", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "デフォルトアプリの優先順位", + "If an app is not enabled for a user, the next app with lower priority is used." : "あるアプリがユーザーに対して有効になっていない場合、次の優先順位のアプリが使用されます。", + "Select a custom color" : "カスタムカラーを選択", + "Reset to default" : "デフォルトに戻す", + "Upload" : "アップロード", + "Remove background image" : "背景画像を削除", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ユニバーサルアクセスは私たちにとって非常に重要なことです。そのためウェブ標準に従い、マウスやスクリーンリーダーなどの支援ソフトウェアが無くても全ての機能をご利用いただけるようにチェックしています。AAAレベルのハイコントラストのテーマを採用することで、{guidelines} Webコンテンツアクセシビリティガイドライン2.1 {linkend} のAAAレベルに準拠することを目指しています。", + ". Unable to apply the setting." : "設定を適用できません。" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/ja.json b/apps/theming/l10n/ja.json new file mode 100644 index 00000000000..1ea09903abe --- /dev/null +++ b/apps/theming/l10n/ja.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "名前が長すぎます", + "The given web address is too long" : "Webアドレスが長すぎます", + "The given web address is not a valid URL" : "指定されたWebアドレスは有効なURLではありません", + "The given legal notice address is too long" : "指定された法的通知アドレスが長すぎます", + "The given legal notice address is not a valid URL" : "指定された法的通知アドレスは有効なURLではありません", + "The given privacy policy address is too long" : "指定された個人情報保護方針のアドレスが長すぎます", + "The given privacy policy address is not a valid URL" : "指定された個人情報保護方針アドレスは有効なURLではありません", + "The given slogan is too long" : "スローガンが長すぎます", + "The given color is invalid" : "無効な色です", + "Disable-user-theming should be true or false" : "Disable-user-themingは、trueまたはfalseで指定してください", + "Saved" : "保存済み", + "Invalid app given" : "無効なアプリが指定されました", + "Invalid type for setting \"defaultApp\" given" : "\"defaultApp\"の設定に無効なタイプが指定されました", + "Invalid setting key" : "無効な設定キー", + "The file was uploaded" : "ファイルがアップロードされました", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "アップロードファイルサイズが、php.ini の upload_max_filesize を超過しています", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています", + "The file was only partially uploaded" : "ファイルは一部分にしかアップロードされていません", + "No file was uploaded" : "ファイルはアップロードされませんでした", + "Missing a temporary folder" : "一時領域フォルダーがありません", + "Could not write file to disk" : "ディスクにファイルを書き込めませんでした", + "A PHP extension stopped the file upload" : "PHP拡張でファイルのアップロードが停止されています", + "No file uploaded" : "ファイルがアップロードされていません", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "あなたはすでにカスタムテーマを使用しています。 テーマ設定の設定が上書きされる可能性があります。", + "Theming" : "テーマ", + "Appearance and accessibility" : "外観とアクセシビリティ", + "PHP Imagick module" : "PHP Imagickモジュール", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "テーマ別アプリは有効ですが、PHPモジュール「imagick」が有効ではありません。ファビコン生成を正しく行うには、このモジュールをインストールし、有効化する必要があります。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "このインスタンス内のPHPモジュール\"imagick\"はSVGをサポートしていません。互換性を高めるために、インストールすることをおすすめします。", + "Dark theme with high contrast mode" : "ハイコントラストモードのダークテーマ", + "Enable dark high contrast mode" : "ハイコントラストモードのダークテーマを有効化", + "Similar to the high contrast mode, but with dark colours." : "暗い色調でのハイコントラストモード", + "Dark theme" : "ダークテーマ", + "Enable dark theme" : "ダークテーマを有効にする", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "全体的な明度と明るさを下げることで目を楽にする暗い色調のテーマ", + "System default theme" : "システムのデフォルトに合わせたテーマ", + "Enable the system default" : "システムデフォルトを有効化", + "Using the default system appearance." : "デフォルトの外観を利用", + "Dyslexia font" : "Dyslexia フォント", + "Enable dyslexia font" : "Dyslexia フォントを有効にする", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexicは、ディスレクシアによって引き起こされる一般的な読み間違いの一部を軽減するためにデザインされた、無料で利用できる書体/フォントです。", + "High contrast mode" : "ハイ・コントラストモード", + "Enable high contrast mode" : "ハイ・コントラストモードを有効にする。", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "操作をわかりやすくするためのハイ・コントラストモード。\n見た目の美しさは低下しますが、明確さが向上します。", + "Light theme" : "ライトテーマ", + "Enable the default light theme" : "デフォルトの明るいテーマを有効化", + "The default light appearance." : "デフォルトの明るい外観", + "Legal notice" : "法的通知", + "Privacy policy" : "個人情報保護方針", + "Adjust the Nextcloud theme" : "Nextcloudテーマを調整する", + "Name" : "名前", + "Web link" : "Webリンク", + "a safe home for all your data" : "あなたのすべてのデータを安全に保管する場所", + "Slogan" : "標語", + "Primary color" : "プライマリカラー", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本色は、重要なボタンなどの要素を強調表示するために使用されます。現在のカラースキーマに応じて若干調整される場合があります。", + "Legal notice link" : "法的通知のリンク", + "Privacy policy link" : "個人情報保護方針のリンク", + "Header logo" : "ヘッダーロゴ", + "Upload new header logo" : "新しいヘッダーロゴをアップロード", + "Favicon" : "Favicon", + "Upload new favicon" : "新しいfaviconをアップロード", + "User settings" : "ユーザー設定", + "Disable user theming" : "ユーザー毎のテーマを無効", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "このサーバーの外観のカスタマイズと画像を変更を変更できますが、さらにユーザーは背景と色を変更できます。外観のカスタマイズを強制する場合は以下のチェック設定をオンにしてください。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "テーマでは、あなたのインスタンスとサポートされたクライアントのルック&フィールを簡単に変更できます。この変更はすべてのユーザーが対象となります。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "背景画像の代わりに、無地の背景色を設定することもできます。背景画像を使用する場合、この色を変更すると、アプリメニューアイコンの色に影響します。", + "Background color" : "背景色", + "Upload new logo" : "新しいロゴをアップロード", + "Logo" : "ロゴ", + "Upload new background and login image" : "新しい背景とログイン画像", + "Background and login image" : "背景とログイン画像", + "Advanced options" : "詳細オプション", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "SVG画像をサポートするPHP拡張機能 ImageMagick をインストールすると、アップロードされたロゴと色に基づいてファビコンを自動生成することができます。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ユニバーサルアクセスは私たちにとって非常に重要なことです。そのためウェブ標準に従い、マウスやスクリーンリーダーなどの支援ソフトウェアが無くても全ての機能をご利用いただけるようにチェックしています。 {linkstart}Webコンテンツアクセシビリティガイドライン{linkend} 2.1 のAAレベルに準拠することを、また、ハイコントラストのテーマを採用することでAAAレベルにまで準拠することを目指しています。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "何か問題を見つけた場合は、{issuetracker}私たちの問題トラッカー{linkend}で遠慮なく報告してください。参加したい場合は、{designteam}私たちのデザイン チーム{linkend}に参加してください!", + "Unable to apply the setting." : "設定を適用できません。", + "Appearance and accessibility settings" : "外観とアクセシビリティの設定", + "Misc accessibility options" : "その他のアクセシビリティオプション", + "Enable blur background filter (may increase GPU load)" : "背景ぼかしフィルターを有効にする (GPU負荷が増加する可能性があります)", + "Customization has been disabled by your administrator" : "カスタマイズは管理者によって無効にされています", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "重要な要素を強調表示するための原色を設定します。主ボタンなどの要素に使用される色は、アクセシビリティ要件を満たすように調整されるため、多少異なる場合があります。", + "Background and color" : "背景と色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景は、既定のセットのイメージ、カスタムアップロードされたイメージ、または無地に設定できます。", + "Keyboard shortcuts" : "キーボードショートカット", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "場合によっては、キーボードショートカットがアクセシビリティツールに干渉することがあります。ツールに正しくフォーカスできるようにするために、ここですべてのキーボード ショートカットを無効にできます。この場合、アプリで使用可能なすべてのショートカットも無効になります。", + "Disable all keyboard shortcuts" : "全てのキーボードショートカットを無効化", + "Current selected app: {app}, position {position} of {total}" : "現在の選択済みアプリ: {app}、{total} の {position} 番目", + "Move up" : "上に移動", + "Move down" : "下に移動", + "Select a background from your files" : "あなたのファイルから背景を選択する", + "Select background" : "背景を選択する", + "No background has been selected" : "選択済みの背景はありません", + "Custom background" : "カスタム背景", + "Plain background" : "シンプルな背景", + "Default background" : "デフォルト背景", + "Theme selection is enforced" : "テーマ選択を強制", + "Could not set the app order" : "アプリの順番を設定できませんでした", + "Could not reset the app order" : "アプリの順番をリセットできませんでした", + "Navigation bar settings" : "ナビゲーションバーの設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "アプリのナビゲーションバーで使用されるアプリの順序を設定できます。最初のエントリは、ログイン後またはロゴをクリックしたときに開かれるデフォルトのアプリになります。", + "The default app can not be changed because it was configured by the administrator." : "デフォルトのアプリは、管理者によって設定されたため変更できません。", + "The app order was changed, to see it in action you have to reload the page." : "アプリの順番が変更されました。それを実際に見るには、ページをリロードする必要があります。", + "Reset default app order" : "デフォルトのアプリの順序をリセットする", + "Could not set primary color" : "プライマリカラーを設定できませんでした", + "Reset primary color" : "プライマリカラーをリセット", + "Could not set global default apps" : "グローバルなデフォルトアプリを設定できなかった", + "Default app" : "デフォルトアプリ", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "デフォルトのアプリは、ログイン後やメニューのロゴをクリックした後に開かれるアプリです。", + "Use custom default app" : "カスタムデフォルトアプリを使用する", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "デフォルトアプリの優先順位", + "If an app is not enabled for a user, the next app with lower priority is used." : "あるアプリがユーザーに対して有効になっていない場合、次の優先順位のアプリが使用されます。", + "Select a custom color" : "カスタムカラーを選択", + "Reset to default" : "デフォルトに戻す", + "Upload" : "アップロード", + "Remove background image" : "背景画像を削除", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ユニバーサルアクセスは私たちにとって非常に重要なことです。そのためウェブ標準に従い、マウスやスクリーンリーダーなどの支援ソフトウェアが無くても全ての機能をご利用いただけるようにチェックしています。AAAレベルのハイコントラストのテーマを採用することで、{guidelines} Webコンテンツアクセシビリティガイドライン2.1 {linkend} のAAAレベルに準拠することを目指しています。", + ". Unable to apply the setting." : "設定を適用できません。" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ka.js b/apps/theming/l10n/ka.js new file mode 100644 index 00000000000..88febe7c7fa --- /dev/null +++ b/apps/theming/l10n/ka.js @@ -0,0 +1,107 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given web address is not a valid URL" : "The given web address is not a valid URL", + "The given legal notice address is too long" : "The given legal notice address is too long", + "The given legal notice address is not a valid URL" : "The given legal notice address is not a valid URL", + "The given privacy policy address is too long" : "The given privacy policy address is too long", + "The given privacy policy address is not a valid URL" : "The given privacy policy address is not a valid URL", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given color is invalid", + "Disable-user-theming should be true or false" : "Disable-user-theming should be true or false", + "Saved" : "Saved", + "Invalid app given" : "Invalid app given", + "Invalid type for setting \"defaultApp\" given" : "Invalid type for setting \"defaultApp\" given", + "Invalid setting key" : "Invalid setting key", + "The file was uploaded" : "The file was uploaded", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", + "The file was only partially uploaded" : "The file was only partially uploaded", + "No file was uploaded" : "No file was uploaded", + "Missing a temporary folder" : "Missing a temporary folder", + "Could not write file to disk" : "Could not write file to disk", + "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", + "No file uploaded" : "No file uploaded", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "You are already using a custom theme. Theming app settings might be overwritten by that.", + "Theming" : "Theming", + "Appearance and accessibility" : "Appearance and accessibility", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "Dark theme with high contrast mode" : "Dark theme with high contrast mode", + "Enable dark high contrast mode" : "Enable dark high contrast mode", + "Similar to the high contrast mode, but with dark colours." : "Similar to the high contrast mode, but with dark colours.", + "Dark theme" : "Dark theme", + "Enable dark theme" : "Enable dark theme", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "A dark theme to ease your eyes by reducing the overall luminosity and brightness.", + "System default theme" : "System default theme", + "Enable the system default" : "Enable the system default", + "Using the default system appearance." : "Using the default system appearance.", + "Dyslexia font" : "Dyslexia font", + "Enable dyslexia font" : "Enable dyslexia font", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia.", + "High contrast mode" : "High contrast mode", + "Enable high contrast mode" : "Enable high contrast mode", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.", + "Light theme" : "Light theme", + "Enable the default light theme" : "Enable the default light theme", + "The default light appearance." : "The default light appearance.", + "Legal notice" : "Legal notice", + "Privacy policy" : "Privacy policy", + "Adjust the Nextcloud theme" : "Adjust the Nextcloud theme", + "Name" : "Name", + "Web link" : "Web link", + "a safe home for all your data" : "a safe home for all your data", + "Slogan" : "Slogan", + "Legal notice link" : "Legal notice link", + "Privacy policy link" : "Privacy policy link", + "Header logo" : "Header logo", + "Upload new header logo" : "Upload new header logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload new favicon", + "User settings" : "User settings", + "Disable user theming" : "Disable user theming", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.", + "Upload new logo" : "Upload new logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Background and login image", + "Advanced options" : "Advanced options", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Customization has been disabled by your administrator" : "Customization has been disabled by your administrator", + "Keyboard shortcuts" : "Keyboard shortcuts", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "Disable all keyboard shortcuts", + "Current selected app: {app}, position {position} of {total}" : "Current selected app: {app}, position {position} of {total}", + "Move up" : "Move up", + "Move down" : "Move down", + "Select a background from your files" : "Select a background from your files", + "Select background" : "Select background", + "No background has been selected" : "No background has been selected", + "Custom background" : "Custom background", + "Default background" : "Default background", + "Theme selection is enforced" : "Theme selection is enforced", + "Could not set the app order" : "Could not set the app order", + "Could not reset the app order" : "Could not reset the app order", + "Navigation bar settings" : "Navigation bar settings", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo.", + "The default app can not be changed because it was configured by the administrator." : "The default app can not be changed because it was configured by the administrator.", + "The app order was changed, to see it in action you have to reload the page." : "The app order was changed, to see it in action you have to reload the page.", + "Reset default app order" : "Reset default app order", + "Could not set global default apps" : "Could not set global default apps", + "Default app" : "Default app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.", + "Use custom default app" : "Use custom default app", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "Default app priority", + "If an app is not enabled for a user, the next app with lower priority is used." : "If an app is not enabled for a user, the next app with lower priority is used.", + "Select a custom color" : "Select a custom color", + "Reset to default" : "Reset to default", + "Upload" : "Upload", + "Remove background image" : "Remove background image", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." +}, +"nplurals=2; plural=(n!=1);"); diff --git a/apps/theming/l10n/ka.json b/apps/theming/l10n/ka.json new file mode 100644 index 00000000000..75e4581c082 --- /dev/null +++ b/apps/theming/l10n/ka.json @@ -0,0 +1,105 @@ +{ "translations": { + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given web address is not a valid URL" : "The given web address is not a valid URL", + "The given legal notice address is too long" : "The given legal notice address is too long", + "The given legal notice address is not a valid URL" : "The given legal notice address is not a valid URL", + "The given privacy policy address is too long" : "The given privacy policy address is too long", + "The given privacy policy address is not a valid URL" : "The given privacy policy address is not a valid URL", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given color is invalid", + "Disable-user-theming should be true or false" : "Disable-user-theming should be true or false", + "Saved" : "Saved", + "Invalid app given" : "Invalid app given", + "Invalid type for setting \"defaultApp\" given" : "Invalid type for setting \"defaultApp\" given", + "Invalid setting key" : "Invalid setting key", + "The file was uploaded" : "The file was uploaded", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", + "The file was only partially uploaded" : "The file was only partially uploaded", + "No file was uploaded" : "No file was uploaded", + "Missing a temporary folder" : "Missing a temporary folder", + "Could not write file to disk" : "Could not write file to disk", + "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", + "No file uploaded" : "No file uploaded", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "You are already using a custom theme. Theming app settings might be overwritten by that.", + "Theming" : "Theming", + "Appearance and accessibility" : "Appearance and accessibility", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.", + "Dark theme with high contrast mode" : "Dark theme with high contrast mode", + "Enable dark high contrast mode" : "Enable dark high contrast mode", + "Similar to the high contrast mode, but with dark colours." : "Similar to the high contrast mode, but with dark colours.", + "Dark theme" : "Dark theme", + "Enable dark theme" : "Enable dark theme", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "A dark theme to ease your eyes by reducing the overall luminosity and brightness.", + "System default theme" : "System default theme", + "Enable the system default" : "Enable the system default", + "Using the default system appearance." : "Using the default system appearance.", + "Dyslexia font" : "Dyslexia font", + "Enable dyslexia font" : "Enable dyslexia font", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia.", + "High contrast mode" : "High contrast mode", + "Enable high contrast mode" : "Enable high contrast mode", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.", + "Light theme" : "Light theme", + "Enable the default light theme" : "Enable the default light theme", + "The default light appearance." : "The default light appearance.", + "Legal notice" : "Legal notice", + "Privacy policy" : "Privacy policy", + "Adjust the Nextcloud theme" : "Adjust the Nextcloud theme", + "Name" : "Name", + "Web link" : "Web link", + "a safe home for all your data" : "a safe home for all your data", + "Slogan" : "Slogan", + "Legal notice link" : "Legal notice link", + "Privacy policy link" : "Privacy policy link", + "Header logo" : "Header logo", + "Upload new header logo" : "Upload new header logo", + "Favicon" : "Favicon", + "Upload new favicon" : "Upload new favicon", + "User settings" : "User settings", + "Disable user theming" : "Disable user theming", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.", + "Upload new logo" : "Upload new logo", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Background and login image", + "Advanced options" : "Advanced options", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!", + "Customization has been disabled by your administrator" : "Customization has been disabled by your administrator", + "Keyboard shortcuts" : "Keyboard shortcuts", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.", + "Disable all keyboard shortcuts" : "Disable all keyboard shortcuts", + "Current selected app: {app}, position {position} of {total}" : "Current selected app: {app}, position {position} of {total}", + "Move up" : "Move up", + "Move down" : "Move down", + "Select a background from your files" : "Select a background from your files", + "Select background" : "Select background", + "No background has been selected" : "No background has been selected", + "Custom background" : "Custom background", + "Default background" : "Default background", + "Theme selection is enforced" : "Theme selection is enforced", + "Could not set the app order" : "Could not set the app order", + "Could not reset the app order" : "Could not reset the app order", + "Navigation bar settings" : "Navigation bar settings", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo.", + "The default app can not be changed because it was configured by the administrator." : "The default app can not be changed because it was configured by the administrator.", + "The app order was changed, to see it in action you have to reload the page." : "The app order was changed, to see it in action you have to reload the page.", + "Reset default app order" : "Reset default app order", + "Could not set global default apps" : "Could not set global default apps", + "Default app" : "Default app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.", + "Use custom default app" : "Use custom default app", + "Global default app" : "Global default app", + "Global default apps" : "Global default apps", + "Default app priority" : "Default app priority", + "If an app is not enabled for a user, the next app with lower priority is used." : "If an app is not enabled for a user, the next app with lower priority is used.", + "Select a custom color" : "Select a custom color", + "Reset to default" : "Reset to default", + "Upload" : "Upload", + "Remove background image" : "Remove background image", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." +},"pluralForm" :"nplurals=2; plural=(n!=1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ko.js b/apps/theming/l10n/ko.js new file mode 100644 index 00000000000..db70d350a82 --- /dev/null +++ b/apps/theming/l10n/ko.js @@ -0,0 +1,90 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "입력한 이름이 너무 김", + "The given web address is too long" : "입력한 웹 주소가 너무 김", + "The given legal notice address is too long" : "입력한 법적 고지가 너무 김", + "The given privacy policy address is too long" : "입력한 개인 정보 취급 방침 주소가 너무 김", + "The given slogan is too long" : "입력한 슬로건이 너무 김", + "The given color is invalid" : "입력한 색상이 잘못됨", + "Saved" : "저장됨", + "The file was uploaded" : "파일을 업로드함", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "업로드한 파일의 크기가 php.ini의 upload_max_filesize를 초과함", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "업로드한 파일의 크기가 HTML 폼에 지정한 MAX_FILE_SIZE를 초과함", + "The file was only partially uploaded" : "파일이 일부분만 업로드됨", + "No file was uploaded" : "업로드한 파일 없음", + "Missing a temporary folder" : "임시 폴더 없음", + "Could not write file to disk" : "디스크에 파일을 쓸 수 없음", + "A PHP extension stopped the file upload" : "PHP 확장 기능에서 파일 업로드를 차단함", + "No file uploaded" : "업로드한 파일 없음", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "사용자 정의 테마를 사용하고 있습니다. 테마 앱에서 해당 설정을 덮어쓸 수 있습니다.", + "Theming" : "테마", + "Appearance and accessibility" : "외형과 접근성", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "테마 앱이 활성화되었으나, PHP 모듈 “imagick”이 활성화되지 않았습니다. 파비콘 생성을 위해 해당 모듈을 설치하고 활성화하십시오.", + "Dark theme with high contrast mode" : "고대비 모드의 어두운 테마", + "Enable dark high contrast mode" : "고대비 모드의 어두운 테마 활성화", + "Similar to the high contrast mode, but with dark colours." : "고대비 모드와 비슷하지만, 어두운 색을 사용합니다.", + "Dark theme" : "어두운 테마", + "Enable dark theme" : "어두운 테마 활성화", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "어두운 테마는 전체적인 광량을 줄여 사용자의 눈을 편안하게 합니다.", + "System default theme" : "시스템 기본 테마", + "Enable the system default" : "시스템 기본 테마 활성화", + "Using the default system appearance." : "시스템 기본 테마 사용", + "Dyslexia font" : "난독증용 글꼴", + "Enable dyslexia font" : "난독증용 글꼴 활성화", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic은 난독증 때문에 읽기에 문제가 있는 사람들을 위해 디자인된 자유 글꼴입니다.", + "High contrast mode" : "고대비 모드", + "Enable high contrast mode" : "고대비 모드 활성화", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "쉬운 탐색을 위한 고대비 테마입니다. 색감이 나빠지지만 더 선명해집니다.", + "Light theme" : "밝은 테마", + "Enable the default light theme" : "기본 밝은 테마 활성화", + "The default light appearance." : "기본 라이트 테마", + "Legal notice" : "법적 고지", + "Privacy policy" : "개인 정보 취급 방침", + "Adjust the Nextcloud theme" : "Nextcloud 테마 사용자 정의", + "Name" : "이름", + "Web link" : "웹 링크", + "a safe home for all your data" : "내 모든 데이터 안전 저장소", + "Slogan" : "슬로건", + "Legal notice link" : "법적 고지 링크", + "Privacy policy link" : "개인 정보 취급 방침 링크", + "Header logo" : "머리글 로고", + "Upload new header logo" : "새 머리글 로고 업로드", + "Favicon" : "파비콘", + "Upload new favicon" : "새 파비콘 업로드", + "User settings" : "사용자 설정", + "Disable user theming" : "사용자 테마 설정 권한 비활성화", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "관리자의 테마 설정과 무관하게, 각 사용자는 해당 계정의 배경과 색상을 변경할 수 있습니다. 지정한 테마를 강제하고자 할 경우 이 토글을 켜십시오.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "테마를 사용하여 내 인스턴스와 지원하는 클라이언트의 모습을 변경할 수 있습니다. 테마는 모든 사용자에게 적용됩니다.", + "Upload new logo" : "새 로고 업로드", + "Logo" : "로고", + "Advanced options" : "고급 설정", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "사용 중 문제가 발생했을 경우, {issuetracker}이슈 트래커{linkend}에 보고해주시기 바랍니다. 또한 디자인 부분에 참여하고 싶다면, {designteam}저희 디자인 팀{linkend}과 함께해주세요!", + "Appearance and accessibility settings" : "외형과 접근성 설정", + "Keyboard shortcuts" : "키보드 단축키", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "특정 상황에서, 키보드 단축키는 접근성 도구의 동작과 간섭을 일으킬 수 있습니다. 간섭 방지와 접근성 도구의 정확한 동작을 위해, 이곳에서 모든 키보드 단축키를 비활성화할 수 있습니다. 이는 앱에서 사용할 수 있는 모든 단축키 또한 비활성화합니다.", + "Disable all keyboard shortcuts" : "모든 키보드 단축키 비활성화", + "Move up" : "위로 이동", + "Move down" : "아래로 이동", + "No background has been selected" : "'배경화면 없음'이 선택됨", + "Custom background" : "나만의 배경화면", + "Plain background" : "일반 배경", + "Default background" : "기본 배경", + "Theme selection is enforced" : "테마가 강제로 선택됨", + "Navigation bar settings" : "내비게이션 바 설정", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "내비게이션 바의 앱 순서를 설정할 수 있습니다. 첫번째로 배치된 앱이 로그인 후 또는 로고를 클릭할 경우 열릴 기본 앱으로 지정됩니다.", + "The default app can not be changed because it was configured by the administrator." : "관리자 설정으로 인해 기본 앱을 변경할 수 없습니다.", + "Reset default app order" : "기본 앱 순서 초기화", + "Could not set global default apps" : "모든 계정에 적용될 기본 앱을 적용할 수 없음", + "Default app" : "기본 앱", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "기본 앱은 로그인 직후 또는 상단 로고 클릭시 열리는 앱입니다. ", + "Use custom default app" : "기본 앱 지정", + "Global default app" : "모든 계정에 적용될 기본 앱 지정", + "Global default apps" : "모든 계정에 적용될 기본 앱", + "Default app priority" : "기본 앱 우선순위", + "Reset to default" : "기본값으로 초기화", + "Upload" : "업로드", + "Remove background image" : "배경 그림 삭제", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "보편적 접근성은 매우 중요합니다. 저희는 웹 표준을 준수하며, 마우스 혹은 스크린리더와 같은 보조 소프트웨어 없이도 정상적인 사용이 가능한지에 대해 확인하고 있습니다. 또한, {guidelines}웹 콘텐츠 접근성 가이드라인{linkend} 2.1을 AA 수준 및 AAA 수준의 고대비 테마에서 준수하기 위해 노력하고 있습니다. " +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/ko.json b/apps/theming/l10n/ko.json new file mode 100644 index 00000000000..a450194dd07 --- /dev/null +++ b/apps/theming/l10n/ko.json @@ -0,0 +1,88 @@ +{ "translations": { + "The given name is too long" : "입력한 이름이 너무 김", + "The given web address is too long" : "입력한 웹 주소가 너무 김", + "The given legal notice address is too long" : "입력한 법적 고지가 너무 김", + "The given privacy policy address is too long" : "입력한 개인 정보 취급 방침 주소가 너무 김", + "The given slogan is too long" : "입력한 슬로건이 너무 김", + "The given color is invalid" : "입력한 색상이 잘못됨", + "Saved" : "저장됨", + "The file was uploaded" : "파일을 업로드함", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "업로드한 파일의 크기가 php.ini의 upload_max_filesize를 초과함", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "업로드한 파일의 크기가 HTML 폼에 지정한 MAX_FILE_SIZE를 초과함", + "The file was only partially uploaded" : "파일이 일부분만 업로드됨", + "No file was uploaded" : "업로드한 파일 없음", + "Missing a temporary folder" : "임시 폴더 없음", + "Could not write file to disk" : "디스크에 파일을 쓸 수 없음", + "A PHP extension stopped the file upload" : "PHP 확장 기능에서 파일 업로드를 차단함", + "No file uploaded" : "업로드한 파일 없음", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "사용자 정의 테마를 사용하고 있습니다. 테마 앱에서 해당 설정을 덮어쓸 수 있습니다.", + "Theming" : "테마", + "Appearance and accessibility" : "외형과 접근성", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "테마 앱이 활성화되었으나, PHP 모듈 “imagick”이 활성화되지 않았습니다. 파비콘 생성을 위해 해당 모듈을 설치하고 활성화하십시오.", + "Dark theme with high contrast mode" : "고대비 모드의 어두운 테마", + "Enable dark high contrast mode" : "고대비 모드의 어두운 테마 활성화", + "Similar to the high contrast mode, but with dark colours." : "고대비 모드와 비슷하지만, 어두운 색을 사용합니다.", + "Dark theme" : "어두운 테마", + "Enable dark theme" : "어두운 테마 활성화", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "어두운 테마는 전체적인 광량을 줄여 사용자의 눈을 편안하게 합니다.", + "System default theme" : "시스템 기본 테마", + "Enable the system default" : "시스템 기본 테마 활성화", + "Using the default system appearance." : "시스템 기본 테마 사용", + "Dyslexia font" : "난독증용 글꼴", + "Enable dyslexia font" : "난독증용 글꼴 활성화", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic은 난독증 때문에 읽기에 문제가 있는 사람들을 위해 디자인된 자유 글꼴입니다.", + "High contrast mode" : "고대비 모드", + "Enable high contrast mode" : "고대비 모드 활성화", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "쉬운 탐색을 위한 고대비 테마입니다. 색감이 나빠지지만 더 선명해집니다.", + "Light theme" : "밝은 테마", + "Enable the default light theme" : "기본 밝은 테마 활성화", + "The default light appearance." : "기본 라이트 테마", + "Legal notice" : "법적 고지", + "Privacy policy" : "개인 정보 취급 방침", + "Adjust the Nextcloud theme" : "Nextcloud 테마 사용자 정의", + "Name" : "이름", + "Web link" : "웹 링크", + "a safe home for all your data" : "내 모든 데이터 안전 저장소", + "Slogan" : "슬로건", + "Legal notice link" : "법적 고지 링크", + "Privacy policy link" : "개인 정보 취급 방침 링크", + "Header logo" : "머리글 로고", + "Upload new header logo" : "새 머리글 로고 업로드", + "Favicon" : "파비콘", + "Upload new favicon" : "새 파비콘 업로드", + "User settings" : "사용자 설정", + "Disable user theming" : "사용자 테마 설정 권한 비활성화", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "관리자의 테마 설정과 무관하게, 각 사용자는 해당 계정의 배경과 색상을 변경할 수 있습니다. 지정한 테마를 강제하고자 할 경우 이 토글을 켜십시오.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "테마를 사용하여 내 인스턴스와 지원하는 클라이언트의 모습을 변경할 수 있습니다. 테마는 모든 사용자에게 적용됩니다.", + "Upload new logo" : "새 로고 업로드", + "Logo" : "로고", + "Advanced options" : "고급 설정", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "사용 중 문제가 발생했을 경우, {issuetracker}이슈 트래커{linkend}에 보고해주시기 바랍니다. 또한 디자인 부분에 참여하고 싶다면, {designteam}저희 디자인 팀{linkend}과 함께해주세요!", + "Appearance and accessibility settings" : "외형과 접근성 설정", + "Keyboard shortcuts" : "키보드 단축키", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "특정 상황에서, 키보드 단축키는 접근성 도구의 동작과 간섭을 일으킬 수 있습니다. 간섭 방지와 접근성 도구의 정확한 동작을 위해, 이곳에서 모든 키보드 단축키를 비활성화할 수 있습니다. 이는 앱에서 사용할 수 있는 모든 단축키 또한 비활성화합니다.", + "Disable all keyboard shortcuts" : "모든 키보드 단축키 비활성화", + "Move up" : "위로 이동", + "Move down" : "아래로 이동", + "No background has been selected" : "'배경화면 없음'이 선택됨", + "Custom background" : "나만의 배경화면", + "Plain background" : "일반 배경", + "Default background" : "기본 배경", + "Theme selection is enforced" : "테마가 강제로 선택됨", + "Navigation bar settings" : "내비게이션 바 설정", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "내비게이션 바의 앱 순서를 설정할 수 있습니다. 첫번째로 배치된 앱이 로그인 후 또는 로고를 클릭할 경우 열릴 기본 앱으로 지정됩니다.", + "The default app can not be changed because it was configured by the administrator." : "관리자 설정으로 인해 기본 앱을 변경할 수 없습니다.", + "Reset default app order" : "기본 앱 순서 초기화", + "Could not set global default apps" : "모든 계정에 적용될 기본 앱을 적용할 수 없음", + "Default app" : "기본 앱", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "기본 앱은 로그인 직후 또는 상단 로고 클릭시 열리는 앱입니다. ", + "Use custom default app" : "기본 앱 지정", + "Global default app" : "모든 계정에 적용될 기본 앱 지정", + "Global default apps" : "모든 계정에 적용될 기본 앱", + "Default app priority" : "기본 앱 우선순위", + "Reset to default" : "기본값으로 초기화", + "Upload" : "업로드", + "Remove background image" : "배경 그림 삭제", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "보편적 접근성은 매우 중요합니다. 저희는 웹 표준을 준수하며, 마우스 혹은 스크린리더와 같은 보조 소프트웨어 없이도 정상적인 사용이 가능한지에 대해 확인하고 있습니다. 또한, {guidelines}웹 콘텐츠 접근성 가이드라인{linkend} 2.1을 AA 수준 및 AAA 수준의 고대비 테마에서 준수하기 위해 노력하고 있습니다. " +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/lt_LT.js b/apps/theming/l10n/lt_LT.js new file mode 100644 index 00000000000..40031003879 --- /dev/null +++ b/apps/theming/l10n/lt_LT.js @@ -0,0 +1,73 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Nurodytas pavadinimas yra per ilgas", + "The given web address is too long" : "Nurodytas adresas yra per ilgas", + "The given web address is not a valid URL" : "Nurodytas saityno adresas nėra teisingas URL", + "The given legal notice address is too long" : "Nurodytas teisinio pranešimo adresas yra per ilgas", + "The given legal notice address is not a valid URL" : "Nurodytas teisinio pranešimo adresas nėra teisingas URL", + "The given privacy policy address is too long" : "Nurodytas privatumo politikos adresas yra per ilgas", + "The given privacy policy address is not a valid URL" : "Nurodytas privatumo politikos adresas nėra teisingas URL", + "The given slogan is too long" : "Nurodytas šūkis yra per ilgas", + "The given color is invalid" : "Nurodyta spalva yra neteisinga", + "Saved" : "Įrašyta", + "The file was uploaded" : "Failas buvo įkeltas", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Įkeliamas failas viršija upload_max_filesize direktyvą, esančią faile php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Įkeliamas failas viršija MAX_FILE_SIZE direktyvą, kuri buvo nurodyta HTML formoje", + "The file was only partially uploaded" : "Failas buvo tik dalinai įkeltas", + "No file was uploaded" : "Nebuvo įkeltas joks failas", + "Missing a temporary folder" : "Trūksta laikinojo aplanko", + "Could not write file to disk" : "Nepavyko įrašyti failą į diską", + "A PHP extension stopped the file upload" : "PHP plėtinys sustabdė failo įkėlimą", + "No file uploaded" : "Neįkeltas joks failas", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Jūs jau naudojate tinkintą apipavidalinimą. Apipavidalinimo programėlės nustatymai gali būti perrašyti to apipavidalinimo.", + "Theming" : "Apipavidalinimas", + "Appearance and accessibility" : "Išvaizda ir prieinamumas", + "Dark theme with high contrast mode" : "Tamsus apipavidalinimas su didelio kontrasto veiksena", + "Enable dark high contrast mode" : "Įjungti tamsią didelio kontrasto veikseną", + "Similar to the high contrast mode, but with dark colours." : "Panaši į didelio kontrasto veikseną, tik su tamsiomis spalvomis.", + "Dark theme" : "Tamsus apipavidalinimas", + "Enable dark theme" : "Įjungti tamsų apipavidalinimą", + "System default theme" : "Sistemos numatytasis apipavidalinimas", + "Enable the system default" : "Įjungti sistemos numatytąjį", + "Using the default system appearance." : "Naudojama numatytoji sistemos išvaizda.", + "Dyslexia font" : "Disleksijos šriftas", + "Enable dyslexia font" : "Įjungti disleksijos šriftą", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic yra laisvas šriftas, sukurtas sumažinti kai kurias dažniausias disleksijos sukeltas skaitymo klaidas.", + "High contrast mode" : "Didelio kontrasto veiksena", + "Enable high contrast mode" : "Įjungti didelio kontrasto veikseną", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Didelio kontrasto veiksena, skirta palengvinti jūsų naršymą. Vaizdinė kokybė bus sumažinta, tačiau aiškumas bus padidintas.", + "Light theme" : "Šviesus apipavidalinimas", + "Enable the default light theme" : "Įjungti numatytąjį šviesų apipavidalinimą", + "The default light appearance." : "Numatytasis šviesus apipavidalinimas.", + "Legal notice" : "Teisinis pranešimas", + "Privacy policy" : "Privatumo politika", + "Adjust the Nextcloud theme" : "Derinti Nextcloud apipavidalinimą", + "Name" : "Pavadinimas", + "Web link" : "Internetinė nuoroda", + "a safe home for all your data" : "saugūs namai visiems jūsų duomenims", + "Slogan" : "Šūkis", + "Legal notice link" : "Teisinio pranešimo nuoroda", + "Privacy policy link" : "Privatumo politikos nuoroda", + "Header logo" : "Antraštės logotipas", + "Upload new header logo" : "Įkelti naują antraštės logotipą", + "Favicon" : "Svetainės piktograma", + "Upload new favicon" : "Įkelti naują svetainės piktogramą", + "User settings" : "Naudotojo nustatymai", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Apipavidalinimai leidžia lengvai tinkinti jūsų egzemplioriaus ir palaikomų klientų išvaizdą bei turinį. Tai bus matoma visiems naudotojams.", + "Upload new logo" : "Įkelti naują logotipą", + "Logo" : "Logotipas", + "Advanced options" : "Išplėstinės parinktys", + "Customization has been disabled by your administrator" : "Administratorius yra išjungęs tinkinimus", + "Keyboard shortcuts" : "Spartieji klavišai", + "Move up" : "Pakelti", + "Move down" : "Nuleisti", + "Custom background" : "Tinkintas fonas", + "Plain background" : "Vientisas fonas", + "Default background" : "Numatytasis fonas", + "Reset to default" : "Atstatyti į numatytąjį", + "Upload" : "Įkelti", + "Remove background image" : "Šalinti foninį paveikslą", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Mums universalioji prieiga yra labai svarbi. Mes sekame saityno standartus ir stengiamės, kad būtų galima viskuobe pelės ir pagalbinės programinės įrangos, tokios kaip ekrano skaitytuvė. Stengiamės atitikti {guidelines}Saityno turinio prieinamumo gairėms{linkend} 2.1 pagal AA lygmenį, o su didelio kontrasto apipavidalinimu netgi pagal AAA lygmenį." +}, +"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/theming/l10n/lt_LT.json b/apps/theming/l10n/lt_LT.json new file mode 100644 index 00000000000..b11ac2a0413 --- /dev/null +++ b/apps/theming/l10n/lt_LT.json @@ -0,0 +1,71 @@ +{ "translations": { + "The given name is too long" : "Nurodytas pavadinimas yra per ilgas", + "The given web address is too long" : "Nurodytas adresas yra per ilgas", + "The given web address is not a valid URL" : "Nurodytas saityno adresas nėra teisingas URL", + "The given legal notice address is too long" : "Nurodytas teisinio pranešimo adresas yra per ilgas", + "The given legal notice address is not a valid URL" : "Nurodytas teisinio pranešimo adresas nėra teisingas URL", + "The given privacy policy address is too long" : "Nurodytas privatumo politikos adresas yra per ilgas", + "The given privacy policy address is not a valid URL" : "Nurodytas privatumo politikos adresas nėra teisingas URL", + "The given slogan is too long" : "Nurodytas šūkis yra per ilgas", + "The given color is invalid" : "Nurodyta spalva yra neteisinga", + "Saved" : "Įrašyta", + "The file was uploaded" : "Failas buvo įkeltas", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Įkeliamas failas viršija upload_max_filesize direktyvą, esančią faile php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Įkeliamas failas viršija MAX_FILE_SIZE direktyvą, kuri buvo nurodyta HTML formoje", + "The file was only partially uploaded" : "Failas buvo tik dalinai įkeltas", + "No file was uploaded" : "Nebuvo įkeltas joks failas", + "Missing a temporary folder" : "Trūksta laikinojo aplanko", + "Could not write file to disk" : "Nepavyko įrašyti failą į diską", + "A PHP extension stopped the file upload" : "PHP plėtinys sustabdė failo įkėlimą", + "No file uploaded" : "Neįkeltas joks failas", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Jūs jau naudojate tinkintą apipavidalinimą. Apipavidalinimo programėlės nustatymai gali būti perrašyti to apipavidalinimo.", + "Theming" : "Apipavidalinimas", + "Appearance and accessibility" : "Išvaizda ir prieinamumas", + "Dark theme with high contrast mode" : "Tamsus apipavidalinimas su didelio kontrasto veiksena", + "Enable dark high contrast mode" : "Įjungti tamsią didelio kontrasto veikseną", + "Similar to the high contrast mode, but with dark colours." : "Panaši į didelio kontrasto veikseną, tik su tamsiomis spalvomis.", + "Dark theme" : "Tamsus apipavidalinimas", + "Enable dark theme" : "Įjungti tamsų apipavidalinimą", + "System default theme" : "Sistemos numatytasis apipavidalinimas", + "Enable the system default" : "Įjungti sistemos numatytąjį", + "Using the default system appearance." : "Naudojama numatytoji sistemos išvaizda.", + "Dyslexia font" : "Disleksijos šriftas", + "Enable dyslexia font" : "Įjungti disleksijos šriftą", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic yra laisvas šriftas, sukurtas sumažinti kai kurias dažniausias disleksijos sukeltas skaitymo klaidas.", + "High contrast mode" : "Didelio kontrasto veiksena", + "Enable high contrast mode" : "Įjungti didelio kontrasto veikseną", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Didelio kontrasto veiksena, skirta palengvinti jūsų naršymą. Vaizdinė kokybė bus sumažinta, tačiau aiškumas bus padidintas.", + "Light theme" : "Šviesus apipavidalinimas", + "Enable the default light theme" : "Įjungti numatytąjį šviesų apipavidalinimą", + "The default light appearance." : "Numatytasis šviesus apipavidalinimas.", + "Legal notice" : "Teisinis pranešimas", + "Privacy policy" : "Privatumo politika", + "Adjust the Nextcloud theme" : "Derinti Nextcloud apipavidalinimą", + "Name" : "Pavadinimas", + "Web link" : "Internetinė nuoroda", + "a safe home for all your data" : "saugūs namai visiems jūsų duomenims", + "Slogan" : "Šūkis", + "Legal notice link" : "Teisinio pranešimo nuoroda", + "Privacy policy link" : "Privatumo politikos nuoroda", + "Header logo" : "Antraštės logotipas", + "Upload new header logo" : "Įkelti naują antraštės logotipą", + "Favicon" : "Svetainės piktograma", + "Upload new favicon" : "Įkelti naują svetainės piktogramą", + "User settings" : "Naudotojo nustatymai", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Apipavidalinimai leidžia lengvai tinkinti jūsų egzemplioriaus ir palaikomų klientų išvaizdą bei turinį. Tai bus matoma visiems naudotojams.", + "Upload new logo" : "Įkelti naują logotipą", + "Logo" : "Logotipas", + "Advanced options" : "Išplėstinės parinktys", + "Customization has been disabled by your administrator" : "Administratorius yra išjungęs tinkinimus", + "Keyboard shortcuts" : "Spartieji klavišai", + "Move up" : "Pakelti", + "Move down" : "Nuleisti", + "Custom background" : "Tinkintas fonas", + "Plain background" : "Vientisas fonas", + "Default background" : "Numatytasis fonas", + "Reset to default" : "Atstatyti į numatytąjį", + "Upload" : "Įkelti", + "Remove background image" : "Šalinti foninį paveikslą", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Mums universalioji prieiga yra labai svarbi. Mes sekame saityno standartus ir stengiamės, kad būtų galima viskuobe pelės ir pagalbinės programinės įrangos, tokios kaip ekrano skaitytuvė. Stengiamės atitikti {guidelines}Saityno turinio prieinamumo gairėms{linkend} 2.1 pagal AA lygmenį, o su didelio kontrasto apipavidalinimu netgi pagal AAA lygmenį." +},"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/mk.js b/apps/theming/l10n/mk.js new file mode 100644 index 00000000000..2fb8dc9710e --- /dev/null +++ b/apps/theming/l10n/mk.js @@ -0,0 +1,112 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Зададеното име е премногу долго", + "The given web address is too long" : "Зададената веб страна е премногу долга", + "The given web address is not a valid URL" : "Зададената веб страна нема валидна URL адреса", + "The given legal notice address is too long" : "Зададената адреса за правно известување е премногу долга", + "The given legal notice address is not a valid URL" : "Зададената URL адреса за правно известување не е валидна", + "The given privacy policy address is too long" : "Зададената адреса за политика за приватност е премногу долга", + "The given privacy policy address is not a valid URL" : "Зададената URL адреса за политика за приватност не е валидна", + "The given slogan is too long" : "Зададениот слоган е премногу долг", + "The given color is invalid" : "Зададената боја не е валидна", + "Saved" : "Зачувано", + "The file was uploaded" : "Датотеката е прикачена", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата", + "The file was only partially uploaded" : "Датотеката беше само делумно прикачена", + "No file was uploaded" : "Нема прикачено дадотека", + "Missing a temporary folder" : "Недостасува привремена папка", + "Could not write file to disk" : "Неможе да се запишува на дискот", + "A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката", + "No file uploaded" : "Нема прикачено дадотека", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Веќе користите сопствена тема. Апликацијата за сопствена тема може да ја пребрише истата.", + "Theming" : "Теми", + "Appearance and accessibility" : "Изглед и пристапност", + "Dark theme with high contrast mode" : "Темна тема со режим на висок контраст", + "Enable dark high contrast mode" : "Овозможи темен режим со висок контраст", + "Similar to the high contrast mode, but with dark colours." : "Слично на режимот со висок контраст, но со темни бои.", + "Dark theme" : "Темна тема", + "Enable dark theme" : "Овозможи темна тема", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темна тема за олеснување на вашите очи со намалување на целокупниот сјај и осветленост.", + "System default theme" : "Стандардна тема", + "Enable the system default" : "Овозможи стандардна тема", + "Using the default system appearance." : "Го користи стандардниот изглед.", + "Dyslexia font" : "Фонт за дислексија", + "Enable dyslexia font" : "Овозможи фонт за дислексија", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е бесплатен фонт дизајниран за ублажување на некои од честите грешки во читањето предизвикани од дислексија.", + "High contrast mode" : "Режим на висок контраст", + "Enable high contrast mode" : "Овозможи режим на висок контраст", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим со висок контраст за олеснување на навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Овозможи стандардна светла тема", + "The default light appearance." : "Стандарден светло изглед.", + "Legal notice" : "Правно известување", + "Privacy policy" : "Политика за приватност", + "Adjust the Nextcloud theme" : "Прилагодување на темата за Nextcloud", + "Name" : "Име", + "Web link" : "Веб страна", + "a safe home for all your data" : "безбеден дом за сите ваши податоци", + "Slogan" : "Слоган", + "Primary color" : "Примарна боја", + "Legal notice link" : "Правно известување", + "Privacy policy link" : "Политика за приватност", + "Header logo" : "Лого на заглавие", + "Upload new header logo" : "Прикачи ново лого на заглавие", + "Favicon" : "Фавикон", + "Upload new favicon" : "Прикачи нов Фавикон", + "User settings" : "Кориснички параметри", + "Disable user theming" : "Оневозможи кориснички теми", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Иако можете да изберете и да ја прилагодите вашата истанца, корисниците можат да ја менуваат нивната позадина и бои. Ако сакате да го наметнете вашето прилагодување, можете да го вклучите ова.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темата овозможува можно полесно прилагодување на изгледот и чувството на вашите истанци и поддржани клиенти. Ова ќе биде видливо за сите корисници.", + "Background color" : "Боја на позадина", + "Upload new logo" : "Прикачи ново лого", + "Logo" : "Лого", + "Upload new background and login image" : "Прикачи нова позадина и слика на страната за најавување", + "Background and login image" : "Позадина и слика на страната за најавување", + "Advanced options" : "Напредни опции", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирај ImageMagick додаток за PHP со што ќе се овозможи поддршка за SVG сликите автоматски да генерираат Фавикон базирано на прикаченото лого и боја.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Доколку наидете на некој проблем, не се двоумете и пријавете го на {issuetracker} {linkend}. И доколку сакате можете да се приклучите кон нашиот {designteam} {linkend}!", + "Appearance and accessibility settings" : "Поставки за изглед и пристапност", + "Misc accessibility options" : "Разни опции за пристапност", + "Enable blur background filter (may increase GPU load)" : "Овозможи филтер за замаглување на позадината (може да го зголеми оптоварувањето на графичкиот процесор)", + "Customization has been disabled by your administrator" : "Уредувањето е оневозможено од администраторот", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Поставете примарна боја за да ги нагласите важните елементи. Бојата што се користи за елементи како што се примарните копчиња може малку да се разликува бидејќи се прилагодува за да ги исполни барањата за пристапност.", + "Background and color" : "Позадина и боја", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Позадината може да се постави од слика на стандардниот сет, Сопствена слика или обична боја.", + "Keyboard shortcuts" : "Кратенки преку тастатура", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Во некои случаи, кратенките на тастатурата може да се мешаат со алатките за пристапност. За да овозможите правилно фокусирање на вашата алатка, можете да ги оневозможите сите кратенки на тастатурата овде. Ова исто така ќе ги оневозможи сите достапни кратенки во апликациите.", + "Disable all keyboard shortcuts" : "Оневозможи ги сите кратенки преку тастатурата", + "Move up" : "Помести горе", + "Move down" : "Помести доле", + "Select a background from your files" : "Избери позадина од датотеките", + "Select background" : "Избери позадина", + "No background has been selected" : "Нема избрано позадина", + "Custom background" : "Сопствена позадина", + "Plain background" : "Обична позадина", + "Default background" : "Стандардна позадина", + "Theme selection is enforced" : "Наметнат е избор на тема", + "Could not set the app order" : "Не може да се постави редоследот на апликации", + "Could not reset the app order" : "Не може да се ресетира редоследот на апликации", + "Navigation bar settings" : "Поставки на лентата за навигација", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Можете да го конфигурирате редоследот на апликациите што се користи за лентата за навигација. Првиот запис ќе биде стандардната апликација, отворена по најавувањето или при кликнување на логото.", + "The default app can not be changed because it was configured by the administrator." : "Стандардната апликација не може да се смени бидејќи е конфигурирана од администраторот.", + "The app order was changed, to see it in action you have to reload the page." : "Редоследот на апликацијата е променет, за да го видите во акција, треба повторно да ја вчитате страницата.", + "Reset default app order" : "Ресетирај го стандардниот редослед на апликации", + "Could not set primary color" : "Не може да се постави примарна боја", + "Reset primary color" : "Ресетирај примарна боја", + "Could not set global default apps" : "Не може да се постават глобалните стандардни апликации", + "Default app" : "Стандардна апликација", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Стандардната апликација е апликацијата што е на пр. се отвора по најавувањето или кога ќе се кликне на логото во менито.", + "Use custom default app" : "Користи приспособена стандардна апликација", + "Global default app" : "Глобална стандардна апликација", + "Global default apps" : "Глобална стандардна апликација", + "Default app priority" : "Стандарден приоритет на апликацијата", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ако некоја апликација не е овозможена за корисник, се користи следната апликација со помал приоритет.", + "Select a custom color" : "Избери боја", + "Reset to default" : "Ресетирај на стандардно", + "Upload" : "Прикачи", + "Remove background image" : "Избриши ја позадинската слика", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзалниот пристап е многу важен за нас. Ние ги следиме веб-стандардите и ги имплементираме за да го направиме користењето попристапно, како користење без маус, и помошни апликации за читање на екранот. Наша цел е да бидеме во согласност со {guidelines} {linkend}2.1 на ниво АА, со висока контрастна тема дури и на ниво на ААА." +}, +"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/theming/l10n/mk.json b/apps/theming/l10n/mk.json new file mode 100644 index 00000000000..6cf4a674311 --- /dev/null +++ b/apps/theming/l10n/mk.json @@ -0,0 +1,110 @@ +{ "translations": { + "The given name is too long" : "Зададеното име е премногу долго", + "The given web address is too long" : "Зададената веб страна е премногу долга", + "The given web address is not a valid URL" : "Зададената веб страна нема валидна URL адреса", + "The given legal notice address is too long" : "Зададената адреса за правно известување е премногу долга", + "The given legal notice address is not a valid URL" : "Зададената URL адреса за правно известување не е валидна", + "The given privacy policy address is too long" : "Зададената адреса за политика за приватност е премногу долга", + "The given privacy policy address is not a valid URL" : "Зададената URL адреса за политика за приватност не е валидна", + "The given slogan is too long" : "Зададениот слоган е премногу долг", + "The given color is invalid" : "Зададената боја не е валидна", + "Saved" : "Зачувано", + "The file was uploaded" : "Датотеката е прикачена", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата", + "The file was only partially uploaded" : "Датотеката беше само делумно прикачена", + "No file was uploaded" : "Нема прикачено дадотека", + "Missing a temporary folder" : "Недостасува привремена папка", + "Could not write file to disk" : "Неможе да се запишува на дискот", + "A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката", + "No file uploaded" : "Нема прикачено дадотека", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Веќе користите сопствена тема. Апликацијата за сопствена тема може да ја пребрише истата.", + "Theming" : "Теми", + "Appearance and accessibility" : "Изглед и пристапност", + "Dark theme with high contrast mode" : "Темна тема со режим на висок контраст", + "Enable dark high contrast mode" : "Овозможи темен режим со висок контраст", + "Similar to the high contrast mode, but with dark colours." : "Слично на режимот со висок контраст, но со темни бои.", + "Dark theme" : "Темна тема", + "Enable dark theme" : "Овозможи темна тема", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темна тема за олеснување на вашите очи со намалување на целокупниот сјај и осветленост.", + "System default theme" : "Стандардна тема", + "Enable the system default" : "Овозможи стандардна тема", + "Using the default system appearance." : "Го користи стандардниот изглед.", + "Dyslexia font" : "Фонт за дислексија", + "Enable dyslexia font" : "Овозможи фонт за дислексија", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic е бесплатен фонт дизајниран за ублажување на некои од честите грешки во читањето предизвикани од дислексија.", + "High contrast mode" : "Режим на висок контраст", + "Enable high contrast mode" : "Овозможи режим на висок контраст", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим со висок контраст за олеснување на навигацијата. Визуелниот квалитет ќе се намали, но јасноста ќе се зголеми.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Овозможи стандардна светла тема", + "The default light appearance." : "Стандарден светло изглед.", + "Legal notice" : "Правно известување", + "Privacy policy" : "Политика за приватност", + "Adjust the Nextcloud theme" : "Прилагодување на темата за Nextcloud", + "Name" : "Име", + "Web link" : "Веб страна", + "a safe home for all your data" : "безбеден дом за сите ваши податоци", + "Slogan" : "Слоган", + "Primary color" : "Примарна боја", + "Legal notice link" : "Правно известување", + "Privacy policy link" : "Политика за приватност", + "Header logo" : "Лого на заглавие", + "Upload new header logo" : "Прикачи ново лого на заглавие", + "Favicon" : "Фавикон", + "Upload new favicon" : "Прикачи нов Фавикон", + "User settings" : "Кориснички параметри", + "Disable user theming" : "Оневозможи кориснички теми", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Иако можете да изберете и да ја прилагодите вашата истанца, корисниците можат да ја менуваат нивната позадина и бои. Ако сакате да го наметнете вашето прилагодување, можете да го вклучите ова.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темата овозможува можно полесно прилагодување на изгледот и чувството на вашите истанци и поддржани клиенти. Ова ќе биде видливо за сите корисници.", + "Background color" : "Боја на позадина", + "Upload new logo" : "Прикачи ново лого", + "Logo" : "Лого", + "Upload new background and login image" : "Прикачи нова позадина и слика на страната за најавување", + "Background and login image" : "Позадина и слика на страната за најавување", + "Advanced options" : "Напредни опции", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирај ImageMagick додаток за PHP со што ќе се овозможи поддршка за SVG сликите автоматски да генерираат Фавикон базирано на прикаченото лого и боја.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Доколку наидете на некој проблем, не се двоумете и пријавете го на {issuetracker} {linkend}. И доколку сакате можете да се приклучите кон нашиот {designteam} {linkend}!", + "Appearance and accessibility settings" : "Поставки за изглед и пристапност", + "Misc accessibility options" : "Разни опции за пристапност", + "Enable blur background filter (may increase GPU load)" : "Овозможи филтер за замаглување на позадината (може да го зголеми оптоварувањето на графичкиот процесор)", + "Customization has been disabled by your administrator" : "Уредувањето е оневозможено од администраторот", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Поставете примарна боја за да ги нагласите важните елементи. Бојата што се користи за елементи како што се примарните копчиња може малку да се разликува бидејќи се прилагодува за да ги исполни барањата за пристапност.", + "Background and color" : "Позадина и боја", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Позадината може да се постави од слика на стандардниот сет, Сопствена слика или обична боја.", + "Keyboard shortcuts" : "Кратенки преку тастатура", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Во некои случаи, кратенките на тастатурата може да се мешаат со алатките за пристапност. За да овозможите правилно фокусирање на вашата алатка, можете да ги оневозможите сите кратенки на тастатурата овде. Ова исто така ќе ги оневозможи сите достапни кратенки во апликациите.", + "Disable all keyboard shortcuts" : "Оневозможи ги сите кратенки преку тастатурата", + "Move up" : "Помести горе", + "Move down" : "Помести доле", + "Select a background from your files" : "Избери позадина од датотеките", + "Select background" : "Избери позадина", + "No background has been selected" : "Нема избрано позадина", + "Custom background" : "Сопствена позадина", + "Plain background" : "Обична позадина", + "Default background" : "Стандардна позадина", + "Theme selection is enforced" : "Наметнат е избор на тема", + "Could not set the app order" : "Не може да се постави редоследот на апликации", + "Could not reset the app order" : "Не може да се ресетира редоследот на апликации", + "Navigation bar settings" : "Поставки на лентата за навигација", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Можете да го конфигурирате редоследот на апликациите што се користи за лентата за навигација. Првиот запис ќе биде стандардната апликација, отворена по најавувањето или при кликнување на логото.", + "The default app can not be changed because it was configured by the administrator." : "Стандардната апликација не може да се смени бидејќи е конфигурирана од администраторот.", + "The app order was changed, to see it in action you have to reload the page." : "Редоследот на апликацијата е променет, за да го видите во акција, треба повторно да ја вчитате страницата.", + "Reset default app order" : "Ресетирај го стандардниот редослед на апликации", + "Could not set primary color" : "Не може да се постави примарна боја", + "Reset primary color" : "Ресетирај примарна боја", + "Could not set global default apps" : "Не може да се постават глобалните стандардни апликации", + "Default app" : "Стандардна апликација", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Стандардната апликација е апликацијата што е на пр. се отвора по најавувањето или кога ќе се кликне на логото во менито.", + "Use custom default app" : "Користи приспособена стандардна апликација", + "Global default app" : "Глобална стандардна апликација", + "Global default apps" : "Глобална стандардна апликација", + "Default app priority" : "Стандарден приоритет на апликацијата", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ако некоја апликација не е овозможена за корисник, се користи следната апликација со помал приоритет.", + "Select a custom color" : "Избери боја", + "Reset to default" : "Ресетирај на стандардно", + "Upload" : "Прикачи", + "Remove background image" : "Избриши ја позадинската слика", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзалниот пристап е многу важен за нас. Ние ги следиме веб-стандардите и ги имплементираме за да го направиме користењето попристапно, како користење без маус, и помошни апликации за читање на екранот. Наша цел е да бидеме во согласност со {guidelines} {linkend}2.1 на ниво АА, со висока контрастна тема дури и на ниво на ААА." +},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/nb.js b/apps/theming/l10n/nb.js new file mode 100644 index 00000000000..1899d40cc79 --- /dev/null +++ b/apps/theming/l10n/nb.js @@ -0,0 +1,122 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Navnet er for langt", + "The given web address is too long" : "Nettadressen er for lang", + "The given web address is not a valid URL" : "Nettadressen er ikke en gyldig URL", + "The given legal notice address is too long" : "Adressen for juridiske varsel er for lang", + "The given legal notice address is not a valid URL" : "Adressen til den juridiske varslingen er ikke en gyldig URL", + "The given privacy policy address is too long" : "Adressen til personvernerklæringen er for lang ", + "The given privacy policy address is not a valid URL" : "Addressen til personvernerklæringen er ikke en gyldig url", + "The given slogan is too long" : "Slagordet er for langt", + "The given color is invalid" : "Fargen er ugyldig", + "Disable-user-theming should be true or false" : "Deaktiver-bruker-tema skal være sant eller usant", + "Saved" : "Lagret", + "Invalid app given" : "Ugyldig app gitt", + "Invalid type for setting \"defaultApp\" given" : "Ugyldig type for innstilling \"defaultApp\" gitt", + "Invalid setting key" : "Ugyldig innstillingsnøkkel", + "The file was uploaded" : "Filen ble lastet opp", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Filen er større enn grensen satt i upload_max_filesize i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Filen du prøvde å laste opp er større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet", + "The file was only partially uploaded" : "Filen ble kun delvis nedlastet", + "No file was uploaded" : "Ingen filer ble lastet opp", + "Missing a temporary folder" : "Mangler midlertidig mappe", + "Could not write file to disk" : "Kunne ikke skrive fil til disk", + "A PHP extension stopped the file upload" : "A PHP-utvidelse stoppet filopplastingen", + "No file uploaded" : "Ingen fil lastet opp", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du bruker et tilpasset tema. Innstillinger i app for tilpasning av tema kan bli overskrevet av disse.", + "Theming" : "Temavalg", + "Appearance and accessibility" : "Utseende og tilgjengelighet", + "PHP Imagick module" : "PHP Imagick modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-modulen \"imagick\" er ikke aktivert selv om tema-appen er det. For at favicongenerering skal fungere riktig, må du installere og aktivere denne modulen.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP-modulen \"imagick\" for denne instansen mangler støtte for SVG. For økt kompatibilitet anbefales det å installere den.", + "Dark theme with high contrast mode" : "Mørkt tema med modus for høy kontrast", + "Enable dark high contrast mode" : "Aktiver mørkhøykontrastmodus", + "Similar to the high contrast mode, but with dark colours." : "Ligner på høykontrastmodus, men med mørke farger.", + "Dark theme" : "Mørkt tema", + "Enable dark theme" : "Aktiver mørkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Et mørkt tema for å lette øynene dine ved å redusere den generelle lysstyrken og lysstyrken.", + "System default theme" : "System standardtema", + "Enable the system default" : "Aktiver systemstandarden", + "Using the default system appearance." : "Bruker standard systemutseende.", + "Dyslexia font" : "Dysleksi skrifttype", + "Enable dyslexia font" : "Aktiver dysleksi skrifttype", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype egnet for å minske de mest vanligste lesefeilene som dysleksi forårsaker.", + "High contrast mode" : "Høykontrastmodus", + "Enable high contrast mode" : "Aktiver høy kontrast", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En høykontrast modus for å få en lettere navigasjon. Den visuelle kvaliteten vil bli reusert men klarheten vil bli økt.", + "Light theme" : "Lyst tema", + "Enable the default light theme" : "Aktiver standard lyst tema", + "The default light appearance." : "Standard lyst utseende.", + "Legal notice" : "Juridisk varsel", + "Privacy policy" : "Personvern", + "Adjust the Nextcloud theme" : "Tilpass Nextcloud-tema", + "Name" : "Navn", + "Web link" : "Nettside lenke", + "a safe home for all your data" : "et trygt hjem for alle dine data", + "Slogan" : "Slagord", + "Primary color" : "Primærfarge", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Primærfargen brukes til å markere elementer som viktige knapper. Det kan bli litt justert avhengig av gjeldende fargeskjema.", + "Legal notice link" : "Juridisk varslingslenke", + "Privacy policy link" : "Personvernerklæring", + "Header logo" : "Header logo", + "Upload new header logo" : "Last opp ny header logo", + "Favicon" : "Favoritt ikon", + "Upload new favicon" : "Last opp nytt ikon", + "User settings" : "Brukerinnstillinger", + "Disable user theming" : "Deaktiver brukertema", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Selv om du kan velge og tilpasse forekomsten, kan brukerne endre bakgrunn og farger. Hvis du vil håndheve tilpasningen din, kan du slå på dette.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temavalg gjør det enkelt å tilpasse utseende og følelsen av din installasjon og støttede klienter. Dette vil bli synlig for alle brukere.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "I stedet for et bakgrunnsbilde kan du også konfigurere en vanlig bakgrunnsfarge. Hvis du bruker et bakgrunnsbilde, vil endring av denne fargen påvirke fargen på ikonene på appmenyen.", + "Background color" : "Bakgrunnsfarge", + "Upload new logo" : "Last opp ny logo", + "Logo" : "Logo", + "Upload new background and login image" : "Last opp ny bakgrunn- og påloggingsbilde", + "Background and login image" : "Bakgrunn og påloggingsbilde", + "Advanced options" : "Avanserte innstillinger", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installer PHP-utvidelsen Imagemagick med støtte for SVG-bilder for å opprette favikoner automatisk basert på opplastet logo og farge.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ikke nøl med å rapportere problemer på {issuetracker}vår problemdatabase{linkend}. Og bli gjerne med i {designteam}vårt designteam{linkend} hvis du vil bidra.", + "Appearance and accessibility settings" : "Innstilinger for utseende og tilgjengelighet", + "Misc accessibility options" : "Diverse tilgjengelighetsalternativer", + "Enable blur background filter (may increase GPU load)" : "Aktiver bakgrunnsfilter for uskarphet (kan øke GPU-belastningen)", + "Customization has been disabled by your administrator" : "Tilpassing er deaktivert av systemansvarlig", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Angi en primærfarge for å fremheve viktige elementer. Fargen som brukes for elementer som primærknapper, kan variere litt ettersom den blir justert for å oppfylle tilgjengelighetskrav.", + "Background and color" : "Bakgrunn og farge", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Bakgrunnen kan settes til et bilde fra standardsettet, et egendefinert opplastet bilde eller en vanlig farge.", + "Keyboard shortcuts" : "Tastatursnarveier", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I noen tilfeller kan hurtigtaster forstyrre tilgjengelighetsverktøy. For å tillate fokus på verktøyet ditt riktig, kan du deaktivere alle hurtigtaster her. Dette vil også deaktivere alle tilgjengelige snarveier i apper.", + "Disable all keyboard shortcuts" : "Deaktiver alle tastatursnarveier", + "Current selected app: {app}, position {position} of {total}" : "Nåværende valgt app: {app}, posisjon {position} av {total}", + "Move up" : "Flytt opp", + "Move down" : "Flytt ned", + "Select a background from your files" : "Velg en bakgrunn fra filene dine", + "Select background" : "Velg bakgrunn", + "No background has been selected" : "Ingen bakgrunn er valgt", + "Custom background" : "Tilpasset bakgrunn", + "Plain background" : "Ensfarget bakgrunn", + "Default background" : "Standard bakgrunn", + "Theme selection is enforced" : "Temavalg er fremtvunget", + "Could not set the app order" : "Kunne ikke angi apprekkefølgen", + "Could not reset the app order" : "Kunne ikke tilbakestille apprekkefølgen", + "Navigation bar settings" : "Innstillinger for navigasjonsfelt", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurere apprekkefølgen som brukes for navigasjonsfeltet. Den første oppføringen vil være standardappen, åpnet etter innlogging eller når du klikker på logoen.", + "The default app can not be changed because it was configured by the administrator." : "Standardappen kan ikke endres fordi den ble konfigurert av administratoren.", + "The app order was changed, to see it in action you have to reload the page." : "Apprekkefølgen ble endret, for å se den i aksjon må du laste inn siden på nytt.", + "Reset default app order" : "Tilbakestill standard apprekkefølge", + "Could not set primary color" : "Kunne ikke angi primærfarge", + "Reset primary color" : "Tilbakestill primærfarge", + "Could not set global default apps" : "Kan ikke angi globale standardapper", + "Default app" : "Standard app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standardappen er den appen som f.eks. åpnes etter innlogging eller når logoen i menyen klikkes på.", + "Use custom default app" : "Bruk tilpasset standardapp", + "Global default app" : "Global standardapp", + "Global default apps" : "Globale standardapper", + "Default app priority" : "Standard appprioritet", + "If an app is not enabled for a user, the next app with lower priority is used." : "Hvis en app ikke er aktivert for en bruker, brukes den neste appen med lavere prioritet.", + "Select a custom color" : "Velg en tilpasset farge", + "Reset to default" : "Tilbakestill til standard", + "Upload" : "Last opp", + "Remove background image" : "Fjern bakgrunnsbilde", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universell utforming er viktig for oss. Vi følger web-standarder og tester for full funksjonalitet, både uten mus og med hjelpeprogrammer, slik som skjermlesere. Vi etterstreber å følge {guidelines}Retningslinjer for tilgjengelighet på nettsider{linkend} 2.1 på nivå AA, og med temaet for høy kontrast også nivå AAA." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/nb.json b/apps/theming/l10n/nb.json new file mode 100644 index 00000000000..425df751e38 --- /dev/null +++ b/apps/theming/l10n/nb.json @@ -0,0 +1,120 @@ +{ "translations": { + "The given name is too long" : "Navnet er for langt", + "The given web address is too long" : "Nettadressen er for lang", + "The given web address is not a valid URL" : "Nettadressen er ikke en gyldig URL", + "The given legal notice address is too long" : "Adressen for juridiske varsel er for lang", + "The given legal notice address is not a valid URL" : "Adressen til den juridiske varslingen er ikke en gyldig URL", + "The given privacy policy address is too long" : "Adressen til personvernerklæringen er for lang ", + "The given privacy policy address is not a valid URL" : "Addressen til personvernerklæringen er ikke en gyldig url", + "The given slogan is too long" : "Slagordet er for langt", + "The given color is invalid" : "Fargen er ugyldig", + "Disable-user-theming should be true or false" : "Deaktiver-bruker-tema skal være sant eller usant", + "Saved" : "Lagret", + "Invalid app given" : "Ugyldig app gitt", + "Invalid type for setting \"defaultApp\" given" : "Ugyldig type for innstilling \"defaultApp\" gitt", + "Invalid setting key" : "Ugyldig innstillingsnøkkel", + "The file was uploaded" : "Filen ble lastet opp", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Filen er større enn grensen satt i upload_max_filesize i php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Filen du prøvde å laste opp er større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet", + "The file was only partially uploaded" : "Filen ble kun delvis nedlastet", + "No file was uploaded" : "Ingen filer ble lastet opp", + "Missing a temporary folder" : "Mangler midlertidig mappe", + "Could not write file to disk" : "Kunne ikke skrive fil til disk", + "A PHP extension stopped the file upload" : "A PHP-utvidelse stoppet filopplastingen", + "No file uploaded" : "Ingen fil lastet opp", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du bruker et tilpasset tema. Innstillinger i app for tilpasning av tema kan bli overskrevet av disse.", + "Theming" : "Temavalg", + "Appearance and accessibility" : "Utseende og tilgjengelighet", + "PHP Imagick module" : "PHP Imagick modul", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-modulen \"imagick\" er ikke aktivert selv om tema-appen er det. For at favicongenerering skal fungere riktig, må du installere og aktivere denne modulen.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP-modulen \"imagick\" for denne instansen mangler støtte for SVG. For økt kompatibilitet anbefales det å installere den.", + "Dark theme with high contrast mode" : "Mørkt tema med modus for høy kontrast", + "Enable dark high contrast mode" : "Aktiver mørkhøykontrastmodus", + "Similar to the high contrast mode, but with dark colours." : "Ligner på høykontrastmodus, men med mørke farger.", + "Dark theme" : "Mørkt tema", + "Enable dark theme" : "Aktiver mørkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Et mørkt tema for å lette øynene dine ved å redusere den generelle lysstyrken og lysstyrken.", + "System default theme" : "System standardtema", + "Enable the system default" : "Aktiver systemstandarden", + "Using the default system appearance." : "Bruker standard systemutseende.", + "Dyslexia font" : "Dysleksi skrifttype", + "Enable dyslexia font" : "Aktiver dysleksi skrifttype", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic er en gratis skrifttype egnet for å minske de mest vanligste lesefeilene som dysleksi forårsaker.", + "High contrast mode" : "Høykontrastmodus", + "Enable high contrast mode" : "Aktiver høy kontrast", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "En høykontrast modus for å få en lettere navigasjon. Den visuelle kvaliteten vil bli reusert men klarheten vil bli økt.", + "Light theme" : "Lyst tema", + "Enable the default light theme" : "Aktiver standard lyst tema", + "The default light appearance." : "Standard lyst utseende.", + "Legal notice" : "Juridisk varsel", + "Privacy policy" : "Personvern", + "Adjust the Nextcloud theme" : "Tilpass Nextcloud-tema", + "Name" : "Navn", + "Web link" : "Nettside lenke", + "a safe home for all your data" : "et trygt hjem for alle dine data", + "Slogan" : "Slagord", + "Primary color" : "Primærfarge", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Primærfargen brukes til å markere elementer som viktige knapper. Det kan bli litt justert avhengig av gjeldende fargeskjema.", + "Legal notice link" : "Juridisk varslingslenke", + "Privacy policy link" : "Personvernerklæring", + "Header logo" : "Header logo", + "Upload new header logo" : "Last opp ny header logo", + "Favicon" : "Favoritt ikon", + "Upload new favicon" : "Last opp nytt ikon", + "User settings" : "Brukerinnstillinger", + "Disable user theming" : "Deaktiver brukertema", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Selv om du kan velge og tilpasse forekomsten, kan brukerne endre bakgrunn og farger. Hvis du vil håndheve tilpasningen din, kan du slå på dette.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temavalg gjør det enkelt å tilpasse utseende og følelsen av din installasjon og støttede klienter. Dette vil bli synlig for alle brukere.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "I stedet for et bakgrunnsbilde kan du også konfigurere en vanlig bakgrunnsfarge. Hvis du bruker et bakgrunnsbilde, vil endring av denne fargen påvirke fargen på ikonene på appmenyen.", + "Background color" : "Bakgrunnsfarge", + "Upload new logo" : "Last opp ny logo", + "Logo" : "Logo", + "Upload new background and login image" : "Last opp ny bakgrunn- og påloggingsbilde", + "Background and login image" : "Bakgrunn og påloggingsbilde", + "Advanced options" : "Avanserte innstillinger", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installer PHP-utvidelsen Imagemagick med støtte for SVG-bilder for å opprette favikoner automatisk basert på opplastet logo og farge.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ikke nøl med å rapportere problemer på {issuetracker}vår problemdatabase{linkend}. Og bli gjerne med i {designteam}vårt designteam{linkend} hvis du vil bidra.", + "Appearance and accessibility settings" : "Innstilinger for utseende og tilgjengelighet", + "Misc accessibility options" : "Diverse tilgjengelighetsalternativer", + "Enable blur background filter (may increase GPU load)" : "Aktiver bakgrunnsfilter for uskarphet (kan øke GPU-belastningen)", + "Customization has been disabled by your administrator" : "Tilpassing er deaktivert av systemansvarlig", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Angi en primærfarge for å fremheve viktige elementer. Fargen som brukes for elementer som primærknapper, kan variere litt ettersom den blir justert for å oppfylle tilgjengelighetskrav.", + "Background and color" : "Bakgrunn og farge", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Bakgrunnen kan settes til et bilde fra standardsettet, et egendefinert opplastet bilde eller en vanlig farge.", + "Keyboard shortcuts" : "Tastatursnarveier", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I noen tilfeller kan hurtigtaster forstyrre tilgjengelighetsverktøy. For å tillate fokus på verktøyet ditt riktig, kan du deaktivere alle hurtigtaster her. Dette vil også deaktivere alle tilgjengelige snarveier i apper.", + "Disable all keyboard shortcuts" : "Deaktiver alle tastatursnarveier", + "Current selected app: {app}, position {position} of {total}" : "Nåværende valgt app: {app}, posisjon {position} av {total}", + "Move up" : "Flytt opp", + "Move down" : "Flytt ned", + "Select a background from your files" : "Velg en bakgrunn fra filene dine", + "Select background" : "Velg bakgrunn", + "No background has been selected" : "Ingen bakgrunn er valgt", + "Custom background" : "Tilpasset bakgrunn", + "Plain background" : "Ensfarget bakgrunn", + "Default background" : "Standard bakgrunn", + "Theme selection is enforced" : "Temavalg er fremtvunget", + "Could not set the app order" : "Kunne ikke angi apprekkefølgen", + "Could not reset the app order" : "Kunne ikke tilbakestille apprekkefølgen", + "Navigation bar settings" : "Innstillinger for navigasjonsfelt", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurere apprekkefølgen som brukes for navigasjonsfeltet. Den første oppføringen vil være standardappen, åpnet etter innlogging eller når du klikker på logoen.", + "The default app can not be changed because it was configured by the administrator." : "Standardappen kan ikke endres fordi den ble konfigurert av administratoren.", + "The app order was changed, to see it in action you have to reload the page." : "Apprekkefølgen ble endret, for å se den i aksjon må du laste inn siden på nytt.", + "Reset default app order" : "Tilbakestill standard apprekkefølge", + "Could not set primary color" : "Kunne ikke angi primærfarge", + "Reset primary color" : "Tilbakestill primærfarge", + "Could not set global default apps" : "Kan ikke angi globale standardapper", + "Default app" : "Standard app", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standardappen er den appen som f.eks. åpnes etter innlogging eller når logoen i menyen klikkes på.", + "Use custom default app" : "Bruk tilpasset standardapp", + "Global default app" : "Global standardapp", + "Global default apps" : "Globale standardapper", + "Default app priority" : "Standard appprioritet", + "If an app is not enabled for a user, the next app with lower priority is used." : "Hvis en app ikke er aktivert for en bruker, brukes den neste appen med lavere prioritet.", + "Select a custom color" : "Velg en tilpasset farge", + "Reset to default" : "Tilbakestill til standard", + "Upload" : "Last opp", + "Remove background image" : "Fjern bakgrunnsbilde", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universell utforming er viktig for oss. Vi følger web-standarder og tester for full funksjonalitet, både uten mus og med hjelpeprogrammer, slik som skjermlesere. Vi etterstreber å følge {guidelines}Retningslinjer for tilgjengelighet på nettsider{linkend} 2.1 på nivå AA, og med temaet for høy kontrast også nivå AAA." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/nl.js b/apps/theming/l10n/nl.js new file mode 100644 index 00000000000..46a95ffa9d6 --- /dev/null +++ b/apps/theming/l10n/nl.js @@ -0,0 +1,84 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "De opgegeven naam is te lang", + "The given web address is too long" : "Het opgegeven internetadres is te lang", + "The given web address is not a valid URL" : "Het opgegeven internetadres is geen geldige URL", + "The given legal notice address is too long" : "Het opgegeven adres voor de juridische melding is te lang", + "The given legal notice address is not a valid URL" : "Het opgegeven adres voor de juridische melding geen geldige URL", + "The given privacy policy address is too long" : "Het opgegeven adres met privacybeleid is te lang", + "The given privacy policy address is not a valid URL" : "Het opgegeven adres met privacybeleid is geen geldige URL", + "The given slogan is too long" : "De opgegeven slagzin is te lang", + "The given color is invalid" : "De opgegeven kleur is ongeldig", + "Disable-user-theming should be true or false" : "Uitschakelen-gebruiker-thema's moet waar of onwaar zijn", + "Saved" : "Opgeslagen", + "The file was uploaded" : "Het bestand werd geüpload", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Het geüploade bestand overschrijdt de upload_max_filesize richtlijn in php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Het bestand overschrijdt de MAX_FILE_SIZE richtlijn die is opgegeven in het HTML formulier", + "The file was only partially uploaded" : "Het bestand is slechts gedeeltelijk geüpload", + "No file was uploaded" : "Er is geen bestand geüpload", + "Missing a temporary folder" : "Er ontbreekt een tijdelijke map", + "Could not write file to disk" : "Kan bestand niet opslaan", + "A PHP extension stopped the file upload" : "Een PHP extensie heeft de upload gestopt.", + "No file uploaded" : "Geen bestand geüpload", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Je gebruikt al een aangepast thema. Theming app opties kunnen daardoor worden overschreven.", + "Theming" : "Uiterlijk", + "Appearance and accessibility" : "Weergave en toegankelijkheid", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "De PHP-module \"imagick\" is niet ingeschakeld, hoewel de thema-app dat wel is. Om ervoor te zorgen dat het genereren van favicons correct werkt, moet je deze module installeren en inschakelen.", + "Dark theme with high contrast mode" : "Donker thema met hoog contrast modus", + "Enable dark high contrast mode" : "Donkere hoog contrast modus inschakelen", + "Similar to the high contrast mode, but with dark colours." : "Vergelijkbaar met de hoog contrast modus, maar met donkere kleuren", + "Dark theme" : "Donker thema", + "Enable dark theme" : "Donker thema inschakelen", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Een donker thema om je ogen te laten rusten door het verminderen van de algehele lichtsterkte en helderheid.", + "System default theme" : "Standaard systeemthema", + "Enable the system default" : "Schakel het standaard systeemthema in", + "Using the default system appearance." : "De standaard systeemweergave gebruiken", + "Dyslexia font" : "Dyslexie-lettertype", + "Enable dyslexia font" : "Dyslexie-lettertype inschakelen", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is een open source lettertype dat is ontwikkeld om de meest voorkomende leesfouten die worden veroorzaakt door dyslexie te voorkomen.", + "High contrast mode" : "Hoog contrast modus", + "Enable high contrast mode" : "Hoog contrast modus inschakelen", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.", + "Light theme" : "Licht thema", + "Enable the default light theme" : "Schakel het standaard lichte thema in", + "The default light appearance." : "De standaard lichte weergave.", + "Legal notice" : "Juridische bepalingen", + "Privacy policy" : "Privacybeleid", + "Adjust the Nextcloud theme" : "Nextcloud thema bijstellen", + "Name" : "Naam", + "Web link" : "Weblink", + "a safe home for all your data" : "een veilige plek voor al je gegevens", + "Slogan" : "Slagzin", + "Legal notice link" : "Link naar juridische bepalingen", + "Privacy policy link" : "Privacybeleid link", + "Header logo" : "Top logo", + "Upload new header logo" : "Upload een nieuwe top afbeelding", + "Favicon" : "Favicon", + "Upload new favicon" : "Nieuw favicon uploaden", + "User settings" : "Instellingen gebruiker", + "Disable user theming" : "Gebruiker thema's uitschakelen", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", + "Upload new logo" : "Upload nieuw logo", + "Logo" : "Logo", + "Background and login image" : "Achtergrond en aanmeld afbeelding", + "Advanced options" : "Geavanceerde opties", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Als je problemen tegenkomt, aarzel dan niet om deze te rapporteren op {issuetracker}onze issue tracker{linkend}. En als je betrokken wilt raken, word dan lid van {designteam}ons designteam{linkend}!", + "Customization has been disabled by your administrator" : "Maatwerk is uitgeschakeld door uw beheerder", + "Keyboard shortcuts" : "Toetsenbord sneltoetsen", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In sommige gevallen kunnen sneltoetsen interfereren met toegankelijkheidstools. Om de juiste focus op uw hulpmiddel mogelijk te maken, kunt u hier alle sneltoetsen uitschakelen. Dit zal ook alle beschikbare sneltoetsen in apps uitschakelen.", + "Disable all keyboard shortcuts" : "Schakel alle sneltoetsen uit", + "Move up" : "Verplaats naar boven", + "Move down" : "Lager zetten", + "Select background" : "Selecteer achtergrond", + "Custom background" : "Aangepaste achtergrond", + "Plain background" : "Kale achtergrond", + "Default background" : "Standaard achtergrond", + "Theme selection is enforced" : "Themaselectie is afgedwongen", + "Select a custom color" : "Selecteer een aangepaste kleur", + "Reset to default" : "Herstellen naar standaard", + "Upload" : "Uploaden", + "Remove background image" : "Achtergrond beeld verwijderen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/nl.json b/apps/theming/l10n/nl.json new file mode 100644 index 00000000000..9871f78bbf2 --- /dev/null +++ b/apps/theming/l10n/nl.json @@ -0,0 +1,82 @@ +{ "translations": { + "The given name is too long" : "De opgegeven naam is te lang", + "The given web address is too long" : "Het opgegeven internetadres is te lang", + "The given web address is not a valid URL" : "Het opgegeven internetadres is geen geldige URL", + "The given legal notice address is too long" : "Het opgegeven adres voor de juridische melding is te lang", + "The given legal notice address is not a valid URL" : "Het opgegeven adres voor de juridische melding geen geldige URL", + "The given privacy policy address is too long" : "Het opgegeven adres met privacybeleid is te lang", + "The given privacy policy address is not a valid URL" : "Het opgegeven adres met privacybeleid is geen geldige URL", + "The given slogan is too long" : "De opgegeven slagzin is te lang", + "The given color is invalid" : "De opgegeven kleur is ongeldig", + "Disable-user-theming should be true or false" : "Uitschakelen-gebruiker-thema's moet waar of onwaar zijn", + "Saved" : "Opgeslagen", + "The file was uploaded" : "Het bestand werd geüpload", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Het geüploade bestand overschrijdt de upload_max_filesize richtlijn in php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Het bestand overschrijdt de MAX_FILE_SIZE richtlijn die is opgegeven in het HTML formulier", + "The file was only partially uploaded" : "Het bestand is slechts gedeeltelijk geüpload", + "No file was uploaded" : "Er is geen bestand geüpload", + "Missing a temporary folder" : "Er ontbreekt een tijdelijke map", + "Could not write file to disk" : "Kan bestand niet opslaan", + "A PHP extension stopped the file upload" : "Een PHP extensie heeft de upload gestopt.", + "No file uploaded" : "Geen bestand geüpload", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Je gebruikt al een aangepast thema. Theming app opties kunnen daardoor worden overschreven.", + "Theming" : "Uiterlijk", + "Appearance and accessibility" : "Weergave en toegankelijkheid", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "De PHP-module \"imagick\" is niet ingeschakeld, hoewel de thema-app dat wel is. Om ervoor te zorgen dat het genereren van favicons correct werkt, moet je deze module installeren en inschakelen.", + "Dark theme with high contrast mode" : "Donker thema met hoog contrast modus", + "Enable dark high contrast mode" : "Donkere hoog contrast modus inschakelen", + "Similar to the high contrast mode, but with dark colours." : "Vergelijkbaar met de hoog contrast modus, maar met donkere kleuren", + "Dark theme" : "Donker thema", + "Enable dark theme" : "Donker thema inschakelen", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Een donker thema om je ogen te laten rusten door het verminderen van de algehele lichtsterkte en helderheid.", + "System default theme" : "Standaard systeemthema", + "Enable the system default" : "Schakel het standaard systeemthema in", + "Using the default system appearance." : "De standaard systeemweergave gebruiken", + "Dyslexia font" : "Dyslexie-lettertype", + "Enable dyslexia font" : "Dyslexie-lettertype inschakelen", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic is een open source lettertype dat is ontwikkeld om de meest voorkomende leesfouten die worden veroorzaakt door dyslexie te voorkomen.", + "High contrast mode" : "Hoog contrast modus", + "Enable high contrast mode" : "Hoog contrast modus inschakelen", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Een thema met hoog contrast dat de navigatie vergemakkelijkt. De visuele kwaliteit vermindert, maar de duidelijkheid neemt toe.", + "Light theme" : "Licht thema", + "Enable the default light theme" : "Schakel het standaard lichte thema in", + "The default light appearance." : "De standaard lichte weergave.", + "Legal notice" : "Juridische bepalingen", + "Privacy policy" : "Privacybeleid", + "Adjust the Nextcloud theme" : "Nextcloud thema bijstellen", + "Name" : "Naam", + "Web link" : "Weblink", + "a safe home for all your data" : "een veilige plek voor al je gegevens", + "Slogan" : "Slagzin", + "Legal notice link" : "Link naar juridische bepalingen", + "Privacy policy link" : "Privacybeleid link", + "Header logo" : "Top logo", + "Upload new header logo" : "Upload een nieuwe top afbeelding", + "Favicon" : "Favicon", + "Upload new favicon" : "Nieuw favicon uploaden", + "User settings" : "Instellingen gebruiker", + "Disable user theming" : "Gebruiker thema's uitschakelen", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", + "Upload new logo" : "Upload nieuw logo", + "Logo" : "Logo", + "Background and login image" : "Achtergrond en aanmeld afbeelding", + "Advanced options" : "Geavanceerde opties", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Als je problemen tegenkomt, aarzel dan niet om deze te rapporteren op {issuetracker}onze issue tracker{linkend}. En als je betrokken wilt raken, word dan lid van {designteam}ons designteam{linkend}!", + "Customization has been disabled by your administrator" : "Maatwerk is uitgeschakeld door uw beheerder", + "Keyboard shortcuts" : "Toetsenbord sneltoetsen", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "In sommige gevallen kunnen sneltoetsen interfereren met toegankelijkheidstools. Om de juiste focus op uw hulpmiddel mogelijk te maken, kunt u hier alle sneltoetsen uitschakelen. Dit zal ook alle beschikbare sneltoetsen in apps uitschakelen.", + "Disable all keyboard shortcuts" : "Schakel alle sneltoetsen uit", + "Move up" : "Verplaats naar boven", + "Move down" : "Lager zetten", + "Select background" : "Selecteer achtergrond", + "Custom background" : "Aangepaste achtergrond", + "Plain background" : "Kale achtergrond", + "Default background" : "Standaard achtergrond", + "Theme selection is enforced" : "Themaselectie is afgedwongen", + "Select a custom color" : "Selecteer een aangepaste kleur", + "Reset to default" : "Herstellen naar standaard", + "Upload" : "Uploaden", + "Remove background image" : "Achtergrond beeld verwijderen", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Universele toegang is heel belangrijk voor ons. We volgen webstandaarden en controleren dat alles ook zonder muis en met ondersteunende software zoals schermlezers bruikbaar is. We streven om de {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 op AA-niveau te volgen, en met het hoge contrast thema zelfs op AAA-niveau." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/pl.js b/apps/theming/l10n/pl.js new file mode 100644 index 00000000000..79e45abb881 --- /dev/null +++ b/apps/theming/l10n/pl.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Podana nazwa jest za długa", + "The given web address is too long" : "Podany adres internetowy jest za długi", + "The given web address is not a valid URL" : "Podany adres internetowy nie jest prawidłowym adresem URL", + "The given legal notice address is too long" : "Podany adres noty prawnej jest za długi", + "The given legal notice address is not a valid URL" : "Podany adres noty prawnej nie jest prawidłowym adresem URL", + "The given privacy policy address is too long" : "Podany adres polityki prywatności jest za długi", + "The given privacy policy address is not a valid URL" : "Podany adres polityki prywatności nie jest prawidłowym adresem URL", + "The given slogan is too long" : "Podany slogan jest za długi", + "The given color is invalid" : "Podany kolor jest nieprawidłowy", + "Disable-user-theming should be true or false" : "Opcja Wyłącz użytkownika powinna mieć wartość true lub false", + "Saved" : "Zapisano", + "Invalid app given" : "Podano nieprawidłową aplikację", + "Invalid type for setting \"defaultApp\" given" : "Podano nieprawidłowy typ ustawienia \"defaultApp\"", + "Invalid setting key" : "Nieprawidłowy klucz ustawień", + "The file was uploaded" : "Plik został wysłany", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Wysłany plik przekracza wartość upload_max_filesize zdefiniowaną w php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Wysłany plik przekracza wartość MAX_FILE_SIZE określoną w formularzu HTML", + "The file was only partially uploaded" : "Plik został wysłany tylko częściowo", + "No file was uploaded" : "Nie wysłano żadnego pliku", + "Missing a temporary folder" : "Brak katalogu tymczasowego", + "Could not write file to disk" : "Nie można zapisać pliku na dysk", + "A PHP extension stopped the file upload" : "Rozszerzenie PHP zatrzymało wysyłanie pliku", + "No file uploaded" : "Nie wysłano pliku", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Używasz już własnego motywu. Ustawienia aplikacji Theming mogą zostać nadpisane.", + "Theming" : "Motyw", + "Appearance and accessibility" : "Wygląd i dostępność", + "PHP Imagick module" : "Moduł PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Moduł PHP \"imagick\" nie jest włączony, pomimo że aplikacja motywu jest. Aby generowanie favicon działało poprawnie, musisz zainstalować i włączyć ten moduł.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Moduł PHP \"imagick\" w tym przypadku nie obsługuje SVG. Dla lepszej kompatybilności zaleca się jego instalację.", + "Dark theme with high contrast mode" : "Ciemny motyw z trybem wysokiego kontrastu", + "Enable dark high contrast mode" : "Włącz ciemny tryb wysokiego kontrastu", + "Similar to the high contrast mode, but with dark colours." : "Podobny do trybu wysokiego kontrastu, ale z ciemnymi kolorami.", + "Dark theme" : "Ciemny motyw", + "Enable dark theme" : "Włącz ciemny motyw", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczu, redukując ogólną luminancję i jasność.", + "System default theme" : "Domyślny motyw systemu", + "Enable the system default" : "Włącz domyślne ustawienia systemu", + "Using the default system appearance." : "Korzystanie z domyślnego wyglądu systemu.", + "Dyslexia font" : "Czcionka dla dyslektyków", + "Enable dyslexia font" : "Włącz czcionkę dla dyslektyków", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic to darmowa czcionka zaprojektowana w celu zmniejszenia niektórych typowych błędów w czytaniu spowodowanych dysleksją.", + "High contrast mode" : "Tryb wysokiego kontrastu", + "Enable high contrast mode" : "Włącz tryb wysokiego kontrastu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Tryb wysokiego kontrastu ułatwiający nawigację. Jakość obrazu zostanie zmniejszona, celem poprawy przejrzystości.", + "Light theme" : "Jasny motyw", + "Enable the default light theme" : "Włącz domyślny jasny motyw", + "The default light appearance." : "Domyślny jasny wygląd.", + "Legal notice" : "Nota prawna", + "Privacy policy" : "Polityka prywatności", + "Adjust the Nextcloud theme" : "Dostosuj motyw Nextcloud", + "Name" : "Nazwa", + "Web link" : "Link", + "a safe home for all your data" : "bezpieczny dom dla wszystkich danych", + "Slogan" : "Slogan", + "Primary color" : "Kolor podstawowy", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Kolor podstawowy jest używany do wyróżniania elementów, takich jak ważne przyciski. Może być lekko dostosowany w zależności od bieżącego schematu kolorów.", + "Legal notice link" : "Link do informacji prawnej", + "Privacy policy link" : "Link do polityki prywatności", + "Header logo" : "Logo nagłówka", + "Upload new header logo" : "Wyślij nowe logo nagłówka", + "Favicon" : "Ikona favicon", + "Upload new favicon" : "Wyślij nową ikonę favicon", + "User settings" : "Ustawienia użytkownika", + "Disable user theming" : "Wyłącz motywy użytkownika", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Chociaż możesz wybrać i dostosować swoją instancję, użytkownicy mogą zmieniać swoje tło i kolory. Jeśli chcesz wymusić dostosowanie, możesz to włączyć.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motyw umożliwia na łatwą personalizację wyglądu instancji i wspieranych klientów. Ustawiony wygląd będzie widoczny dla wszystkich użytkowników.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Zamiast obrazu tła możesz również ustawić jednolity kolor tła. Jeśli używasz obrazu tła, zmiana tego koloru wpłynie na kolor ikon w menu aplikacji.", + "Background color" : "Kolor tła", + "Upload new logo" : "Wyślij nowe logo", + "Logo" : "Logo", + "Upload new background and login image" : "Wyślij nowe tło i obraz logowania", + "Background and login image" : "Obraz tła i logowania", + "Advanced options" : "Opcje zaawansowane", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Zainstaluj rozszerzenie ImageMagick PHP z obsługą obrazów SVG, aby automatycznie generować favikony na podstawie przesłanego logo i koloru.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uniwersalna dostępność jest dla nas bardzo ważna. Przestrzegamy standardów sieciowych i dbamy, aby wszystko było używalne także bez myszy, jak również z oprogramowaniem wspomagającym, takim jak czytniki ekranu. Dążymy do zgodności z Wytycznymi dotyczącymi {linkstart} dostępności treści internetowych (WCAG) {linkend} 2.1 na poziomie AA, a w przypadku motywów o wysokim kontraście nawet na poziomie AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Jeśli znajdziesz jakieś problemy, nie wahaj się zgłosić je na {issuetracker}listę błędów{linkend}. A jeśli chcesz się zaangażować, dołącz do {designteam}naszego zespołu projektowego{linkend}!", + "Unable to apply the setting." : "Nie można zastosować ustawienia.", + "Appearance and accessibility settings" : "Ustawienia wyglądu i dostępności", + "Misc accessibility options" : "Inne opcje dostępności", + "Enable blur background filter (may increase GPU load)" : "Włącz filtr rozmycia tła (może zwiększyć obciążenie GPU)", + "Customization has been disabled by your administrator" : "Dostosowanie zostało wyłączone przez administratora", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Ustaw kolor podstawowy, aby wyróżnić ważne elementy. Kolor używany dla elementów, takich jak główne przyciski, może się nieco różnić, ponieważ dostosowuje się do wymagań dostępności.", + "Background and color" : "Tło i kolor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Tło może być ustawione jako obraz z zestawu domyślnego, przesłany przez użytkownika obraz lub jednolity kolor.", + "Keyboard shortcuts" : "Skróty klawiaturowe", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "W niektórych przypadkach skróty klawiaturowe mogą kolidować z narzędziami ułatwień dostępu. Aby umożliwić prawidłowe skupienie się na narzędziu, możesz tutaj wyłączyć wszystkie skróty klawiaturowe. Spowoduje to również wyłączenie wszystkich dostępnych skrótów w aplikacjach.", + "Disable all keyboard shortcuts" : "Wyłącz wszystkie skróty klawiaturowe", + "Current selected app: {app}, position {position} of {total}" : "Aktualnie wybrana aplikacja: {app}, pozycja {position} z {total}", + "Move up" : "Przenieś wyżej", + "Move down" : "Przenieś niżej", + "Select a background from your files" : "Wybierz tło ze swoich Plików", + "Select background" : "Wybierz tło", + "No background has been selected" : "Nie wybrano tła", + "Custom background" : "Tło niestandardowe", + "Plain background" : "Zwykłe tło", + "Default background" : "Tło domyślne", + "Theme selection is enforced" : "Wybór motywu jest wymuszony", + "Could not set the app order" : "Nie można ustawić kolejności aplikacji", + "Could not reset the app order" : "Nie można zresetować kolejności aplikacji", + "Navigation bar settings" : "Ustawienia paska nawigacji", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Możesz skonfigurować kolejność aplikacji używaną na pasku nawigacyjnym. Pierwsza będzie aplikacja domyślna, otwierana po zalogowaniu lub kliknięciu na logo.", + "The default app can not be changed because it was configured by the administrator." : "Domyślnej aplikacji nie można zmienić, ponieważ została skonfigurowana przez administratora.", + "The app order was changed, to see it in action you have to reload the page." : "Kolejność aplikacji została zmieniona, aby zobaczyć ją po zmianie, należy ponownie załadować stronę.", + "Reset default app order" : "Zresetuj domyślną kolejność aplikacji", + "Could not set primary color" : "Nie udało się ustawić podstawowego koloru", + "Reset primary color" : "Resetuj kolor podstawowy", + "Could not set global default apps" : "Nie można ustawić globalnych aplikacji domyślnych", + "Default app" : "Aplikacja domyślna", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Domyślną aplikacją jest aplikacja będąca np. otwierana po zalogowaniu lub kliknięciu logo w menu.", + "Use custom default app" : "Użyj własnej aplikacji domyślnej", + "Global default app" : "Globalna aplikacja domyślna", + "Global default apps" : "Globalne aplikacje domyślne", + "Default app priority" : "Domyślny priorytet aplikacji", + "If an app is not enabled for a user, the next app with lower priority is used." : "Jeśli aplikacja nie jest włączona dla użytkownika, używana jest następna aplikacja o niższym priorytecie.", + "Select a custom color" : "Wybierz kolor niestandardowy", + "Reset to default" : "Przywróć domyślne", + "Upload" : "Wyślij", + "Remove background image" : "Usuń obraz tła", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uniwersalny dostęp jest dla nas bardzo ważny. Przestrzegamy standardów internetowych i sprawdzamy, aby wszystko było użyteczne również bez myszy i oprogramowania pomocniczego, takiego jak czytniki ekranu. Naszym celem jest zgodność z {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 na poziomie AA, z motywem o wysokim kontraście nawet na poziomie AAA.", + ". Unable to apply the setting." : ". Nie udało się zapisać ustawień." +}, +"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/theming/l10n/pl.json b/apps/theming/l10n/pl.json new file mode 100644 index 00000000000..02308d7f5b7 --- /dev/null +++ b/apps/theming/l10n/pl.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Podana nazwa jest za długa", + "The given web address is too long" : "Podany adres internetowy jest za długi", + "The given web address is not a valid URL" : "Podany adres internetowy nie jest prawidłowym adresem URL", + "The given legal notice address is too long" : "Podany adres noty prawnej jest za długi", + "The given legal notice address is not a valid URL" : "Podany adres noty prawnej nie jest prawidłowym adresem URL", + "The given privacy policy address is too long" : "Podany adres polityki prywatności jest za długi", + "The given privacy policy address is not a valid URL" : "Podany adres polityki prywatności nie jest prawidłowym adresem URL", + "The given slogan is too long" : "Podany slogan jest za długi", + "The given color is invalid" : "Podany kolor jest nieprawidłowy", + "Disable-user-theming should be true or false" : "Opcja Wyłącz użytkownika powinna mieć wartość true lub false", + "Saved" : "Zapisano", + "Invalid app given" : "Podano nieprawidłową aplikację", + "Invalid type for setting \"defaultApp\" given" : "Podano nieprawidłowy typ ustawienia \"defaultApp\"", + "Invalid setting key" : "Nieprawidłowy klucz ustawień", + "The file was uploaded" : "Plik został wysłany", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Wysłany plik przekracza wartość upload_max_filesize zdefiniowaną w php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Wysłany plik przekracza wartość MAX_FILE_SIZE określoną w formularzu HTML", + "The file was only partially uploaded" : "Plik został wysłany tylko częściowo", + "No file was uploaded" : "Nie wysłano żadnego pliku", + "Missing a temporary folder" : "Brak katalogu tymczasowego", + "Could not write file to disk" : "Nie można zapisać pliku na dysk", + "A PHP extension stopped the file upload" : "Rozszerzenie PHP zatrzymało wysyłanie pliku", + "No file uploaded" : "Nie wysłano pliku", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Używasz już własnego motywu. Ustawienia aplikacji Theming mogą zostać nadpisane.", + "Theming" : "Motyw", + "Appearance and accessibility" : "Wygląd i dostępność", + "PHP Imagick module" : "Moduł PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Moduł PHP \"imagick\" nie jest włączony, pomimo że aplikacja motywu jest. Aby generowanie favicon działało poprawnie, musisz zainstalować i włączyć ten moduł.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Moduł PHP \"imagick\" w tym przypadku nie obsługuje SVG. Dla lepszej kompatybilności zaleca się jego instalację.", + "Dark theme with high contrast mode" : "Ciemny motyw z trybem wysokiego kontrastu", + "Enable dark high contrast mode" : "Włącz ciemny tryb wysokiego kontrastu", + "Similar to the high contrast mode, but with dark colours." : "Podobny do trybu wysokiego kontrastu, ale z ciemnymi kolorami.", + "Dark theme" : "Ciemny motyw", + "Enable dark theme" : "Włącz ciemny motyw", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczu, redukując ogólną luminancję i jasność.", + "System default theme" : "Domyślny motyw systemu", + "Enable the system default" : "Włącz domyślne ustawienia systemu", + "Using the default system appearance." : "Korzystanie z domyślnego wyglądu systemu.", + "Dyslexia font" : "Czcionka dla dyslektyków", + "Enable dyslexia font" : "Włącz czcionkę dla dyslektyków", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic to darmowa czcionka zaprojektowana w celu zmniejszenia niektórych typowych błędów w czytaniu spowodowanych dysleksją.", + "High contrast mode" : "Tryb wysokiego kontrastu", + "Enable high contrast mode" : "Włącz tryb wysokiego kontrastu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Tryb wysokiego kontrastu ułatwiający nawigację. Jakość obrazu zostanie zmniejszona, celem poprawy przejrzystości.", + "Light theme" : "Jasny motyw", + "Enable the default light theme" : "Włącz domyślny jasny motyw", + "The default light appearance." : "Domyślny jasny wygląd.", + "Legal notice" : "Nota prawna", + "Privacy policy" : "Polityka prywatności", + "Adjust the Nextcloud theme" : "Dostosuj motyw Nextcloud", + "Name" : "Nazwa", + "Web link" : "Link", + "a safe home for all your data" : "bezpieczny dom dla wszystkich danych", + "Slogan" : "Slogan", + "Primary color" : "Kolor podstawowy", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Kolor podstawowy jest używany do wyróżniania elementów, takich jak ważne przyciski. Może być lekko dostosowany w zależności od bieżącego schematu kolorów.", + "Legal notice link" : "Link do informacji prawnej", + "Privacy policy link" : "Link do polityki prywatności", + "Header logo" : "Logo nagłówka", + "Upload new header logo" : "Wyślij nowe logo nagłówka", + "Favicon" : "Ikona favicon", + "Upload new favicon" : "Wyślij nową ikonę favicon", + "User settings" : "Ustawienia użytkownika", + "Disable user theming" : "Wyłącz motywy użytkownika", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Chociaż możesz wybrać i dostosować swoją instancję, użytkownicy mogą zmieniać swoje tło i kolory. Jeśli chcesz wymusić dostosowanie, możesz to włączyć.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motyw umożliwia na łatwą personalizację wyglądu instancji i wspieranych klientów. Ustawiony wygląd będzie widoczny dla wszystkich użytkowników.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Zamiast obrazu tła możesz również ustawić jednolity kolor tła. Jeśli używasz obrazu tła, zmiana tego koloru wpłynie na kolor ikon w menu aplikacji.", + "Background color" : "Kolor tła", + "Upload new logo" : "Wyślij nowe logo", + "Logo" : "Logo", + "Upload new background and login image" : "Wyślij nowe tło i obraz logowania", + "Background and login image" : "Obraz tła i logowania", + "Advanced options" : "Opcje zaawansowane", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Zainstaluj rozszerzenie ImageMagick PHP z obsługą obrazów SVG, aby automatycznie generować favikony na podstawie przesłanego logo i koloru.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uniwersalna dostępność jest dla nas bardzo ważna. Przestrzegamy standardów sieciowych i dbamy, aby wszystko było używalne także bez myszy, jak również z oprogramowaniem wspomagającym, takim jak czytniki ekranu. Dążymy do zgodności z Wytycznymi dotyczącymi {linkstart} dostępności treści internetowych (WCAG) {linkend} 2.1 na poziomie AA, a w przypadku motywów o wysokim kontraście nawet na poziomie AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Jeśli znajdziesz jakieś problemy, nie wahaj się zgłosić je na {issuetracker}listę błędów{linkend}. A jeśli chcesz się zaangażować, dołącz do {designteam}naszego zespołu projektowego{linkend}!", + "Unable to apply the setting." : "Nie można zastosować ustawienia.", + "Appearance and accessibility settings" : "Ustawienia wyglądu i dostępności", + "Misc accessibility options" : "Inne opcje dostępności", + "Enable blur background filter (may increase GPU load)" : "Włącz filtr rozmycia tła (może zwiększyć obciążenie GPU)", + "Customization has been disabled by your administrator" : "Dostosowanie zostało wyłączone przez administratora", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Ustaw kolor podstawowy, aby wyróżnić ważne elementy. Kolor używany dla elementów, takich jak główne przyciski, może się nieco różnić, ponieważ dostosowuje się do wymagań dostępności.", + "Background and color" : "Tło i kolor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Tło może być ustawione jako obraz z zestawu domyślnego, przesłany przez użytkownika obraz lub jednolity kolor.", + "Keyboard shortcuts" : "Skróty klawiaturowe", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "W niektórych przypadkach skróty klawiaturowe mogą kolidować z narzędziami ułatwień dostępu. Aby umożliwić prawidłowe skupienie się na narzędziu, możesz tutaj wyłączyć wszystkie skróty klawiaturowe. Spowoduje to również wyłączenie wszystkich dostępnych skrótów w aplikacjach.", + "Disable all keyboard shortcuts" : "Wyłącz wszystkie skróty klawiaturowe", + "Current selected app: {app}, position {position} of {total}" : "Aktualnie wybrana aplikacja: {app}, pozycja {position} z {total}", + "Move up" : "Przenieś wyżej", + "Move down" : "Przenieś niżej", + "Select a background from your files" : "Wybierz tło ze swoich Plików", + "Select background" : "Wybierz tło", + "No background has been selected" : "Nie wybrano tła", + "Custom background" : "Tło niestandardowe", + "Plain background" : "Zwykłe tło", + "Default background" : "Tło domyślne", + "Theme selection is enforced" : "Wybór motywu jest wymuszony", + "Could not set the app order" : "Nie można ustawić kolejności aplikacji", + "Could not reset the app order" : "Nie można zresetować kolejności aplikacji", + "Navigation bar settings" : "Ustawienia paska nawigacji", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Możesz skonfigurować kolejność aplikacji używaną na pasku nawigacyjnym. Pierwsza będzie aplikacja domyślna, otwierana po zalogowaniu lub kliknięciu na logo.", + "The default app can not be changed because it was configured by the administrator." : "Domyślnej aplikacji nie można zmienić, ponieważ została skonfigurowana przez administratora.", + "The app order was changed, to see it in action you have to reload the page." : "Kolejność aplikacji została zmieniona, aby zobaczyć ją po zmianie, należy ponownie załadować stronę.", + "Reset default app order" : "Zresetuj domyślną kolejność aplikacji", + "Could not set primary color" : "Nie udało się ustawić podstawowego koloru", + "Reset primary color" : "Resetuj kolor podstawowy", + "Could not set global default apps" : "Nie można ustawić globalnych aplikacji domyślnych", + "Default app" : "Aplikacja domyślna", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Domyślną aplikacją jest aplikacja będąca np. otwierana po zalogowaniu lub kliknięciu logo w menu.", + "Use custom default app" : "Użyj własnej aplikacji domyślnej", + "Global default app" : "Globalna aplikacja domyślna", + "Global default apps" : "Globalne aplikacje domyślne", + "Default app priority" : "Domyślny priorytet aplikacji", + "If an app is not enabled for a user, the next app with lower priority is used." : "Jeśli aplikacja nie jest włączona dla użytkownika, używana jest następna aplikacja o niższym priorytecie.", + "Select a custom color" : "Wybierz kolor niestandardowy", + "Reset to default" : "Przywróć domyślne", + "Upload" : "Wyślij", + "Remove background image" : "Usuń obraz tła", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uniwersalny dostęp jest dla nas bardzo ważny. Przestrzegamy standardów internetowych i sprawdzamy, aby wszystko było użyteczne również bez myszy i oprogramowania pomocniczego, takiego jak czytniki ekranu. Naszym celem jest zgodność z {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 na poziomie AA, z motywem o wysokim kontraście nawet na poziomie AAA.", + ". Unable to apply the setting." : ". Nie udało się zapisać ustawień." +},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/pt_BR.js b/apps/theming/l10n/pt_BR.js new file mode 100644 index 00000000000..6e455a29922 --- /dev/null +++ b/apps/theming/l10n/pt_BR.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "O nome é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", + "The given web address is not a valid URL" : "O endereço web não é uma URL válida", + "The given legal notice address is too long" : "O endereço do aviso legal é muito longo", + "The given legal notice address is not a valid URL" : "O endereço do aviso legal não é uma URL válida", + "The given privacy policy address is too long" : "O endereço da política de privacidade é muito longo", + "The given privacy policy address is not a valid URL" : "O endereço da política de privacidade não é uma URL válida", + "The given slogan is too long" : "O slogan dado é muito longo", + "The given color is invalid" : "A cor fornecida é inválida", + "Disable-user-theming should be true or false" : "A configuração \"disable-user-theming\" (desabilitar temas do usuário) deve ser \"true\" ou \"false\"", + "Saved" : "Salva", + "Invalid app given" : "Aplicativo inválido fornecido", + "Invalid type for setting \"defaultApp\" given" : "Tipo inválido para configuração \"defaultApp\" fornecido", + "Invalid setting key" : "Chave de configuração inválida", + "The file was uploaded" : "O arquivo foi enviado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O arquivo enviado excede a diretiva upload_max_filesize do php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O arquivo enviado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML", + "The file was only partially uploaded" : "O aquivo foi parcialmente enviado", + "No file was uploaded" : "Nenhum arquivo foi enviado", + "Missing a temporary folder" : "Falta uma pasta temporária", + "Could not write file to disk" : "Não foi possível escrever no disco", + "A PHP extension stopped the file upload" : "Uma extensão PHP parou o upload do arquivo", + "No file uploaded" : "Nenhum arquivo enviado", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Você já está usando um tema personalizado. As configurações do aplicativo Theming podem ser sobrescritas por isso.", + "Theming" : "Personalização", + "Appearance and accessibility" : "Aparência e acessibilidade", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "O módulo PHP \"imagick\" não está habilitado, embora o aplicativo de temas esteja. Para que a geração de favicon funcione corretamente, você precisa instalar e habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "O módulo PHP \"imagick\" nesta instância não tem suporte a SVG. Para melhor compatibilidade é recomendado instalá-lo.", + "Dark theme with high contrast mode" : "Tema escuro com modo de alto contraste", + "Enable dark high contrast mode" : "Ativar o modo escuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Semelhante ao modo de alto contraste, mas com cores escuras.", + "Dark theme" : "Tema escuro", + "Enable dark theme" : "Ativar o tema escuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Um tema escuro para aliviar seus olhos, reduzindo a luminosidade e o brilho gerais.", + "System default theme" : "Tema padrão do sistema", + "Enable the system default" : "Ativar o padrão do sistema", + "Using the default system appearance." : "Usando a aparência padrão do sistema.", + "Dyslexia font" : "Fonte para dislexia", + "Enable dyslexia font" : "Ativar fonte para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic é um tipo de letra/fonte grátis concebida para atenuar alguns dos erros comuns de leitura causados pela dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Ativar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "O modo de alto contraste facilita a navegação. A qualidade visual será reduzida, mas a clareza será aumentada.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Ativar o tema claro padrão", + "The default light appearance." : "A aparência clara padrão.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidade", + "Adjust the Nextcloud theme" : "Ajustar o tema do Nextcloud", + "Name" : "Nome", + "Web link" : "Link web", + "a safe home for all your data" : "um lugar seguro para seus dados", + "Slogan" : "Slogan", + "Primary color" : "Cor primária", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "A cor primária é usada para destacar elementos como botões importantes. Ela pode ser ligeiramente ajustado, dependendo do esquema de cores atual.", + "Legal notice link" : "Link do aviso legal", + "Privacy policy link" : "Link da política de privacidade", + "Header logo" : "Logotipo de cabeçalho", + "Upload new header logo" : "Enviar novo logotipo de cabeçalho", + "Favicon" : "Ícone de favoritos", + "Upload new favicon" : "Enviar novo ícone de favorito", + "User settings" : "Configurações de usuário", + "Disable user theming" : "Desabilitar temas do usuário", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Embora você possa selecionar e personalizar a sua instância, os usuários podem alterar seu plano de fundo e as cores. Se você quiser forçar a sua personalização, marque esta caixa.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível para todos os usuários.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Em vez de uma imagem de fundo você também pode configurar uma cor de fundo lisa. Se você usar uma imagem de fundo, a alteração dessa cor influenciará a cor dos ícones do menu do aplicativo.", + "Background color" : "Cor de fundo", + "Upload new logo" : "Enviar novo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Carregar nova imagem de fundo e de login", + "Background and login image" : "Plano de fundo e imagem de login", + "Advanced options" : "Opções avançadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP ImageMagick com suporte para imagens SVG para gerar automaticamente favicons com base no logotipo carregado e na cor.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "O acesso universal é muito importante para nós. Seguimos os padrões da Web e verificamos se tudo pode ser usado também sem mouse e com software de assistência, como leitores de tela. Nosso objetivo é estar em conformidade com as {linkstart}Diretrizes de Acessibilidade para Conteúdo da Web{linkend} 2.1 (Web Content Accessibility Guidelines 2.1) no nível AA, com o tema de alto contraste até mesmo no nível AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se você encontrar algum problema, não hesite em relatá-lo em {issuetracker}nosso rastreador de problemas{linkend}. E se você quiser se envolver, junte-se a {designteam}nossa equipe de design{linkend}!", + "Unable to apply the setting." : "Não foi possível aplicar a configuração.", + "Appearance and accessibility settings" : "Configurações de aparência e acessibilidade", + "Misc accessibility options" : "Opções de acessibilidade diversas", + "Enable blur background filter (may increase GPU load)" : "Ativar o filtro de desfoque de fundo (pode aumentar a carga da GPU)", + "Customization has been disabled by your administrator" : "A personalização foi desativada por seu administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Defina uma cor primária para destacar elementos importantes. A cor usada para elementos como botões primários pode ser um pouco diferente, pois é ajustada para atender aos requisitos de acessibilidade.", + "Background and color" : "Plano de fundo e cor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "O plano de fundo pode ser definido como uma imagem do conjunto padrão, uma imagem personalizada carregada ou uma cor lisa.", + "Keyboard shortcuts" : "Atalhos do teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Em alguns casos, os atalhos de teclado podem interferir nas ferramentas de acessibilidade. Para permitir o foco em sua ferramenta corretamente, você pode desabilitar todos os atalhos de teclado aqui. Isso também desabilitará todos os atalhos disponíveis nos aplicativos.", + "Disable all keyboard shortcuts" : "Desabilitar todos os atalhos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicativo atualmente selecionado: {app}, posição {position} de {total}", + "Move up" : "Mover para cima", + "Move down" : "Mover para baixo", + "Select a background from your files" : "Selecione um plano de fundo de seus arquivos", + "Select background" : "Selecione plano de fundo", + "No background has been selected" : "Nenhum plano de fundo foi selecionado", + "Custom background" : "Plano de fundo personalizado", + "Plain background" : "Plano de fundo liso", + "Default background" : "Plano de fundo padrão", + "Theme selection is enforced" : "A seleção do tema é imposta", + "Could not set the app order" : "Não foi possível definir a ordem dos aplicativos", + "Could not reset the app order" : "Não foi possível redefinir a ordem dos aplicativos", + "Navigation bar settings" : "Configurações da barra de navegação", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Você pode configurar a ordem dos aplicativos usada na barra de navegação. A primeira entrada será o aplicativo padrão, aberto após o login ou ao clicar no logotipo.", + "The default app can not be changed because it was configured by the administrator." : "O aplicativo padrão não pode ser alterado porque foi configurado pelo administrador.", + "The app order was changed, to see it in action you have to reload the page." : "A ordem dos aplicativos foi alterada, para vê-la em ação é necessário recarregar a página.", + "Reset default app order" : "Redefinir a ordem padrão dos aplicativos", + "Could not set primary color" : "Não foi possível definir a cor primária", + "Reset primary color" : "Redefinir cor primária", + "Could not set global default apps" : "Não foi possível definir aplicativos padrão globais", + "Default app" : "Aplicativo padrão", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "O aplicativo padrão é o aplicativo que é, p. ex., aberto após o login ou quando o logotipo no menu é clicado.", + "Use custom default app" : "Usar aplicativo padrão personalizado", + "Global default app" : "Aplicativo padrão global", + "Global default apps" : "Aplicativos padrão globais", + "Default app priority" : "Prioridade padrão de aplicativos", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se um aplicativo não estiver habilitado para um usuário, o próximo aplicativo com prioridade mais baixa será usado.", + "Select a custom color" : "Selecione uma cor personalizada", + "Reset to default" : "Redefinir para o padrão", + "Upload" : "Carregar", + "Remove background image" : "Excluir a imagem de fundo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "O acesso universal é muito importante para nós. Seguimos os padrões da Web e verificamos se tudo pode ser usado também sem mouse e com software de assistência, como leitores de tela. Nosso objetivo é estar em conformidade com as {guidelines}Diretrizes de Acessibilidade para Conteúdo da Web{linkend} 2.1 (Web Content Accessibility Guidelines 2.1) no nível AA, com o tema de alto contraste, mesmo no nível AAA.", + ". Unable to apply the setting." : ". Não foi possível aplicar a configuração." +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/theming/l10n/pt_BR.json b/apps/theming/l10n/pt_BR.json new file mode 100644 index 00000000000..18160e12ccf --- /dev/null +++ b/apps/theming/l10n/pt_BR.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "O nome é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", + "The given web address is not a valid URL" : "O endereço web não é uma URL válida", + "The given legal notice address is too long" : "O endereço do aviso legal é muito longo", + "The given legal notice address is not a valid URL" : "O endereço do aviso legal não é uma URL válida", + "The given privacy policy address is too long" : "O endereço da política de privacidade é muito longo", + "The given privacy policy address is not a valid URL" : "O endereço da política de privacidade não é uma URL válida", + "The given slogan is too long" : "O slogan dado é muito longo", + "The given color is invalid" : "A cor fornecida é inválida", + "Disable-user-theming should be true or false" : "A configuração \"disable-user-theming\" (desabilitar temas do usuário) deve ser \"true\" ou \"false\"", + "Saved" : "Salva", + "Invalid app given" : "Aplicativo inválido fornecido", + "Invalid type for setting \"defaultApp\" given" : "Tipo inválido para configuração \"defaultApp\" fornecido", + "Invalid setting key" : "Chave de configuração inválida", + "The file was uploaded" : "O arquivo foi enviado", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O arquivo enviado excede a diretiva upload_max_filesize do php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O arquivo enviado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML", + "The file was only partially uploaded" : "O aquivo foi parcialmente enviado", + "No file was uploaded" : "Nenhum arquivo foi enviado", + "Missing a temporary folder" : "Falta uma pasta temporária", + "Could not write file to disk" : "Não foi possível escrever no disco", + "A PHP extension stopped the file upload" : "Uma extensão PHP parou o upload do arquivo", + "No file uploaded" : "Nenhum arquivo enviado", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Você já está usando um tema personalizado. As configurações do aplicativo Theming podem ser sobrescritas por isso.", + "Theming" : "Personalização", + "Appearance and accessibility" : "Aparência e acessibilidade", + "PHP Imagick module" : "Módulo PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "O módulo PHP \"imagick\" não está habilitado, embora o aplicativo de temas esteja. Para que a geração de favicon funcione corretamente, você precisa instalar e habilitar este módulo.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "O módulo PHP \"imagick\" nesta instância não tem suporte a SVG. Para melhor compatibilidade é recomendado instalá-lo.", + "Dark theme with high contrast mode" : "Tema escuro com modo de alto contraste", + "Enable dark high contrast mode" : "Ativar o modo escuro de alto contraste", + "Similar to the high contrast mode, but with dark colours." : "Semelhante ao modo de alto contraste, mas com cores escuras.", + "Dark theme" : "Tema escuro", + "Enable dark theme" : "Ativar o tema escuro", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Um tema escuro para aliviar seus olhos, reduzindo a luminosidade e o brilho gerais.", + "System default theme" : "Tema padrão do sistema", + "Enable the system default" : "Ativar o padrão do sistema", + "Using the default system appearance." : "Usando a aparência padrão do sistema.", + "Dyslexia font" : "Fonte para dislexia", + "Enable dyslexia font" : "Ativar fonte para dislexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic é um tipo de letra/fonte grátis concebida para atenuar alguns dos erros comuns de leitura causados pela dislexia.", + "High contrast mode" : "Modo de alto contraste", + "Enable high contrast mode" : "Ativar modo de alto contraste", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "O modo de alto contraste facilita a navegação. A qualidade visual será reduzida, mas a clareza será aumentada.", + "Light theme" : "Tema claro", + "Enable the default light theme" : "Ativar o tema claro padrão", + "The default light appearance." : "A aparência clara padrão.", + "Legal notice" : "Aviso legal", + "Privacy policy" : "Política de privacidade", + "Adjust the Nextcloud theme" : "Ajustar o tema do Nextcloud", + "Name" : "Nome", + "Web link" : "Link web", + "a safe home for all your data" : "um lugar seguro para seus dados", + "Slogan" : "Slogan", + "Primary color" : "Cor primária", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "A cor primária é usada para destacar elementos como botões importantes. Ela pode ser ligeiramente ajustado, dependendo do esquema de cores atual.", + "Legal notice link" : "Link do aviso legal", + "Privacy policy link" : "Link da política de privacidade", + "Header logo" : "Logotipo de cabeçalho", + "Upload new header logo" : "Enviar novo logotipo de cabeçalho", + "Favicon" : "Ícone de favoritos", + "Upload new favicon" : "Enviar novo ícone de favorito", + "User settings" : "Configurações de usuário", + "Disable user theming" : "Desabilitar temas do usuário", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Embora você possa selecionar e personalizar a sua instância, os usuários podem alterar seu plano de fundo e as cores. Se você quiser forçar a sua personalização, marque esta caixa.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível para todos os usuários.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Em vez de uma imagem de fundo você também pode configurar uma cor de fundo lisa. Se você usar uma imagem de fundo, a alteração dessa cor influenciará a cor dos ícones do menu do aplicativo.", + "Background color" : "Cor de fundo", + "Upload new logo" : "Enviar novo logotipo", + "Logo" : "Logotipo", + "Upload new background and login image" : "Carregar nova imagem de fundo e de login", + "Background and login image" : "Plano de fundo e imagem de login", + "Advanced options" : "Opções avançadas", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP ImageMagick com suporte para imagens SVG para gerar automaticamente favicons com base no logotipo carregado e na cor.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "O acesso universal é muito importante para nós. Seguimos os padrões da Web e verificamos se tudo pode ser usado também sem mouse e com software de assistência, como leitores de tela. Nosso objetivo é estar em conformidade com as {linkstart}Diretrizes de Acessibilidade para Conteúdo da Web{linkend} 2.1 (Web Content Accessibility Guidelines 2.1) no nível AA, com o tema de alto contraste até mesmo no nível AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Se você encontrar algum problema, não hesite em relatá-lo em {issuetracker}nosso rastreador de problemas{linkend}. E se você quiser se envolver, junte-se a {designteam}nossa equipe de design{linkend}!", + "Unable to apply the setting." : "Não foi possível aplicar a configuração.", + "Appearance and accessibility settings" : "Configurações de aparência e acessibilidade", + "Misc accessibility options" : "Opções de acessibilidade diversas", + "Enable blur background filter (may increase GPU load)" : "Ativar o filtro de desfoque de fundo (pode aumentar a carga da GPU)", + "Customization has been disabled by your administrator" : "A personalização foi desativada por seu administrador", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Defina uma cor primária para destacar elementos importantes. A cor usada para elementos como botões primários pode ser um pouco diferente, pois é ajustada para atender aos requisitos de acessibilidade.", + "Background and color" : "Plano de fundo e cor", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "O plano de fundo pode ser definido como uma imagem do conjunto padrão, uma imagem personalizada carregada ou uma cor lisa.", + "Keyboard shortcuts" : "Atalhos do teclado", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Em alguns casos, os atalhos de teclado podem interferir nas ferramentas de acessibilidade. Para permitir o foco em sua ferramenta corretamente, você pode desabilitar todos os atalhos de teclado aqui. Isso também desabilitará todos os atalhos disponíveis nos aplicativos.", + "Disable all keyboard shortcuts" : "Desabilitar todos os atalhos de teclado", + "Current selected app: {app}, position {position} of {total}" : "Aplicativo atualmente selecionado: {app}, posição {position} de {total}", + "Move up" : "Mover para cima", + "Move down" : "Mover para baixo", + "Select a background from your files" : "Selecione um plano de fundo de seus arquivos", + "Select background" : "Selecione plano de fundo", + "No background has been selected" : "Nenhum plano de fundo foi selecionado", + "Custom background" : "Plano de fundo personalizado", + "Plain background" : "Plano de fundo liso", + "Default background" : "Plano de fundo padrão", + "Theme selection is enforced" : "A seleção do tema é imposta", + "Could not set the app order" : "Não foi possível definir a ordem dos aplicativos", + "Could not reset the app order" : "Não foi possível redefinir a ordem dos aplicativos", + "Navigation bar settings" : "Configurações da barra de navegação", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Você pode configurar a ordem dos aplicativos usada na barra de navegação. A primeira entrada será o aplicativo padrão, aberto após o login ou ao clicar no logotipo.", + "The default app can not be changed because it was configured by the administrator." : "O aplicativo padrão não pode ser alterado porque foi configurado pelo administrador.", + "The app order was changed, to see it in action you have to reload the page." : "A ordem dos aplicativos foi alterada, para vê-la em ação é necessário recarregar a página.", + "Reset default app order" : "Redefinir a ordem padrão dos aplicativos", + "Could not set primary color" : "Não foi possível definir a cor primária", + "Reset primary color" : "Redefinir cor primária", + "Could not set global default apps" : "Não foi possível definir aplicativos padrão globais", + "Default app" : "Aplicativo padrão", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "O aplicativo padrão é o aplicativo que é, p. ex., aberto após o login ou quando o logotipo no menu é clicado.", + "Use custom default app" : "Usar aplicativo padrão personalizado", + "Global default app" : "Aplicativo padrão global", + "Global default apps" : "Aplicativos padrão globais", + "Default app priority" : "Prioridade padrão de aplicativos", + "If an app is not enabled for a user, the next app with lower priority is used." : "Se um aplicativo não estiver habilitado para um usuário, o próximo aplicativo com prioridade mais baixa será usado.", + "Select a custom color" : "Selecione uma cor personalizada", + "Reset to default" : "Redefinir para o padrão", + "Upload" : "Carregar", + "Remove background image" : "Excluir a imagem de fundo", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "O acesso universal é muito importante para nós. Seguimos os padrões da Web e verificamos se tudo pode ser usado também sem mouse e com software de assistência, como leitores de tela. Nosso objetivo é estar em conformidade com as {guidelines}Diretrizes de Acessibilidade para Conteúdo da Web{linkend} 2.1 (Web Content Accessibility Guidelines 2.1) no nível AA, com o tema de alto contraste, mesmo no nível AAA.", + ". Unable to apply the setting." : ". Não foi possível aplicar a configuração." +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ru.js b/apps/theming/l10n/ru.js new file mode 100644 index 00000000000..a31a75731c9 --- /dev/null +++ b/apps/theming/l10n/ru.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Указанное название слишком длинное", + "The given web address is too long" : "Указанный веб-адрес слишком длинный", + "The given web address is not a valid URL" : "Указанный веб-адрес не является действительным URL", + "The given legal notice address is too long" : "Указанный адрес на официальное уведомление слишком длинный", + "The given legal notice address is not a valid URL" : "Указанный адрес на официальное уведомление не является действительным URL", + "The given privacy policy address is too long" : "Указанный адрес политики конфиденциальности слишком длинный", + "The given privacy policy address is not a valid URL" : "Указанный адрес политики конфиденциальности не является действительным URL", + "The given slogan is too long" : "Указанный слоган слишком длинный", + "The given color is invalid" : "Задан неправильный цвет", + "Disable-user-theming should be true or false" : "Disable-user-theming должен быть true или false", + "Saved" : "Сохранено", + "Invalid app given" : "Указано неверное приложение.", + "Invalid type for setting \"defaultApp\" given" : "Указан неверный тип для настройки \"defaultApp\"", + "Invalid setting key" : "Неверный ключ настройки", + "The file was uploaded" : "Файл был загружен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размер переданного файла превышает установленный предел upload_max_filesize в php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размер переданного файла превышает установленный предел MAX_FILE_SIZE в HTML-форме", + "The file was only partially uploaded" : "Файл был получен частично", + "No file was uploaded" : "Не было отправлено ни одного файла", + "Missing a temporary folder" : "Отсутствует временный каталог", + "Could not write file to disk" : "Невозможно записать файл на диск", + "A PHP extension stopped the file upload" : "Расширение PHP прервало загрузку файла", + "No file uploaded" : "Нет загруженных файлов", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Вы уже используете настраиваемое оформление, которое может быть перезаписано этим приложением.", + "Theming" : "Внешний вид", + "Appearance and accessibility" : "Внешний вид и доступность", + "PHP Imagick module" : "PHP модуль Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Для создания значка favicon приложением «Оформления» необходимо установить и активировать модуль «imagic» подсистемы PHP. ", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Модуль PHP \"imagick\" в данном случае не имеет поддержки SVG. Для лучшей совместимости рекомендуется его установить.", + "Dark theme with high contrast mode" : "Темная тема с режимом высокой контрастности", + "Enable dark high contrast mode" : "Включить темную тему в режиме высокой контрастности", + "Similar to the high contrast mode, but with dark colours." : "Аналогично режиму высокой контрастности, но с использованием темных цветов.", + "Dark theme" : "Тёмное оформление", + "Enable dark theme" : "Использовать тёмное оформление", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темная тема для облегчения работы ваших глаз за счет уменьшения общей яркости.", + "System default theme" : "Системная тема по умолчанию", + "Enable the system default" : "Включить системную тему по умолчанию", + "Using the default system appearance." : "Используется внешний вид системы по умолчанию.", + "Dyslexia font" : "Шрифт Dyslexia", + "Enable dyslexia font" : "Использовать шрифт Dyslexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic — бесплатный шрифт, который смягчает некоторые распространённые ошибки чтения, вызываемые дислексией.", + "High contrast mode" : "Режим высокой контрастности", + "Enable high contrast mode" : "Включить режим высокой контрастности", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Этот режим делает ярлыки и кнопки меню более чёткими за счёт уменьшения качества.", + "Light theme" : "Светлая тема", + "Enable the default light theme" : "Включить светлую тему по умолчанию", + "The default light appearance." : "Подсветка по умолчанию.", + "Legal notice" : "Официальное уведомление", + "Privacy policy" : "Политика конфиденциальности", + "Adjust the Nextcloud theme" : "Скорректируйте тему Nextcloud'а", + "Name" : "Название", + "Web link" : "Ссылка", + "a safe home for all your data" : "надёжный дом для всех ваших данных", + "Slogan" : "Слоган", + "Primary color" : "Основной цвет", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Основной цвет используется для выделения таких элементов, как важные кнопки. Он может быть немного изменен в зависимости от текущей цветовой схемы.", + "Legal notice link" : "Ссылка на официальное уведомление", + "Privacy policy link" : "Ссылка на политику конфиденциальности", + "Header logo" : "Логотип заголовка", + "Upload new header logo" : "Загрузить логотип заголовка", + "Favicon" : "Favicon (значок сайта)", + "Upload new favicon" : "Загрузить значок сайта", + "User settings" : "Параметры пользователя", + "Disable user theming" : "Отключить выбор темы для пользователей", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Хотя вы можете выбрать и настроить свой экземпляр, пользователи могут изменять свой фон и цвета. Если вы хотите принудительно применить свои настройки для всех, вы можете включить это.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Этот модуль позволяют настроить внешний вид сервера и поддерживаемых клиентов. Настройки, определённые в этом модуле, распространяются на всех пользователей.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Вместо фонового изображения вы также можете настроить простой цвет фона. Если вы используете фоновое изображение, изменение этого цвета повлияет на цвет иконок меню приложения.", + "Background color" : "Цвет фона", + "Upload new logo" : "Загрузить новый логотип", + "Logo" : "Логотип", + "Upload new background and login image" : "Загрузите новое фоновое изображение и изображение для входа в систему", + "Background and login image" : "Фоновое изображение и изображение входа в систему", + "Advanced options" : "Дополнительные параметры", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Для автоматической генерации favicon на основе загруженного логотипа и цвета нужно установить PHP расширение ImageMagick с поддержкой изображений SVG ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универсальный доступ очень важен для нас. Мы следуем веб-стандартам и проверяем, чтобы всё было пригодно для использования без мыши и вспомогательного программного обеспечения, такого как программы чтения с экрана. Мы стремимся соответствовать {linkstart}Руководству по обеспечению доступности веб-контента{linkend} 2.1 на уровне AA, а с темой высокой контрастности — даже на уровне AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}нашей команде дизайнеров{linkend}!", + "Unable to apply the setting." : "Невозможно применить настройку.", + "Appearance and accessibility settings" : "Внешний вид и доступность", + "Misc accessibility options" : "Различные параметры специальных возможностей", + "Enable blur background filter (may increase GPU load)" : "Включить фильтр размытия фона (может увеличить нагрузку на графический процессор)", + "Customization has been disabled by your administrator" : "Настройка тем была отключена вашим администратором", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Выберите основной цвет, чтобы выделить важные элементы. Цвет, используемый для таких элементов, как основные кнопки, может немного отличаться при настройке в соответствии с требованиями к доступности.", + "Background and color" : "Фон и цвет", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "В качестве фона можно выбрать изображение из набора по умолчанию, пользовательское загруженное изображение или обычный цвет.", + "Keyboard shortcuts" : "Сочетания клавиш", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "В некоторых случаях сочетания клавиш могут мешать работе инструментов специальных возможностей. Чтобы правильно сфокусироваться на вашем инструменте, вы можете отключить здесь все сочетания клавиш. Это также отключит все доступные ярлыки в приложениях.", + "Disable all keyboard shortcuts" : "Отключить все сочетания клавиш", + "Current selected app: {app}, position {position} of {total}" : "Текущее выбранное приложение: {app}, позиция {position} из {total}", + "Move up" : "Переместить выше", + "Move down" : "Переместить ниже", + "Select a background from your files" : "Выберите фон из ваших файлов", + "Select background" : "Выбрать фоновое изображение", + "No background has been selected" : "Фоновое изображение не было выбрано", + "Custom background" : "Пользовательский фон", + "Plain background" : "Обычный фон", + "Default background" : "Фоновое изображение по умолчанию", + "Theme selection is enforced" : "Выбор темы принудительно", + "Could not set the app order" : "Не удалось изменить порядок приложений", + "Could not reset the app order" : "Не удалось восстановить порядок приложений", + "Navigation bar settings" : "Параметры панели навигации", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Вы можете настроить порядок приложений в панели навигации. Первая запись будет приложением по умолчанию, и будет открываться после авторизации или при нажатии на логотип.", + "The default app can not be changed because it was configured by the administrator." : "Приложение по умолчанию не может быть изменено, поскольку оно настроено администратором.", + "The app order was changed, to see it in action you have to reload the page." : "Порядок приложений изменен, чтобы увидеть изменения необходимо перезагрузить страницу.", + "Reset default app order" : "Восстановить порядок приложений", + "Could not set primary color" : "Не удалось установить основной цвет", + "Reset primary color" : "Сброс основного цвета", + "Could not set global default apps" : "Не удалось установить глобальные приложения по умолчанию.", + "Default app" : "Приложение по умолчанию", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Приложение по умолчанию - это приложение, которое открывается, например, после входа в систему или при нажатии на логотип в меню.", + "Use custom default app" : "Использовать пользовательское приложение по умолчанию", + "Global default app" : "Глобальное приложение по умолчанию", + "Global default apps" : "Глобальные приложения по умолчанию", + "Default app priority" : "Приоритет приложения по умолчанию", + "If an app is not enabled for a user, the next app with lower priority is used." : "Если приложение не включено для пользователя, используется следующее приложение с более низким приоритетом.", + "Select a custom color" : "Выберать собственный цвет", + "Reset to default" : "Сбросить изменения", + "Upload" : "Отправить", + "Remove background image" : "Убрать фоновое изображение ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Доступная среда очень важна для нас. При разработке мы следуем веб-стандартам, контролируя возможность пользования всем сервисом без помощи мыши и с использованием вспомогательных программ, например, выполняющих чтение с экрана. Мы стремимся к выполнению рекомендаций {guidelines}Руководства доступности Веб-Контента{linkend} 2.1 на уровне АА, а при использовании режима высокой контрастности — даже на уровне ААА.", + ". Unable to apply the setting." : ". Невозможно применить настройку." +}, +"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/theming/l10n/ru.json b/apps/theming/l10n/ru.json new file mode 100644 index 00000000000..e7b99b0a47a --- /dev/null +++ b/apps/theming/l10n/ru.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Указанное название слишком длинное", + "The given web address is too long" : "Указанный веб-адрес слишком длинный", + "The given web address is not a valid URL" : "Указанный веб-адрес не является действительным URL", + "The given legal notice address is too long" : "Указанный адрес на официальное уведомление слишком длинный", + "The given legal notice address is not a valid URL" : "Указанный адрес на официальное уведомление не является действительным URL", + "The given privacy policy address is too long" : "Указанный адрес политики конфиденциальности слишком длинный", + "The given privacy policy address is not a valid URL" : "Указанный адрес политики конфиденциальности не является действительным URL", + "The given slogan is too long" : "Указанный слоган слишком длинный", + "The given color is invalid" : "Задан неправильный цвет", + "Disable-user-theming should be true or false" : "Disable-user-theming должен быть true или false", + "Saved" : "Сохранено", + "Invalid app given" : "Указано неверное приложение.", + "Invalid type for setting \"defaultApp\" given" : "Указан неверный тип для настройки \"defaultApp\"", + "Invalid setting key" : "Неверный ключ настройки", + "The file was uploaded" : "Файл был загружен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размер переданного файла превышает установленный предел upload_max_filesize в php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размер переданного файла превышает установленный предел MAX_FILE_SIZE в HTML-форме", + "The file was only partially uploaded" : "Файл был получен частично", + "No file was uploaded" : "Не было отправлено ни одного файла", + "Missing a temporary folder" : "Отсутствует временный каталог", + "Could not write file to disk" : "Невозможно записать файл на диск", + "A PHP extension stopped the file upload" : "Расширение PHP прервало загрузку файла", + "No file uploaded" : "Нет загруженных файлов", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Вы уже используете настраиваемое оформление, которое может быть перезаписано этим приложением.", + "Theming" : "Внешний вид", + "Appearance and accessibility" : "Внешний вид и доступность", + "PHP Imagick module" : "PHP модуль Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Для создания значка favicon приложением «Оформления» необходимо установить и активировать модуль «imagic» подсистемы PHP. ", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Модуль PHP \"imagick\" в данном случае не имеет поддержки SVG. Для лучшей совместимости рекомендуется его установить.", + "Dark theme with high contrast mode" : "Темная тема с режимом высокой контрастности", + "Enable dark high contrast mode" : "Включить темную тему в режиме высокой контрастности", + "Similar to the high contrast mode, but with dark colours." : "Аналогично режиму высокой контрастности, но с использованием темных цветов.", + "Dark theme" : "Тёмное оформление", + "Enable dark theme" : "Использовать тёмное оформление", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темная тема для облегчения работы ваших глаз за счет уменьшения общей яркости.", + "System default theme" : "Системная тема по умолчанию", + "Enable the system default" : "Включить системную тему по умолчанию", + "Using the default system appearance." : "Используется внешний вид системы по умолчанию.", + "Dyslexia font" : "Шрифт Dyslexia", + "Enable dyslexia font" : "Использовать шрифт Dyslexia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic — бесплатный шрифт, который смягчает некоторые распространённые ошибки чтения, вызываемые дислексией.", + "High contrast mode" : "Режим высокой контрастности", + "Enable high contrast mode" : "Включить режим высокой контрастности", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Этот режим делает ярлыки и кнопки меню более чёткими за счёт уменьшения качества.", + "Light theme" : "Светлая тема", + "Enable the default light theme" : "Включить светлую тему по умолчанию", + "The default light appearance." : "Подсветка по умолчанию.", + "Legal notice" : "Официальное уведомление", + "Privacy policy" : "Политика конфиденциальности", + "Adjust the Nextcloud theme" : "Скорректируйте тему Nextcloud'а", + "Name" : "Название", + "Web link" : "Ссылка", + "a safe home for all your data" : "надёжный дом для всех ваших данных", + "Slogan" : "Слоган", + "Primary color" : "Основной цвет", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Основной цвет используется для выделения таких элементов, как важные кнопки. Он может быть немного изменен в зависимости от текущей цветовой схемы.", + "Legal notice link" : "Ссылка на официальное уведомление", + "Privacy policy link" : "Ссылка на политику конфиденциальности", + "Header logo" : "Логотип заголовка", + "Upload new header logo" : "Загрузить логотип заголовка", + "Favicon" : "Favicon (значок сайта)", + "Upload new favicon" : "Загрузить значок сайта", + "User settings" : "Параметры пользователя", + "Disable user theming" : "Отключить выбор темы для пользователей", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Хотя вы можете выбрать и настроить свой экземпляр, пользователи могут изменять свой фон и цвета. Если вы хотите принудительно применить свои настройки для всех, вы можете включить это.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Этот модуль позволяют настроить внешний вид сервера и поддерживаемых клиентов. Настройки, определённые в этом модуле, распространяются на всех пользователей.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Вместо фонового изображения вы также можете настроить простой цвет фона. Если вы используете фоновое изображение, изменение этого цвета повлияет на цвет иконок меню приложения.", + "Background color" : "Цвет фона", + "Upload new logo" : "Загрузить новый логотип", + "Logo" : "Логотип", + "Upload new background and login image" : "Загрузите новое фоновое изображение и изображение для входа в систему", + "Background and login image" : "Фоновое изображение и изображение входа в систему", + "Advanced options" : "Дополнительные параметры", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Для автоматической генерации favicon на основе загруженного логотипа и цвета нужно установить PHP расширение ImageMagick с поддержкой изображений SVG ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универсальный доступ очень важен для нас. Мы следуем веб-стандартам и проверяем, чтобы всё было пригодно для использования без мыши и вспомогательного программного обеспечения, такого как программы чтения с экрана. Мы стремимся соответствовать {linkstart}Руководству по обеспечению доступности веб-контента{linkend} 2.1 на уровне AA, а с темой высокой контрастности — даже на уровне AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "При обнаружении ошибок, не стесняйтесь сообщать о них {issuetracker}на наш форум{linkend}. Если Вы заинтересованы в продвижении проекта присоединяйтесь к {designteam}нашей команде дизайнеров{linkend}!", + "Unable to apply the setting." : "Невозможно применить настройку.", + "Appearance and accessibility settings" : "Внешний вид и доступность", + "Misc accessibility options" : "Различные параметры специальных возможностей", + "Enable blur background filter (may increase GPU load)" : "Включить фильтр размытия фона (может увеличить нагрузку на графический процессор)", + "Customization has been disabled by your administrator" : "Настройка тем была отключена вашим администратором", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Выберите основной цвет, чтобы выделить важные элементы. Цвет, используемый для таких элементов, как основные кнопки, может немного отличаться при настройке в соответствии с требованиями к доступности.", + "Background and color" : "Фон и цвет", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "В качестве фона можно выбрать изображение из набора по умолчанию, пользовательское загруженное изображение или обычный цвет.", + "Keyboard shortcuts" : "Сочетания клавиш", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "В некоторых случаях сочетания клавиш могут мешать работе инструментов специальных возможностей. Чтобы правильно сфокусироваться на вашем инструменте, вы можете отключить здесь все сочетания клавиш. Это также отключит все доступные ярлыки в приложениях.", + "Disable all keyboard shortcuts" : "Отключить все сочетания клавиш", + "Current selected app: {app}, position {position} of {total}" : "Текущее выбранное приложение: {app}, позиция {position} из {total}", + "Move up" : "Переместить выше", + "Move down" : "Переместить ниже", + "Select a background from your files" : "Выберите фон из ваших файлов", + "Select background" : "Выбрать фоновое изображение", + "No background has been selected" : "Фоновое изображение не было выбрано", + "Custom background" : "Пользовательский фон", + "Plain background" : "Обычный фон", + "Default background" : "Фоновое изображение по умолчанию", + "Theme selection is enforced" : "Выбор темы принудительно", + "Could not set the app order" : "Не удалось изменить порядок приложений", + "Could not reset the app order" : "Не удалось восстановить порядок приложений", + "Navigation bar settings" : "Параметры панели навигации", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Вы можете настроить порядок приложений в панели навигации. Первая запись будет приложением по умолчанию, и будет открываться после авторизации или при нажатии на логотип.", + "The default app can not be changed because it was configured by the administrator." : "Приложение по умолчанию не может быть изменено, поскольку оно настроено администратором.", + "The app order was changed, to see it in action you have to reload the page." : "Порядок приложений изменен, чтобы увидеть изменения необходимо перезагрузить страницу.", + "Reset default app order" : "Восстановить порядок приложений", + "Could not set primary color" : "Не удалось установить основной цвет", + "Reset primary color" : "Сброс основного цвета", + "Could not set global default apps" : "Не удалось установить глобальные приложения по умолчанию.", + "Default app" : "Приложение по умолчанию", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Приложение по умолчанию - это приложение, которое открывается, например, после входа в систему или при нажатии на логотип в меню.", + "Use custom default app" : "Использовать пользовательское приложение по умолчанию", + "Global default app" : "Глобальное приложение по умолчанию", + "Global default apps" : "Глобальные приложения по умолчанию", + "Default app priority" : "Приоритет приложения по умолчанию", + "If an app is not enabled for a user, the next app with lower priority is used." : "Если приложение не включено для пользователя, используется следующее приложение с более низким приоритетом.", + "Select a custom color" : "Выберать собственный цвет", + "Reset to default" : "Сбросить изменения", + "Upload" : "Отправить", + "Remove background image" : "Убрать фоновое изображение ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Доступная среда очень важна для нас. При разработке мы следуем веб-стандартам, контролируя возможность пользования всем сервисом без помощи мыши и с использованием вспомогательных программ, например, выполняющих чтение с экрана. Мы стремимся к выполнению рекомендаций {guidelines}Руководства доступности Веб-Контента{linkend} 2.1 на уровне АА, а при использовании режима высокой контрастности — даже на уровне ААА.", + ". Unable to apply the setting." : ". Невозможно применить настройку." +},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sc.js b/apps/theming/l10n/sc.js new file mode 100644 index 00000000000..fd75e53174d --- /dev/null +++ b/apps/theming/l10n/sc.js @@ -0,0 +1,88 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Custu nùmene est tropu longu", + "The given web address is too long" : "Custu indiritzu web est tropu longu", + "The given web address is not a valid URL" : "S'indiritzu web dadu no est un'URL bàlidu", + "The given legal notice address is too long" : "S'indiritzu de s'avisu legale dadu est tropu longu", + "The given legal notice address is not a valid URL" : "S'indiritzu de is notas legales dadu no est un'URL bàlidu", + "The given privacy policy address is too long" : "S'indiritzu de su critèriu de riservadesa dadu est tropu longu", + "The given privacy policy address is not a valid URL" : "S'indiritzu de su critèriu de riservadesa dadu no est un'URL bàlidu", + "The given slogan is too long" : "Custu slogan est tropu longu", + "The given color is invalid" : "Custu colore no est bàlidu", + "Saved" : "Sarvadu", + "The file was uploaded" : "S'archìviu est istadu carrigadu", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "S'archìviu carrigadu passat sa diretiva upload_max_filesize in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "S'archìviu carrigadu passat sa diretiva MAX_FILE_SIZE ispetzificada in su mòdulu HTML", + "The file was only partially uploaded" : "S'archìviu est istadu carrigadu isceti in parte", + "No file was uploaded" : "Non s'est carrigadu perunu archìviu", + "Missing a temporary folder" : "Mancat una cartella temporànea", + "Could not write file to disk" : "Non faghet a iscrìere s'archìviu in su discu", + "A PHP extension stopped the file upload" : "Un'estensione PHP at firmadu su carrigamentu de s'archìviu", + "No file uploaded" : "Perunu archìviu carrigadu", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ses giai impreende unu tema personalizadu. Sa cunfiguratzione de s'aplicatzione de is temas si diat pòdere subraiscrìere.", + "Theming" : "Tema", + "Appearance and accessibility" : "Aspetu e atzessibilidade", + "Dark theme with high contrast mode" : "Tema iscuru cun modalidade de cuntrastu artu", + "Enable dark high contrast mode" : "Ativa sa modalidade de cuntrastu artu cun tema iscuru", + "Similar to the high contrast mode, but with dark colours." : "Comente sa modalidade de cuntrastu artu, però cun colores iscuros.", + "Dark theme" : "Tema iscuru ", + "Enable dark theme" : "Ativa su tema iscuru ", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Unu tema iscuru pro agiudare is ogros tuos menguende sa lughe e su lugore generale.", + "System default theme" : "Tema predefinidu de su sistema", + "Enable the system default" : "Ativa cussu predefinidu dae su sistema", + "Using the default system appearance." : "Imperende s'aspetu predefinidu de su sistema.", + "Dyslexia font" : "Font pro dislessia", + "Enable dyslexia font" : "Ativa su font pro dislessia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est unu font lìberu pensadu pro illebiare unos cantos isbàllios comunes de leghidura causados dae sa dislessia.", + "High contrast mode" : "Modalidade cuntrastu artu", + "Enable high contrast mode" : "Ativa sa modalidade cuntrastu altu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Unu cuntrastu artu pro agiudare sa navigatzione tua. S'at a menguare sa calidade de visualizatzione, ma at a crèschere sa craresa.", + "Light theme" : "Tema craru", + "Enable the default light theme" : "Ativa su tema craru predefinidu", + "The default light appearance." : "S'aspetu craru predefinidu.", + "Legal notice" : "Avisu legale", + "Privacy policy" : "Critèriu de riservadesa", + "Adjust the Nextcloud theme" : "Modìfica su tema de Nextcloud", + "Name" : "Nùmene", + "Web link" : "Ligòngiu web", + "a safe home for all your data" : "unu logu seguru pro totu is datos tuos", + "Slogan" : "Slogan", + "Legal notice link" : "Ligòngiu avisu legale", + "Privacy policy link" : "Ligòngiu critèrios de riservadesa", + "Header logo" : "Logo de intestatzione", + "Upload new header logo" : "Càrriga logo de intestatzione nou", + "Favicon" : "Favicon", + "Upload new favicon" : "Càrriga favicon noa", + "User settings" : "Cunfiguratzione de utente", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Sa gestione de is temas faghet chi sa personalizatzione de sa bista de s'istàntzia tua e de is clientes suportados siat prus fàtzile. Custu at a èssere visìbile pro totu is utentes.", + "Upload new logo" : "Càrriga logo nou", + "Logo" : "Logo", + "Upload new background and login image" : "Càrriga s'immàgine de identificatzione e s'isfundu noos", + "Advanced options" : "Sèberos avantzados", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si agatas unu problema, no istentes a ddu sinnalare a {issuetracker}rilevadore de problemas{linkend} nostru. E si nos boles agiudare, intra a s'{designteam}iscuadra de disinnu {linkend} nostra!", + "Appearance and accessibility settings" : "Cunfiguratzione de aspetu e atzessibilidade", + "Misc accessibility options" : "Àteras optziones de atzessibilidade", + "Keyboard shortcuts" : "Curtziadòrgios de tecladu", + "Move up" : "Tràmuda fache a susu", + "Move down" : "Tràmuda fache a bàsciu", + "Select a background from your files" : "Seletziona un'isfundu dae is archìvios tuos", + "Select background" : "Seletziona un'isfundu", + "No background has been selected" : "Perunu isfundu seletzionadu", + "Custom background" : "Isfundu personalizadu", + "Plain background" : "Isfundu simpre", + "Default background" : "Isfundu predefinidu", + "Could not set the app order" : "Impossìbile cunfigurare s'òrdine de is aplicatziones", + "Could not reset the app order" : "Impossìbile resetare s'òrdine de is aplicatziones", + "Navigation bar settings" : "Cunfiguratzione de sa barra de navigatzione", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Podes cunfigurare s'òrdine de is aplicatziones in sa barra de navigatzione. Sa prima intrada at a èssere s'aplicatzione predefinida, chi s'at a abèrrere comente faghes s'atzessu o cando incarcas in su logo.", + "The default app can not be changed because it was configured by the administrator." : "S'aplicatzione predefinida non podet èssere modificada, ca est istada cunfigurada dae s'amministratzione.", + "The app order was changed, to see it in action you have to reload the page." : "S'òrdine de is aplicatziones est istadu modificadu. Pro ddu bìdere, depes torrare a carrigare sa pàgina.", + "Reset default app order" : "Reseta s'òrdine predefinidu de is aplicatziones", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "S'aplicatzione predefinida est cussa chi pro esempru s'at a abèrrere comente faghes s'atzessu o cando incarcas su logo in su menù.", + "Reset to default" : "Torra a sa cunfiguratzione predefinida", + "Upload" : "Càrriga", + "Remove background image" : "Boga immàgine de fundu", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "S'atzessu universale est de importu mannu pro nois. Sighimus is istandard de sa rete e chircamus de fàghere chi totu si potzat impreare chene cursore puru, e cun programmas de assistèntzia comente leghidores de ischermu. S'intentu nostru est de acumprire is inditos de is {guidelines}Lìnias ghia de atzessibilidade pro is cuntenutos de rete{linkend} 2.1 a su livellu AA, cun su tema de cuntrastu artu a su livellu AAA." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/sc.json b/apps/theming/l10n/sc.json new file mode 100644 index 00000000000..298dca47e64 --- /dev/null +++ b/apps/theming/l10n/sc.json @@ -0,0 +1,86 @@ +{ "translations": { + "The given name is too long" : "Custu nùmene est tropu longu", + "The given web address is too long" : "Custu indiritzu web est tropu longu", + "The given web address is not a valid URL" : "S'indiritzu web dadu no est un'URL bàlidu", + "The given legal notice address is too long" : "S'indiritzu de s'avisu legale dadu est tropu longu", + "The given legal notice address is not a valid URL" : "S'indiritzu de is notas legales dadu no est un'URL bàlidu", + "The given privacy policy address is too long" : "S'indiritzu de su critèriu de riservadesa dadu est tropu longu", + "The given privacy policy address is not a valid URL" : "S'indiritzu de su critèriu de riservadesa dadu no est un'URL bàlidu", + "The given slogan is too long" : "Custu slogan est tropu longu", + "The given color is invalid" : "Custu colore no est bàlidu", + "Saved" : "Sarvadu", + "The file was uploaded" : "S'archìviu est istadu carrigadu", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "S'archìviu carrigadu passat sa diretiva upload_max_filesize in php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "S'archìviu carrigadu passat sa diretiva MAX_FILE_SIZE ispetzificada in su mòdulu HTML", + "The file was only partially uploaded" : "S'archìviu est istadu carrigadu isceti in parte", + "No file was uploaded" : "Non s'est carrigadu perunu archìviu", + "Missing a temporary folder" : "Mancat una cartella temporànea", + "Could not write file to disk" : "Non faghet a iscrìere s'archìviu in su discu", + "A PHP extension stopped the file upload" : "Un'estensione PHP at firmadu su carrigamentu de s'archìviu", + "No file uploaded" : "Perunu archìviu carrigadu", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ses giai impreende unu tema personalizadu. Sa cunfiguratzione de s'aplicatzione de is temas si diat pòdere subraiscrìere.", + "Theming" : "Tema", + "Appearance and accessibility" : "Aspetu e atzessibilidade", + "Dark theme with high contrast mode" : "Tema iscuru cun modalidade de cuntrastu artu", + "Enable dark high contrast mode" : "Ativa sa modalidade de cuntrastu artu cun tema iscuru", + "Similar to the high contrast mode, but with dark colours." : "Comente sa modalidade de cuntrastu artu, però cun colores iscuros.", + "Dark theme" : "Tema iscuru ", + "Enable dark theme" : "Ativa su tema iscuru ", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Unu tema iscuru pro agiudare is ogros tuos menguende sa lughe e su lugore generale.", + "System default theme" : "Tema predefinidu de su sistema", + "Enable the system default" : "Ativa cussu predefinidu dae su sistema", + "Using the default system appearance." : "Imperende s'aspetu predefinidu de su sistema.", + "Dyslexia font" : "Font pro dislessia", + "Enable dyslexia font" : "Ativa su font pro dislessia", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic est unu font lìberu pensadu pro illebiare unos cantos isbàllios comunes de leghidura causados dae sa dislessia.", + "High contrast mode" : "Modalidade cuntrastu artu", + "Enable high contrast mode" : "Ativa sa modalidade cuntrastu altu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Unu cuntrastu artu pro agiudare sa navigatzione tua. S'at a menguare sa calidade de visualizatzione, ma at a crèschere sa craresa.", + "Light theme" : "Tema craru", + "Enable the default light theme" : "Ativa su tema craru predefinidu", + "The default light appearance." : "S'aspetu craru predefinidu.", + "Legal notice" : "Avisu legale", + "Privacy policy" : "Critèriu de riservadesa", + "Adjust the Nextcloud theme" : "Modìfica su tema de Nextcloud", + "Name" : "Nùmene", + "Web link" : "Ligòngiu web", + "a safe home for all your data" : "unu logu seguru pro totu is datos tuos", + "Slogan" : "Slogan", + "Legal notice link" : "Ligòngiu avisu legale", + "Privacy policy link" : "Ligòngiu critèrios de riservadesa", + "Header logo" : "Logo de intestatzione", + "Upload new header logo" : "Càrriga logo de intestatzione nou", + "Favicon" : "Favicon", + "Upload new favicon" : "Càrriga favicon noa", + "User settings" : "Cunfiguratzione de utente", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Sa gestione de is temas faghet chi sa personalizatzione de sa bista de s'istàntzia tua e de is clientes suportados siat prus fàtzile. Custu at a èssere visìbile pro totu is utentes.", + "Upload new logo" : "Càrriga logo nou", + "Logo" : "Logo", + "Upload new background and login image" : "Càrriga s'immàgine de identificatzione e s'isfundu noos", + "Advanced options" : "Sèberos avantzados", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si agatas unu problema, no istentes a ddu sinnalare a {issuetracker}rilevadore de problemas{linkend} nostru. E si nos boles agiudare, intra a s'{designteam}iscuadra de disinnu {linkend} nostra!", + "Appearance and accessibility settings" : "Cunfiguratzione de aspetu e atzessibilidade", + "Misc accessibility options" : "Àteras optziones de atzessibilidade", + "Keyboard shortcuts" : "Curtziadòrgios de tecladu", + "Move up" : "Tràmuda fache a susu", + "Move down" : "Tràmuda fache a bàsciu", + "Select a background from your files" : "Seletziona un'isfundu dae is archìvios tuos", + "Select background" : "Seletziona un'isfundu", + "No background has been selected" : "Perunu isfundu seletzionadu", + "Custom background" : "Isfundu personalizadu", + "Plain background" : "Isfundu simpre", + "Default background" : "Isfundu predefinidu", + "Could not set the app order" : "Impossìbile cunfigurare s'òrdine de is aplicatziones", + "Could not reset the app order" : "Impossìbile resetare s'òrdine de is aplicatziones", + "Navigation bar settings" : "Cunfiguratzione de sa barra de navigatzione", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Podes cunfigurare s'òrdine de is aplicatziones in sa barra de navigatzione. Sa prima intrada at a èssere s'aplicatzione predefinida, chi s'at a abèrrere comente faghes s'atzessu o cando incarcas in su logo.", + "The default app can not be changed because it was configured by the administrator." : "S'aplicatzione predefinida non podet èssere modificada, ca est istada cunfigurada dae s'amministratzione.", + "The app order was changed, to see it in action you have to reload the page." : "S'òrdine de is aplicatziones est istadu modificadu. Pro ddu bìdere, depes torrare a carrigare sa pàgina.", + "Reset default app order" : "Reseta s'òrdine predefinidu de is aplicatziones", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "S'aplicatzione predefinida est cussa chi pro esempru s'at a abèrrere comente faghes s'atzessu o cando incarcas su logo in su menù.", + "Reset to default" : "Torra a sa cunfiguratzione predefinida", + "Upload" : "Càrriga", + "Remove background image" : "Boga immàgine de fundu", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "S'atzessu universale est de importu mannu pro nois. Sighimus is istandard de sa rete e chircamus de fàghere chi totu si potzat impreare chene cursore puru, e cun programmas de assistèntzia comente leghidores de ischermu. S'intentu nostru est de acumprire is inditos de is {guidelines}Lìnias ghia de atzessibilidade pro is cuntenutos de rete{linkend} 2.1 a su livellu AA, cun su tema de cuntrastu artu a su livellu AAA." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sk.js b/apps/theming/l10n/sk.js new file mode 100644 index 00000000000..8e47cc40478 --- /dev/null +++ b/apps/theming/l10n/sk.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Zadané meno je príliš dlhé", + "The given web address is too long" : "Zadaná web adresa je príliš dlhá", + "The given web address is not a valid URL" : "Zadaná web adresa nie je platná adresa URL", + "The given legal notice address is too long" : "Zadaná adresa právneho upozornenia je príliš dlhá", + "The given legal notice address is not a valid URL" : "Zadaná adresa právneho upozornenia nie je platná adresa URL", + "The given privacy policy address is too long" : "Zadaná adresa zásady ochrany osobných údajov je príliš dlhá", + "The given privacy policy address is not a valid URL" : "Zadaná adresa zásady ochrany osobných údajov nie je platná adresa URL", + "The given slogan is too long" : "Zadaný slogan je príliš dlhý", + "The given color is invalid" : "Zadaná farba nie je platná", + "Disable-user-theming should be true or false" : "Disable-user-theming by malo byť true alebo false", + "Saved" : "Uložené", + "Invalid app given" : "Zadaná neplatná aplikácia", + "Invalid type for setting \"defaultApp\" given" : "Zadaný neplatný typ nastavenia „defaultApp“.", + "Invalid setting key" : "Neplatný kľúč nastavenia", + "The file was uploaded" : "Súbor bol nahraný", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahraný súbor prekročil limit nastavený v upload_max_filesize v súbore php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.", + "The file was only partially uploaded" : "Súbor sa nahral len čiastočne", + "No file was uploaded" : "Nenahral sa žiadny súbor", + "Missing a temporary folder" : "Chýba priečinok pre dočasné súbory", + "Could not write file to disk" : "Nepodarilo sa zapísať súbor na disk.", + "A PHP extension stopped the file upload" : "rozšírenie PHP zastavilo nahrávanie súboru.", + "No file uploaded" : "Žiadny súbor nebol nahraný", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Už používate vlastný motív vzhľadu. Predošlé nastavenia tým môžu byť prepísané.", + "Theming" : "Zmena vzhľadu", + "Appearance and accessibility" : "Vzhľad a správanie", + "PHP Imagick module" : "Modul PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP modul „imagick“ nie je povolený, hoci tematická aplikácia áno. Aby generovanie favicon správne fungovalo, musíte nainštalovať a povoliť tento modul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modul \"imagick\" v tomto prípade nemá podporu SVG. Pre lepšiu kompatibilitu sa ju odporúča nainštalovať.", + "Dark theme with high contrast mode" : "Tmavá téma s vysokým kontrastom", + "Enable dark high contrast mode" : "Zapnúť režim vysokého kontrastu", + "Similar to the high contrast mode, but with dark colours." : "Podobné ako v režime vysokého kontrastu, ale s tmavými farbami.", + "Dark theme" : "Tmavý motív vzhľadu", + "Enable dark theme" : "Zapnúť tmavý motív vzhľadu", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tmavý motív pre uľahčenie očiam znížením celkovej svietivosti a jasu.", + "System default theme" : "Predvolený vzhľad systému", + "Enable the system default" : "Povoliť systémové nastavenia", + "Using the default system appearance." : "Použitie predvoleného vzhľadu systému.", + "Dyslexia font" : "Písmo pre dyslektikov", + "Enable dyslexia font" : "Povoliť písmo pre dyslektikov", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je slobodný typ písma navrhnutý priamo pre obmedzenie vplyvu niektorých bežných porúch čítania spôsobených dyslexiou.", + "High contrast mode" : "Režim vysokého kontrastu", + "Enable high contrast mode" : "Zapnúť režim vysokého kontrastu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mód s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.", + "Light theme" : "Svetlá téma", + "Enable the default light theme" : "Povoliť predvolený svetlý motív", + "The default light appearance." : "Predvolený svetlý motív", + "Legal notice" : "Právne upozornenie", + "Privacy policy" : "Zásady ochrany osobných údajov", + "Adjust the Nextcloud theme" : "Upraviť motív vzhľadu Nextcloudu", + "Name" : "Názov", + "Web link" : "Webový odkaz", + "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", + "Slogan" : "Slogan", + "Primary color" : "Primárna farba", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Primárna farba sa používa na zvýraznenie prvkov, ako sú dôležité tlačidlá. Môže sa mierne upraviť v závislosti od aktuálnej farebnej schémy.", + "Legal notice link" : "Odkaz na právne upozornenie", + "Privacy policy link" : "Odkaz na zásady ochrany osobných údajov", + "Header logo" : "Logo v hlavičke", + "Upload new header logo" : "Nahrať nové logo do hlavičky", + "Favicon" : "Favicon", + "Upload new favicon" : "Nahrať novú ikonu webu", + "User settings" : "Nastavenia užívateľa", + "Disable user theming" : "Vypnúť úpravu vzhľadu používateľom", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Hoci si môžete vybrať a prispôsobiť svoju inštanciu, užívatelia môžu zmeniť svoje pozadie a farby. Ak chcete presadiť svoje prispôsobenie, môžete to tu zapnúť.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Zmena vzhľadu umožňuje ľahko upraviť pocit z vašej inštalácie a podporovaných klientov. Vidieť ho budú všetci používatelia.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Namiesto obrázka na pozadí môžete nakonfigurovať aj obyčajnú farbu pozadia. Ak použijete obrázok na pozadí, zmena tejto farby ovplyvní farbu ikon ponuky aplikácie.", + "Background color" : "Farba pozadia", + "Upload new logo" : "Nahrať nové logo", + "Logo" : "Logo", + "Upload new background and login image" : "Nahrať nové pozadie a prihlasovací obrázok", + "Background and login image" : "Obrázok pozadia a prihlasovacej obrazovky", + "Advanced options" : "Pokročilé možnosti", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainštalujte si rozšírenie ImageMagick PHP s podporou obrázkov SVG pre automatické generovanie favicon na základe nahraného loga a farby.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {linkstart}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ak nájdete nejaké problémy, neváhajte ich nahlásiť v {issuetracker}našom nástroji na sledovanie problémov{linkend}. A ak sa chcete zapojiť, pridajte sa k {designteam}nášmu tímu dizajnérov{linkend}!", + "Unable to apply the setting." : "Nepodarilo sa použiť nastavenia.", + "Appearance and accessibility settings" : "Nastavenia vzhľadu a dostupnosti", + "Misc accessibility options" : "Rôzne možnosti dostupnosti", + "Enable blur background filter (may increase GPU load)" : "Povoliť filter rozmazania pozadia (môže zvýšiť zaťaženie GPU)", + "Customization has been disabled by your administrator" : "Prispôsobenie zakázal váš správca", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Nastavte primárnu farbu na zvýraznenie dôležitých prvkov. Farba použitá pre prvky, ako sú primárne tlačidlá, sa môže pri úprave tak, aby spĺňala požiadavky na prístupnosť, trochu líšiť.", + "Background and color" : "Pozadie a farba", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Pozadie môže byť nastavené na obrázok z predvolenej sady, vlastný nahraný obrázok alebo obyčajnú farbu.", + "Keyboard shortcuts" : "Klávesové skratky", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V niektorých prípadoch môžu klávesové skratky zasahovať do nástrojov pre dostupnosť. Aby ste mohli správne používať svoje nástroje, môžete vypnúť všetky klávesové skratky. Tým sa tiež zakážu všetky dostupné skratky v aplikáciách.", + "Disable all keyboard shortcuts" : "Vypnúť všetky klávesové skratky", + "Current selected app: {app}, position {position} of {total}" : "Aktuálne vybratá aplikácia: {app}, pozícia {position} z {total}", + "Move up" : "Presunúť hore", + "Move down" : "Presunúť dole", + "Select a background from your files" : "Vybrať pozadie z vašich súborov", + "Select background" : "Vybrať pozadie", + "No background has been selected" : "Nebolo vybrané žiadne pozadie", + "Custom background" : "Vlastné pozadie", + "Plain background" : "Obyčajné pozadie", + "Default background" : "Predvolené pozadie", + "Theme selection is enforced" : "Vynucuje sa výber témy", + "Could not set the app order" : "Nepodarilo sa nastaviť poradie aplikácií", + "Could not reset the app order" : "Nepodarilo sa obnoviť poradie aplikácií", + "Navigation bar settings" : "Nastavenia panelu navigácie", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Môžete nakonfigurovať poradie aplikácií používané pre navigačný panel. Prvá položka bude predvolená aplikácia, ktorá sa otvorí po prihlásení alebo po kliknutí na logo.", + "The default app can not be changed because it was configured by the administrator." : "Predvolenú aplikáciu nie je možné zmeniť, pretože ju nakonfiguroval správca.", + "The app order was changed, to see it in action you have to reload the page." : "Poradie aplikácie bolo zmenené. Ak ju chcete vidieť v akcii, musíte stránku znova načítať.", + "Reset default app order" : "Obnoviť predvolené poradie aplikácií", + "Could not set primary color" : "Nebolo možné nastaviť primárnu farbu", + "Reset primary color" : "Obnoviť primárnu farbu", + "Could not set global default apps" : "Nepodarilo sa nastaviť globálne predvolené aplikácie", + "Default app" : "Predvolená aplikácia", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Predvolená aplikácia je aplikácia, ktorá sa napr. otvorí po prihlásení alebo po kliknutí na logo v menu.", + "Use custom default app" : "Použiť vlastnú predvolenú aplikáciu", + "Global default app" : "Globálna predvolená aplikácia", + "Global default apps" : "Globálne predvolené aplikácie", + "Default app priority" : "Predvolená priorita aplikácie", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ak aplikácia nie je pre užívateľa povolená, použije sa nasledujúca aplikácia s nižšou prioritou.", + "Select a custom color" : "Vyberte vlastnú farbu", + "Reset to default" : "Nastaviť predvolené", + "Upload" : "Nahrať", + "Remove background image" : "Odstrániť obrázok pozadia", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.", + ". Unable to apply the setting." : ". Nepodarilo sa použiť nastavenia." +}, +"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/theming/l10n/sk.json b/apps/theming/l10n/sk.json new file mode 100644 index 00000000000..eb7e4cfadc9 --- /dev/null +++ b/apps/theming/l10n/sk.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Zadané meno je príliš dlhé", + "The given web address is too long" : "Zadaná web adresa je príliš dlhá", + "The given web address is not a valid URL" : "Zadaná web adresa nie je platná adresa URL", + "The given legal notice address is too long" : "Zadaná adresa právneho upozornenia je príliš dlhá", + "The given legal notice address is not a valid URL" : "Zadaná adresa právneho upozornenia nie je platná adresa URL", + "The given privacy policy address is too long" : "Zadaná adresa zásady ochrany osobných údajov je príliš dlhá", + "The given privacy policy address is not a valid URL" : "Zadaná adresa zásady ochrany osobných údajov nie je platná adresa URL", + "The given slogan is too long" : "Zadaný slogan je príliš dlhý", + "The given color is invalid" : "Zadaná farba nie je platná", + "Disable-user-theming should be true or false" : "Disable-user-theming by malo byť true alebo false", + "Saved" : "Uložené", + "Invalid app given" : "Zadaná neplatná aplikácia", + "Invalid type for setting \"defaultApp\" given" : "Zadaný neplatný typ nastavenia „defaultApp“.", + "Invalid setting key" : "Neplatný kľúč nastavenia", + "The file was uploaded" : "Súbor bol nahraný", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahraný súbor prekročil limit nastavený v upload_max_filesize v súbore php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.", + "The file was only partially uploaded" : "Súbor sa nahral len čiastočne", + "No file was uploaded" : "Nenahral sa žiadny súbor", + "Missing a temporary folder" : "Chýba priečinok pre dočasné súbory", + "Could not write file to disk" : "Nepodarilo sa zapísať súbor na disk.", + "A PHP extension stopped the file upload" : "rozšírenie PHP zastavilo nahrávanie súboru.", + "No file uploaded" : "Žiadny súbor nebol nahraný", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Už používate vlastný motív vzhľadu. Predošlé nastavenia tým môžu byť prepísané.", + "Theming" : "Zmena vzhľadu", + "Appearance and accessibility" : "Vzhľad a správanie", + "PHP Imagick module" : "Modul PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP modul „imagick“ nie je povolený, hoci tematická aplikácia áno. Aby generovanie favicon správne fungovalo, musíte nainštalovať a povoliť tento modul.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP modul \"imagick\" v tomto prípade nemá podporu SVG. Pre lepšiu kompatibilitu sa ju odporúča nainštalovať.", + "Dark theme with high contrast mode" : "Tmavá téma s vysokým kontrastom", + "Enable dark high contrast mode" : "Zapnúť režim vysokého kontrastu", + "Similar to the high contrast mode, but with dark colours." : "Podobné ako v režime vysokého kontrastu, ale s tmavými farbami.", + "Dark theme" : "Tmavý motív vzhľadu", + "Enable dark theme" : "Zapnúť tmavý motív vzhľadu", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Tmavý motív pre uľahčenie očiam znížením celkovej svietivosti a jasu.", + "System default theme" : "Predvolený vzhľad systému", + "Enable the system default" : "Povoliť systémové nastavenia", + "Using the default system appearance." : "Použitie predvoleného vzhľadu systému.", + "Dyslexia font" : "Písmo pre dyslektikov", + "Enable dyslexia font" : "Povoliť písmo pre dyslektikov", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic je slobodný typ písma navrhnutý priamo pre obmedzenie vplyvu niektorých bežných porúch čítania spôsobených dyslexiou.", + "High contrast mode" : "Režim vysokého kontrastu", + "Enable high contrast mode" : "Zapnúť režim vysokého kontrastu", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Mód s vysokým kontrastom pre uľahčenie navigácie. Zníži sa síce vizuálna kvalita, ale zvýši sa čitateľnosť.", + "Light theme" : "Svetlá téma", + "Enable the default light theme" : "Povoliť predvolený svetlý motív", + "The default light appearance." : "Predvolený svetlý motív", + "Legal notice" : "Právne upozornenie", + "Privacy policy" : "Zásady ochrany osobných údajov", + "Adjust the Nextcloud theme" : "Upraviť motív vzhľadu Nextcloudu", + "Name" : "Názov", + "Web link" : "Webový odkaz", + "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", + "Slogan" : "Slogan", + "Primary color" : "Primárna farba", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Primárna farba sa používa na zvýraznenie prvkov, ako sú dôležité tlačidlá. Môže sa mierne upraviť v závislosti od aktuálnej farebnej schémy.", + "Legal notice link" : "Odkaz na právne upozornenie", + "Privacy policy link" : "Odkaz na zásady ochrany osobných údajov", + "Header logo" : "Logo v hlavičke", + "Upload new header logo" : "Nahrať nové logo do hlavičky", + "Favicon" : "Favicon", + "Upload new favicon" : "Nahrať novú ikonu webu", + "User settings" : "Nastavenia užívateľa", + "Disable user theming" : "Vypnúť úpravu vzhľadu používateľom", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Hoci si môžete vybrať a prispôsobiť svoju inštanciu, užívatelia môžu zmeniť svoje pozadie a farby. Ak chcete presadiť svoje prispôsobenie, môžete to tu zapnúť.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Zmena vzhľadu umožňuje ľahko upraviť pocit z vašej inštalácie a podporovaných klientov. Vidieť ho budú všetci používatelia.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Namiesto obrázka na pozadí môžete nakonfigurovať aj obyčajnú farbu pozadia. Ak použijete obrázok na pozadí, zmena tejto farby ovplyvní farbu ikon ponuky aplikácie.", + "Background color" : "Farba pozadia", + "Upload new logo" : "Nahrať nové logo", + "Logo" : "Logo", + "Upload new background and login image" : "Nahrať nové pozadie a prihlasovací obrázok", + "Background and login image" : "Obrázok pozadia a prihlasovacej obrazovky", + "Advanced options" : "Pokročilé možnosti", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Nainštalujte si rozšírenie ImageMagick PHP s podporou obrázkov SVG pre automatické generovanie favicon na základe nahraného loga a farby.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {linkstart}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Ak nájdete nejaké problémy, neváhajte ich nahlásiť v {issuetracker}našom nástroji na sledovanie problémov{linkend}. A ak sa chcete zapojiť, pridajte sa k {designteam}nášmu tímu dizajnérov{linkend}!", + "Unable to apply the setting." : "Nepodarilo sa použiť nastavenia.", + "Appearance and accessibility settings" : "Nastavenia vzhľadu a dostupnosti", + "Misc accessibility options" : "Rôzne možnosti dostupnosti", + "Enable blur background filter (may increase GPU load)" : "Povoliť filter rozmazania pozadia (môže zvýšiť zaťaženie GPU)", + "Customization has been disabled by your administrator" : "Prispôsobenie zakázal váš správca", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Nastavte primárnu farbu na zvýraznenie dôležitých prvkov. Farba použitá pre prvky, ako sú primárne tlačidlá, sa môže pri úprave tak, aby spĺňala požiadavky na prístupnosť, trochu líšiť.", + "Background and color" : "Pozadie a farba", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Pozadie môže byť nastavené na obrázok z predvolenej sady, vlastný nahraný obrázok alebo obyčajnú farbu.", + "Keyboard shortcuts" : "Klávesové skratky", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V niektorých prípadoch môžu klávesové skratky zasahovať do nástrojov pre dostupnosť. Aby ste mohli správne používať svoje nástroje, môžete vypnúť všetky klávesové skratky. Tým sa tiež zakážu všetky dostupné skratky v aplikáciách.", + "Disable all keyboard shortcuts" : "Vypnúť všetky klávesové skratky", + "Current selected app: {app}, position {position} of {total}" : "Aktuálne vybratá aplikácia: {app}, pozícia {position} z {total}", + "Move up" : "Presunúť hore", + "Move down" : "Presunúť dole", + "Select a background from your files" : "Vybrať pozadie z vašich súborov", + "Select background" : "Vybrať pozadie", + "No background has been selected" : "Nebolo vybrané žiadne pozadie", + "Custom background" : "Vlastné pozadie", + "Plain background" : "Obyčajné pozadie", + "Default background" : "Predvolené pozadie", + "Theme selection is enforced" : "Vynucuje sa výber témy", + "Could not set the app order" : "Nepodarilo sa nastaviť poradie aplikácií", + "Could not reset the app order" : "Nepodarilo sa obnoviť poradie aplikácií", + "Navigation bar settings" : "Nastavenia panelu navigácie", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Môžete nakonfigurovať poradie aplikácií používané pre navigačný panel. Prvá položka bude predvolená aplikácia, ktorá sa otvorí po prihlásení alebo po kliknutí na logo.", + "The default app can not be changed because it was configured by the administrator." : "Predvolenú aplikáciu nie je možné zmeniť, pretože ju nakonfiguroval správca.", + "The app order was changed, to see it in action you have to reload the page." : "Poradie aplikácie bolo zmenené. Ak ju chcete vidieť v akcii, musíte stránku znova načítať.", + "Reset default app order" : "Obnoviť predvolené poradie aplikácií", + "Could not set primary color" : "Nebolo možné nastaviť primárnu farbu", + "Reset primary color" : "Obnoviť primárnu farbu", + "Could not set global default apps" : "Nepodarilo sa nastaviť globálne predvolené aplikácie", + "Default app" : "Predvolená aplikácia", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Predvolená aplikácia je aplikácia, ktorá sa napr. otvorí po prihlásení alebo po kliknutí na logo v menu.", + "Use custom default app" : "Použiť vlastnú predvolenú aplikáciu", + "Global default app" : "Globálna predvolená aplikácia", + "Global default apps" : "Globálne predvolené aplikácie", + "Default app priority" : "Predvolená priorita aplikácie", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ak aplikácia nie je pre užívateľa povolená, použije sa nasledujúca aplikácia s nižšou prioritou.", + "Select a custom color" : "Vyberte vlastnú farbu", + "Reset to default" : "Nastaviť predvolené", + "Upload" : "Nahrať", + "Remove background image" : "Odstrániť obrázok pozadia", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Univerzálny prístup je pre nás veľmi dôležitý. Dodržiavame webové štandardy a kontrolujeme, aby bolo všetko použiteľné aj bez myši a pomocného softvéru, ako sú čítačky obrazovky. Naším cieľom je byť v súlade s {guidelines}pokynmi pre prístup k webovému obsahu {linkend} 2.1 na úrovni AA, v režime vysokého kontrastu dokonca na úrovni AAA.", + ". Unable to apply the setting." : ". Nepodarilo sa použiť nastavenia." +},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sl.js b/apps/theming/l10n/sl.js new file mode 100644 index 00000000000..582a7cda3cd --- /dev/null +++ b/apps/theming/l10n/sl.js @@ -0,0 +1,101 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Podano ime je predolgo", + "The given web address is too long" : "Podan spletni naslov je predolg", + "The given web address is not a valid URL" : "Podan spletni naslov ni veljaven naslov URL.", + "The given legal notice address is too long" : "Podan naslov pravnega obvestila je predolg", + "The given legal notice address is not a valid URL" : "Podan naslov pravnega obvestila ni veljaven naslov URL.", + "The given privacy policy address is too long" : "Podan naslov pravil zasebnosti je predolg", + "The given privacy policy address is not a valid URL" : "Podan naslov pravil zasebnosti ni veljaven naslov URL.", + "The given slogan is too long" : "Podan slogan je predolg", + "The given color is invalid" : "Podana koda barve ni veljavna", + "Disable-user-theming should be true or false" : "Možnost za omogočanje uporabniške teme mora biti prav ali napak.", + "Saved" : "Shranjeno", + "The file was uploaded" : "Datoteka je uspešno poslana", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Poslana datoteka presega določilo upload_max_filesize v datoteke php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Poslana datoteka presega velikost, ki jo določa parameter največje dovoljene velikosti MAX_FILE_SIZE v zapisu HTML.", + "The file was only partially uploaded" : "Datoteka ni bila poslana v celoti", + "No file was uploaded" : "Datoteka še ni bila poslana", + "Missing a temporary folder" : "Manjka začasna mapa", + "Could not write file to disk" : "Datoteke ni mogoče zapisati na disk", + "A PHP extension stopped the file upload" : "Razširitev PHP je onemogočila pošiljanje datoteke", + "No file uploaded" : "Ni poslanih datotek", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Tema po meri je že določena. S spreminjanjem nastavitev bodo stari podatki prepisani.", + "Theming" : "Teme", + "Appearance and accessibility" : "Videz in dostopnost", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Modul PHP »imagick« ni omogočen, je pa zagnan program za oblikovanje vmesnika. Za pravilno delovanje ustvarjanja ikon je treba modul namestiti in omogočiti.", + "Dark theme with high contrast mode" : "Temna tema v kontrastnem načinu", + "Enable dark high contrast mode" : "Omogoči temno kontrastno temo", + "Similar to the high contrast mode, but with dark colours." : "Podobno temni kontrastni temi, a s temnimi barvami", + "Dark theme" : "Temna tema", + "Enable dark theme" : "Omogoči temno temo", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Temna tema za sproščanje oči z zmanjševanjem splošne osvetljenosti in svetlosti prikaza.", + "System default theme" : "Sistemska privzeta tema", + "Enable the system default" : "Omogoči sistemsko privzeto temo", + "Using the default system appearance." : "V uporabi je privzet sistemski videz.", + "Dyslexia font" : "Pisava za posameznike z disleksijo", + "Enable dyslexia font" : "Omogoči pisavo za posameznike z disleksijo", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Pisava OpenDyslexic je prosta pisava, zasnovana in oblikovana za posameznike z disleksijo. Olajša nekatere splošne težave pri branju.", + "High contrast mode" : "Visoko kontrastna tema", + "Enable high contrast mode" : "Omogoči visoko kontrastno temo", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Visoko kontrastna tema omogoča nazornejši prikaz vmesnika. Pogled se poenostavi, poveča pa se jasnost prikaza.", + "Light theme" : "Svetla tema", + "Enable the default light theme" : "Omogoči privzeto svetlo temo", + "The default light appearance." : "Privzet svetel videz okolja.", + "Legal notice" : "Pravno obvestilo", + "Privacy policy" : "Pravila zasebnosti", + "Adjust the Nextcloud theme" : "Prilagajanje teme Nextcloud", + "Name" : "Ime", + "Web link" : "Spletni naslov", + "a safe home for all your data" : "varno okolje za vaše podatke", + "Slogan" : "Slogan", + "Primary color" : "Prva barva", + "Legal notice link" : "Povezava do pravnega obvestila", + "Privacy policy link" : "Povezava do pravil zasebnosti", + "Header logo" : "Logotip glave", + "Upload new header logo" : "Pošlji nov logotip glave", + "Favicon" : "Ikona zaznamka", + "Upload new favicon" : "Pošli novo ikono zaznamka", + "User settings" : "Uporabniške nastavitve", + "Disable user theming" : "Onemogoči uporabniške teme", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Čeprav je mogoče izbirati in prilagajati vmesnik, lahko uporabniki spremenijo ozadje in barve. Če želite vsiliti prilagoditve, preklopite možnost na omogočeno.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teme omogočajo enostavno prilagajanje videza in občutka vmesnika in podprtih programskih odjemalcev. Prilagoditve bodo spremenjene za vse uporabnike sistema.", + "Background color" : "Barva ozadja", + "Upload new logo" : "Pošlji nov logotip", + "Logo" : "Logotip", + "Upload new background and login image" : "Pošlji novo sliko ozadja in prijavno sliko", + "Background and login image" : "Ozadje in prijavna slika", + "Advanced options" : "Napredne možnosti", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Z namestitvijo razširitve ImageMagick PHP s podporo za zapis SVG je mogoče samodejno ustvariti ikone zaznamka na podlagi določenega logotipa in barve.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Če naletite na težave, ne odlašajte in takoj pošljite poročilo na {issuetracker}sledilnik{linkend}, če želite sodelovati, pa se pridružite {designteam}skupini oblikovalcev{linkend}!", + "Customization has been disabled by your administrator" : "Prilagajanje je skrbniško onemogočeno.", + "Keyboard shortcuts" : "Tipkovne bližnjice", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V nekaterih primerih delovanje tipkovnih bližnjic motijo orodja za dostopnost. Za pravilno delo z orodji je mogoče vse tipkovne bližnjice onemogočiti, s tem pa tudi vse bližnjice programov.", + "Disable all keyboard shortcuts" : "Onemogoči vse tipkovne bližnjice", + "Move up" : "Premakni navzgor", + "Move down" : "Premakni navzdol", + "Select a background from your files" : "Izbor ozadja med datotekami", + "Select background" : "Izbor ozadja", + "No background has been selected" : "Ni izbranega ozadja", + "Custom background" : "Ozadje po meri", + "Plain background" : "Enostavno ozadje", + "Default background" : "Privzeto ozadje", + "Theme selection is enforced" : "Izbira teme je vsiljena", + "Navigation bar settings" : "Nastavitve vrstice programov", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Nastaviti je mogoče zaporedje programov v vrstici. Na prvem mestu je privzet program, ki se zažene ob prijavi oziroma ob kliku na logo oblaka.", + "The default app can not be changed because it was configured by the administrator." : "Privzetega programa ni mogoče spremeniti, ker je nastavljen sistemsko.", + "Could not set primary color" : "Prve barve ni mogoče nastaviti", + "Reset primary color" : "Ponastavi prvo barvo", + "Default app" : "Privzet program", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Privzeti program je tisti, ki se odpre kot prva stran po prijavi oziroma ob kliku na logo oblaka.", + "Use custom default app" : "Uporabi privzeti program po meri", + "Global default app" : "Splošni privzeti program", + "Global default apps" : "Splošni privzeti programi", + "Select a custom color" : "Izbor barve po meri", + "Reset to default" : "Ponastavi na privzeto", + "Upload" : "Pošlji", + "Remove background image" : "Odstrani sliko ozadja", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Enostaven dostop do možnosti je za nas zelo pomemben. Sledimo spletnim standardom in preverjamo, da je vmesnik uporaben tudi brez uporabe miške in brez podporne programske opreme, kot so zaslonski bralniki in podobno. Zagotavljamo skladnost s smernicami {guidelines}Dostopnosti spletne vsebine{linkend} 2.1 na ravni AA, pri visoko kontrastni temi pa tudi na ravni AAA." +}, +"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/theming/l10n/sl.json b/apps/theming/l10n/sl.json new file mode 100644 index 00000000000..6c308354272 --- /dev/null +++ b/apps/theming/l10n/sl.json @@ -0,0 +1,99 @@ +{ "translations": { + "The given name is too long" : "Podano ime je predolgo", + "The given web address is too long" : "Podan spletni naslov je predolg", + "The given web address is not a valid URL" : "Podan spletni naslov ni veljaven naslov URL.", + "The given legal notice address is too long" : "Podan naslov pravnega obvestila je predolg", + "The given legal notice address is not a valid URL" : "Podan naslov pravnega obvestila ni veljaven naslov URL.", + "The given privacy policy address is too long" : "Podan naslov pravil zasebnosti je predolg", + "The given privacy policy address is not a valid URL" : "Podan naslov pravil zasebnosti ni veljaven naslov URL.", + "The given slogan is too long" : "Podan slogan je predolg", + "The given color is invalid" : "Podana koda barve ni veljavna", + "Disable-user-theming should be true or false" : "Možnost za omogočanje uporabniške teme mora biti prav ali napak.", + "Saved" : "Shranjeno", + "The file was uploaded" : "Datoteka je uspešno poslana", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Poslana datoteka presega določilo upload_max_filesize v datoteke php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Poslana datoteka presega velikost, ki jo določa parameter največje dovoljene velikosti MAX_FILE_SIZE v zapisu HTML.", + "The file was only partially uploaded" : "Datoteka ni bila poslana v celoti", + "No file was uploaded" : "Datoteka še ni bila poslana", + "Missing a temporary folder" : "Manjka začasna mapa", + "Could not write file to disk" : "Datoteke ni mogoče zapisati na disk", + "A PHP extension stopped the file upload" : "Razširitev PHP je onemogočila pošiljanje datoteke", + "No file uploaded" : "Ni poslanih datotek", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Tema po meri je že določena. S spreminjanjem nastavitev bodo stari podatki prepisani.", + "Theming" : "Teme", + "Appearance and accessibility" : "Videz in dostopnost", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Modul PHP »imagick« ni omogočen, je pa zagnan program za oblikovanje vmesnika. Za pravilno delovanje ustvarjanja ikon je treba modul namestiti in omogočiti.", + "Dark theme with high contrast mode" : "Temna tema v kontrastnem načinu", + "Enable dark high contrast mode" : "Omogoči temno kontrastno temo", + "Similar to the high contrast mode, but with dark colours." : "Podobno temni kontrastni temi, a s temnimi barvami", + "Dark theme" : "Temna tema", + "Enable dark theme" : "Omogoči temno temo", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Temna tema za sproščanje oči z zmanjševanjem splošne osvetljenosti in svetlosti prikaza.", + "System default theme" : "Sistemska privzeta tema", + "Enable the system default" : "Omogoči sistemsko privzeto temo", + "Using the default system appearance." : "V uporabi je privzet sistemski videz.", + "Dyslexia font" : "Pisava za posameznike z disleksijo", + "Enable dyslexia font" : "Omogoči pisavo za posameznike z disleksijo", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "Pisava OpenDyslexic je prosta pisava, zasnovana in oblikovana za posameznike z disleksijo. Olajša nekatere splošne težave pri branju.", + "High contrast mode" : "Visoko kontrastna tema", + "Enable high contrast mode" : "Omogoči visoko kontrastno temo", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Visoko kontrastna tema omogoča nazornejši prikaz vmesnika. Pogled se poenostavi, poveča pa se jasnost prikaza.", + "Light theme" : "Svetla tema", + "Enable the default light theme" : "Omogoči privzeto svetlo temo", + "The default light appearance." : "Privzet svetel videz okolja.", + "Legal notice" : "Pravno obvestilo", + "Privacy policy" : "Pravila zasebnosti", + "Adjust the Nextcloud theme" : "Prilagajanje teme Nextcloud", + "Name" : "Ime", + "Web link" : "Spletni naslov", + "a safe home for all your data" : "varno okolje za vaše podatke", + "Slogan" : "Slogan", + "Primary color" : "Prva barva", + "Legal notice link" : "Povezava do pravnega obvestila", + "Privacy policy link" : "Povezava do pravil zasebnosti", + "Header logo" : "Logotip glave", + "Upload new header logo" : "Pošlji nov logotip glave", + "Favicon" : "Ikona zaznamka", + "Upload new favicon" : "Pošli novo ikono zaznamka", + "User settings" : "Uporabniške nastavitve", + "Disable user theming" : "Onemogoči uporabniške teme", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Čeprav je mogoče izbirati in prilagajati vmesnik, lahko uporabniki spremenijo ozadje in barve. Če želite vsiliti prilagoditve, preklopite možnost na omogočeno.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teme omogočajo enostavno prilagajanje videza in občutka vmesnika in podprtih programskih odjemalcev. Prilagoditve bodo spremenjene za vse uporabnike sistema.", + "Background color" : "Barva ozadja", + "Upload new logo" : "Pošlji nov logotip", + "Logo" : "Logotip", + "Upload new background and login image" : "Pošlji novo sliko ozadja in prijavno sliko", + "Background and login image" : "Ozadje in prijavna slika", + "Advanced options" : "Napredne možnosti", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Z namestitvijo razširitve ImageMagick PHP s podporo za zapis SVG je mogoče samodejno ustvariti ikone zaznamka na podlagi določenega logotipa in barve.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Če naletite na težave, ne odlašajte in takoj pošljite poročilo na {issuetracker}sledilnik{linkend}, če želite sodelovati, pa se pridružite {designteam}skupini oblikovalcev{linkend}!", + "Customization has been disabled by your administrator" : "Prilagajanje je skrbniško onemogočeno.", + "Keyboard shortcuts" : "Tipkovne bližnjice", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "V nekaterih primerih delovanje tipkovnih bližnjic motijo orodja za dostopnost. Za pravilno delo z orodji je mogoče vse tipkovne bližnjice onemogočiti, s tem pa tudi vse bližnjice programov.", + "Disable all keyboard shortcuts" : "Onemogoči vse tipkovne bližnjice", + "Move up" : "Premakni navzgor", + "Move down" : "Premakni navzdol", + "Select a background from your files" : "Izbor ozadja med datotekami", + "Select background" : "Izbor ozadja", + "No background has been selected" : "Ni izbranega ozadja", + "Custom background" : "Ozadje po meri", + "Plain background" : "Enostavno ozadje", + "Default background" : "Privzeto ozadje", + "Theme selection is enforced" : "Izbira teme je vsiljena", + "Navigation bar settings" : "Nastavitve vrstice programov", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Nastaviti je mogoče zaporedje programov v vrstici. Na prvem mestu je privzet program, ki se zažene ob prijavi oziroma ob kliku na logo oblaka.", + "The default app can not be changed because it was configured by the administrator." : "Privzetega programa ni mogoče spremeniti, ker je nastavljen sistemsko.", + "Could not set primary color" : "Prve barve ni mogoče nastaviti", + "Reset primary color" : "Ponastavi prvo barvo", + "Default app" : "Privzet program", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Privzeti program je tisti, ki se odpre kot prva stran po prijavi oziroma ob kliku na logo oblaka.", + "Use custom default app" : "Uporabi privzeti program po meri", + "Global default app" : "Splošni privzeti program", + "Global default apps" : "Splošni privzeti programi", + "Select a custom color" : "Izbor barve po meri", + "Reset to default" : "Ponastavi na privzeto", + "Upload" : "Pošlji", + "Remove background image" : "Odstrani sliko ozadja", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Enostaven dostop do možnosti je za nas zelo pomemben. Sledimo spletnim standardom in preverjamo, da je vmesnik uporaben tudi brez uporabe miške in brez podporne programske opreme, kot so zaslonski bralniki in podobno. Zagotavljamo skladnost s smernicami {guidelines}Dostopnosti spletne vsebine{linkend} 2.1 na ravni AA, pri visoko kontrastni temi pa tudi na ravni AAA." +},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sr.js b/apps/theming/l10n/sr.js new file mode 100644 index 00000000000..a449a572e3a --- /dev/null +++ b/apps/theming/l10n/sr.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Назив је предугачак", + "The given web address is too long" : "Наведена веб адреса је предугачка", + "The given web address is not a valid URL" : "Наведена веб адреса није исправан УРЛ", + "The given legal notice address is too long" : "Адреса правног обавештења је предугачка", + "The given legal notice address is not a valid URL" : "Адреса правног обавештења није исправан УРЛ", + "The given privacy policy address is too long" : "Адреса смерница приватности је предугачка", + "The given privacy policy address is not a valid URL" : "Адреса смерница приватности није исправан УРЛ", + "The given slogan is too long" : "Слоган је предугачак", + "The given color is invalid" : "Задата боја није исправна", + "Disable-user-theming should be true or false" : "Искључи-корисничке-теме би требало да буде true или false", + "Saved" : "Сачувано", + "Invalid app given" : "Наведена је неисправна апликација", + "Invalid type for setting \"defaultApp\" given" : "Наведен је неисправан тип за постављање „defaultApp”", + "Invalid setting key" : "Неисправан кључ подешавања", + "The file was uploaded" : "Фајл је отпремљен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Отпремани фајл превазилази смерницу upload_max_filesize у фајлу php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Отпремани фајл превазилази смерницу MAX_FILE_SIZE наведену у ХТМЛ обрасцу", + "The file was only partially uploaded" : "Фајл је само делимично отпремљен", + "No file was uploaded" : "Није отпремљен фајл", + "Missing a temporary folder" : "Недостаје привремена фасцикла", + "Could not write file to disk" : "Не могу да упишем фајл на диск", + "A PHP extension stopped the file upload" : "ПХП екстензија је зауставила отпремање фајла", + "No file uploaded" : "Није отпремљен фајл", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Већ користите прилагођену тему. Поставке ове апликације ће прегажене са њом.", + "Theming" : "Изглед", + "Appearance and accessibility" : "Изглед и приступачност", + "PHP Imagick module" : "PHP Imagick модул", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP модул „imagick” није укључен мада је укључена апликација за теме. Да би генерисање favicon сличице функционисало како треба, морате да инсталирате и укључите овај модул.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP модул „imagick” у овој инстанци нема подршку за SVG. Да бисте постигли бољу компатибилност, препоручује се да га инсталирате.", + "Dark theme with high contrast mode" : "Тамна тема са режимом високог контраста", + "Enable dark high contrast mode" : "Укључи тамни режим високог контраста", + "Similar to the high contrast mode, but with dark colours." : "Слично као режим високог контраста, али са тамним бојама.", + "Dark theme" : "Тамна тема", + "Enable dark theme" : "укључи тамну тему", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Тамна тема која не замара ваше очи тако што смањује општу сјајност и осветљеност.", + "System default theme" : "Подразумевана системска тема", + "Enable the system default" : "Укључи подразумевано за систем", + "Using the default system appearance." : "Користи се подразумевани изглед система.", + "Dyslexia font" : "Фонт Дислексија", + "Enable dyslexia font" : "укључи фонт Дислексија", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "„OpenDyslexic“ је бесплатни фонт дизајниран да умањи честе грешке у читању изазване дислексијом.", + "High contrast mode" : "Режим високог контраста", + "Enable high contrast mode" : "укључи режим високог контраста", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим високог контраста за лакшу навигацију. Визуелни доживљај биће лошији али ће јасноћа бити боља.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Укључује подразумевану светлу тему", + "The default light appearance." : "Подразумевани светли изглед.", + "Legal notice" : "Правно обавештење", + "Privacy policy" : "Смернице приватности", + "Adjust the Nextcloud theme" : "Прилагоди Некстклауд тему", + "Name" : "Назив", + "Web link" : "Веб веза", + "a safe home for all your data" : "сигурно место за све ваше податке", + "Slogan" : "Слоган", + "Primary color" : "Примарна боја", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Примарна боја се користи за истицање елемената као што су важни дугмићи. Може се донекле изменити у зависности од текуће схеме боја.", + "Legal notice link" : "Правно обавештење", + "Privacy policy link" : "Смернице приватности", + "Header logo" : "Лого заглавља", + "Upload new header logo" : "Отпремите нови лого заглавља", + "Favicon" : "Икона веб стране", + "Upload new favicon" : "Отпремите нову иконицу", + "User settings" : "Корисничка подешавања", + "Disable user theming" : "Искључи корисничке теме", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Мада можете да изаберете и прилагодите своју инстанцу, корисници такође могу да промене своју позадину и боје. Ако желите да форсирате своје прилагођавање, укључите ово подешавање.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Омогућава да лако измените изглед и угођај вашег Некстклауда. Ово ће бити видљиво свим корисницима.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Уместо позадинске слике, такође можете да подесите и просту једнобојну позадину. Ако користите позадинску слику, измена ове боје ће утицати на боју икона у менију апликације.", + "Background color" : "Боја позадине", + "Upload new logo" : "Отпремите нови лого", + "Logo" : "Лого", + "Upload new background and login image" : "Отпреми нову слику позадине и пријављивања", + "Background and login image" : "Позадина и слика пријављивања", + "Advanced options" : "Напредне опције", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте ImageMagick PHP проширење са подшком за SVG слике да би било могуће аутоматско генерисање favicons према отпремљеном логоу и боји.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзални приступ нам је веома важан. Пратимо веб стандарде и проверавамо да све буде употребљиво и без миша а и са помоћним софтвером попут читача екрана. Циљ нам је да будемо усклађени са документом {linkstart}Смернице приступачности веб садржаја{linkend} 2.1 на АА нивоу, а са темом високог контраста чак и на ААА нивоу.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "У случају да наиђете на било какве проблеме, не оклевајте да их пријавите на {issuetracker}наш пратилац проблема{linkend}. А ако желите да се умешате, слободно се прикључите {designteam}нашем дизајн тиму{linkend}!", + "Unable to apply the setting." : "Подешавање није могло да се примени.", + "Appearance and accessibility settings" : "Подешавања изгледа и приступачности", + "Misc accessibility options" : "Разне опције приступаности", + "Enable blur background filter (may increase GPU load)" : "Укључи филтер замућења позадине (може да повећа оптерећење GPU)", + "Customization has been disabled by your administrator" : "Администратор је искључио могућност прилагођавања", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Поставља примарну боју за истицање важних елемената. Боја које се употреби за елементе као што су примарни дугмићи би могла донекле да се промени јер се подешава тако да задовољи захтеве приступачности.", + "Background and color" : "Позадина и боја", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Позадина може да се постави на слику из подразумеваног скупа, произвољну отпремљену слику или просту боју.", + "Keyboard shortcuts" : "Пречице на тастатури", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У неким случајевима пречице тастатуре могу да ремете алатке приступачности. Ако желите да се ваш алат исправно фокусира, овде можете да искључите све пречице на тастатури. Ово ће такође да искључи и све пречице у апликацијама.", + "Disable all keyboard shortcuts" : "Искључи све пречице на тастатури", + "Current selected app: {app}, position {position} of {total}" : "Тренутно изабрана апликација: {app}, позиција {position} од {total}", + "Move up" : "Помери нагоре", + "Move down" : "Помери надоле", + "Select a background from your files" : "Изаберите позадину међу вашим фајловима", + "Select background" : "Изаберите позадину", + "No background has been selected" : "Није изабрана ниједна позадина", + "Custom background" : "Прилагођена позадина", + "Plain background" : "Проста позадина", + "Default background" : "Подразумевана позадина", + "Theme selection is enforced" : "Избор теме је форсиран", + "Could not set the app order" : "Није могао да се подеси редослед апликација", + "Could not reset the app order" : "Није могао да се ресетује редослед апликација", + "Navigation bar settings" : "Подешавања траке за навигацију", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Можете да подесите редослед апликација који ће се користити на траци за навигацију. Прва ставка ће бити подразумевана апликација која се отвара након пријаве или када се кликне на лого.", + "The default app can not be changed because it was configured by the administrator." : "Подразумевана апликација не може да се промени јер ју је подесио администратор.", + "The app order was changed, to see it in action you have to reload the page." : "Редослед апликација је променњен, да бисте видели како изгледа, поново учитајте страницу.", + "Reset default app order" : "Ресетуј подразумевани редослед апликација.", + "Could not set primary color" : "Није могла да се постави примарна боја", + "Reset primary color" : "Ресетуј примарну боју", + "Could not set global default apps" : "Нису могле да се поставе глобалне подразумеване апликације", + "Default app" : "Подразумевана апликација", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Подразумевана апликација је она која се нпр. отвара након пријаве или када се кликне на лого у менију.", + "Use custom default app" : "Користи произвољну подразумевану апликацију", + "Global default app" : "Глобална подразумевана апликација", + "Global default apps" : "Глобалне подразумеване апликације", + "Default app priority" : "Подразумевани приоритет апликације", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ако апликација није укључена за корисника, користиће се наредна апликација са нижим приоритетом.", + "Select a custom color" : "Изаберите прилагођену боју", + "Reset to default" : "Врати на подразумевано", + "Upload" : "Отпреми", + "Remove background image" : "Уклони позадинску слику", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзални приступ нам је веома важан. Пратимо веб стандарде и проверавамо да све буде употребљиво и без миша а и са помоћним софтвером попут читача екрана. Циљ нам је да будемо усклађени са документом {guidelines}Смернице приступачности веб садржаја{linkend} 2.1 на АА нивоу а са темом високог контраста и на ААА нивоу.", + ". Unable to apply the setting." : ". Подешавање није могло да се примени." +}, +"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/theming/l10n/sr.json b/apps/theming/l10n/sr.json new file mode 100644 index 00000000000..3e889d46e18 --- /dev/null +++ b/apps/theming/l10n/sr.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Назив је предугачак", + "The given web address is too long" : "Наведена веб адреса је предугачка", + "The given web address is not a valid URL" : "Наведена веб адреса није исправан УРЛ", + "The given legal notice address is too long" : "Адреса правног обавештења је предугачка", + "The given legal notice address is not a valid URL" : "Адреса правног обавештења није исправан УРЛ", + "The given privacy policy address is too long" : "Адреса смерница приватности је предугачка", + "The given privacy policy address is not a valid URL" : "Адреса смерница приватности није исправан УРЛ", + "The given slogan is too long" : "Слоган је предугачак", + "The given color is invalid" : "Задата боја није исправна", + "Disable-user-theming should be true or false" : "Искључи-корисничке-теме би требало да буде true или false", + "Saved" : "Сачувано", + "Invalid app given" : "Наведена је неисправна апликација", + "Invalid type for setting \"defaultApp\" given" : "Наведен је неисправан тип за постављање „defaultApp”", + "Invalid setting key" : "Неисправан кључ подешавања", + "The file was uploaded" : "Фајл је отпремљен", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Отпремани фајл превазилази смерницу upload_max_filesize у фајлу php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Отпремани фајл превазилази смерницу MAX_FILE_SIZE наведену у ХТМЛ обрасцу", + "The file was only partially uploaded" : "Фајл је само делимично отпремљен", + "No file was uploaded" : "Није отпремљен фајл", + "Missing a temporary folder" : "Недостаје привремена фасцикла", + "Could not write file to disk" : "Не могу да упишем фајл на диск", + "A PHP extension stopped the file upload" : "ПХП екстензија је зауставила отпремање фајла", + "No file uploaded" : "Није отпремљен фајл", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Већ користите прилагођену тему. Поставке ове апликације ће прегажене са њом.", + "Theming" : "Изглед", + "Appearance and accessibility" : "Изглед и приступачност", + "PHP Imagick module" : "PHP Imagick модул", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP модул „imagick” није укључен мада је укључена апликација за теме. Да би генерисање favicon сличице функционисало како треба, морате да инсталирате и укључите овај модул.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "PHP модул „imagick” у овој инстанци нема подршку за SVG. Да бисте постигли бољу компатибилност, препоручује се да га инсталирате.", + "Dark theme with high contrast mode" : "Тамна тема са режимом високог контраста", + "Enable dark high contrast mode" : "Укључи тамни режим високог контраста", + "Similar to the high contrast mode, but with dark colours." : "Слично као режим високог контраста, али са тамним бојама.", + "Dark theme" : "Тамна тема", + "Enable dark theme" : "укључи тамну тему", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Тамна тема која не замара ваше очи тако што смањује општу сјајност и осветљеност.", + "System default theme" : "Подразумевана системска тема", + "Enable the system default" : "Укључи подразумевано за систем", + "Using the default system appearance." : "Користи се подразумевани изглед система.", + "Dyslexia font" : "Фонт Дислексија", + "Enable dyslexia font" : "укључи фонт Дислексија", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "„OpenDyslexic“ је бесплатни фонт дизајниран да умањи честе грешке у читању изазване дислексијом.", + "High contrast mode" : "Режим високог контраста", + "Enable high contrast mode" : "укључи режим високог контраста", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Режим високог контраста за лакшу навигацију. Визуелни доживљај биће лошији али ће јасноћа бити боља.", + "Light theme" : "Светла тема", + "Enable the default light theme" : "Укључује подразумевану светлу тему", + "The default light appearance." : "Подразумевани светли изглед.", + "Legal notice" : "Правно обавештење", + "Privacy policy" : "Смернице приватности", + "Adjust the Nextcloud theme" : "Прилагоди Некстклауд тему", + "Name" : "Назив", + "Web link" : "Веб веза", + "a safe home for all your data" : "сигурно место за све ваше податке", + "Slogan" : "Слоган", + "Primary color" : "Примарна боја", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Примарна боја се користи за истицање елемената као што су важни дугмићи. Може се донекле изменити у зависности од текуће схеме боја.", + "Legal notice link" : "Правно обавештење", + "Privacy policy link" : "Смернице приватности", + "Header logo" : "Лого заглавља", + "Upload new header logo" : "Отпремите нови лого заглавља", + "Favicon" : "Икона веб стране", + "Upload new favicon" : "Отпремите нову иконицу", + "User settings" : "Корисничка подешавања", + "Disable user theming" : "Искључи корисничке теме", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Мада можете да изаберете и прилагодите своју инстанцу, корисници такође могу да промене своју позадину и боје. Ако желите да форсирате своје прилагођавање, укључите ово подешавање.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Омогућава да лако измените изглед и угођај вашег Некстклауда. Ово ће бити видљиво свим корисницима.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Уместо позадинске слике, такође можете да подесите и просту једнобојну позадину. Ако користите позадинску слику, измена ове боје ће утицати на боју икона у менију апликације.", + "Background color" : "Боја позадине", + "Upload new logo" : "Отпремите нови лого", + "Logo" : "Лого", + "Upload new background and login image" : "Отпреми нову слику позадине и пријављивања", + "Background and login image" : "Позадина и слика пријављивања", + "Advanced options" : "Напредне опције", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте ImageMagick PHP проширење са подшком за SVG слике да би било могуће аутоматско генерисање favicons према отпремљеном логоу и боји.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзални приступ нам је веома важан. Пратимо веб стандарде и проверавамо да све буде употребљиво и без миша а и са помоћним софтвером попут читача екрана. Циљ нам је да будемо усклађени са документом {linkstart}Смернице приступачности веб садржаја{linkend} 2.1 на АА нивоу, а са темом високог контраста чак и на ААА нивоу.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "У случају да наиђете на било какве проблеме, не оклевајте да их пријавите на {issuetracker}наш пратилац проблема{linkend}. А ако желите да се умешате, слободно се прикључите {designteam}нашем дизајн тиму{linkend}!", + "Unable to apply the setting." : "Подешавање није могло да се примени.", + "Appearance and accessibility settings" : "Подешавања изгледа и приступачности", + "Misc accessibility options" : "Разне опције приступаности", + "Enable blur background filter (may increase GPU load)" : "Укључи филтер замућења позадине (може да повећа оптерећење GPU)", + "Customization has been disabled by your administrator" : "Администратор је искључио могућност прилагођавања", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Поставља примарну боју за истицање важних елемената. Боја које се употреби за елементе као што су примарни дугмићи би могла донекле да се промени јер се подешава тако да задовољи захтеве приступачности.", + "Background and color" : "Позадина и боја", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Позадина може да се постави на слику из подразумеваног скупа, произвољну отпремљену слику или просту боју.", + "Keyboard shortcuts" : "Пречице на тастатури", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У неким случајевима пречице тастатуре могу да ремете алатке приступачности. Ако желите да се ваш алат исправно фокусира, овде можете да искључите све пречице на тастатури. Ово ће такође да искључи и све пречице у апликацијама.", + "Disable all keyboard shortcuts" : "Искључи све пречице на тастатури", + "Current selected app: {app}, position {position} of {total}" : "Тренутно изабрана апликација: {app}, позиција {position} од {total}", + "Move up" : "Помери нагоре", + "Move down" : "Помери надоле", + "Select a background from your files" : "Изаберите позадину међу вашим фајловима", + "Select background" : "Изаберите позадину", + "No background has been selected" : "Није изабрана ниједна позадина", + "Custom background" : "Прилагођена позадина", + "Plain background" : "Проста позадина", + "Default background" : "Подразумевана позадина", + "Theme selection is enforced" : "Избор теме је форсиран", + "Could not set the app order" : "Није могао да се подеси редослед апликација", + "Could not reset the app order" : "Није могао да се ресетује редослед апликација", + "Navigation bar settings" : "Подешавања траке за навигацију", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Можете да подесите редослед апликација који ће се користити на траци за навигацију. Прва ставка ће бити подразумевана апликација која се отвара након пријаве или када се кликне на лого.", + "The default app can not be changed because it was configured by the administrator." : "Подразумевана апликација не може да се промени јер ју је подесио администратор.", + "The app order was changed, to see it in action you have to reload the page." : "Редослед апликација је променњен, да бисте видели како изгледа, поново учитајте страницу.", + "Reset default app order" : "Ресетуј подразумевани редослед апликација.", + "Could not set primary color" : "Није могла да се постави примарна боја", + "Reset primary color" : "Ресетуј примарну боју", + "Could not set global default apps" : "Нису могле да се поставе глобалне подразумеване апликације", + "Default app" : "Подразумевана апликација", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Подразумевана апликација је она која се нпр. отвара након пријаве или када се кликне на лого у менију.", + "Use custom default app" : "Користи произвољну подразумевану апликацију", + "Global default app" : "Глобална подразумевана апликација", + "Global default apps" : "Глобалне подразумеване апликације", + "Default app priority" : "Подразумевани приоритет апликације", + "If an app is not enabled for a user, the next app with lower priority is used." : "Ако апликација није укључена за корисника, користиће се наредна апликација са нижим приоритетом.", + "Select a custom color" : "Изаберите прилагођену боју", + "Reset to default" : "Врати на подразумевано", + "Upload" : "Отпреми", + "Remove background image" : "Уклони позадинску слику", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Универзални приступ нам је веома важан. Пратимо веб стандарде и проверавамо да све буде употребљиво и без миша а и са помоћним софтвером попут читача екрана. Циљ нам је да будемо усклађени са документом {guidelines}Смернице приступачности веб садржаја{linkend} 2.1 на АА нивоу а са темом високог контраста и на ААА нивоу.", + ". Unable to apply the setting." : ". Подешавање није могло да се примени." +},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sv.js b/apps/theming/l10n/sv.js new file mode 100644 index 00000000000..dd311b73b08 --- /dev/null +++ b/apps/theming/l10n/sv.js @@ -0,0 +1,114 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Det angivna namnet är för långt", + "The given web address is too long" : "Den angivna adressen är för lång", + "The given web address is not a valid URL" : "Den angivna webbadressen är inte en giltig webbadress", + "The given legal notice address is too long" : "Den angivna juridiska notisadressen är för lång", + "The given legal notice address is not a valid URL" : "Den angivna juridiska notisadressen är inte en giltig webbadress", + "The given privacy policy address is too long" : "Den angivna sekretesspolicyadressen är för lång", + "The given privacy policy address is not a valid URL" : "Den angivna sekretesspolicyadressen är inte en giltig webbadress", + "The given slogan is too long" : "Den angivna slogan är för lång", + "The given color is invalid" : "Den angivna färgen är inte tillgänglig", + "Disable-user-theming should be true or false" : "Inaktivera teman för användare ska vara sant eller falskt", + "Saved" : "Sparat", + "Invalid app given" : "Ogiltig app angiven", + "Invalid type for setting \"defaultApp\" given" : "Ogiltig typ för inställning av \"defaultApp\" angiven", + "Invalid setting key" : "Ogiltig inställningsnyckel", + "The file was uploaded" : "Filen laddades upp", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Uppladdningsfilen är för stor (upload_max_filesize i php.ini)", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den uppladdade filen överstiger MAX_FILE_SIZE-instruktionen specificerad i HTML-form", + "The file was only partially uploaded" : "Filen var endast delvis uppladdad", + "No file was uploaded" : "Ingen fil laddades upp", + "Missing a temporary folder" : "Saknar en temporär mapp", + "Could not write file to disk" : "Kunde inte skriva fil till disk", + "A PHP extension stopped the file upload" : "Ett PHP-tillägg stoppade filuppladdning", + "No file uploaded" : "Ingen fil uppladdad", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du använder redan ett anpassat tema. Dessa appinställningar kan skrivas över.", + "Theming" : "Teman", + "Appearance and accessibility" : "Utseende och tillgänglighet", + "Dark theme with high contrast mode" : "Mörkt tema med högkontrastläge", + "Enable dark high contrast mode" : "Aktivera mörkt högkontrastläge", + "Similar to the high contrast mode, but with dark colours." : "Liknar högkontrastläget, men med mörka färger.", + "Dark theme" : "Mörkt tema", + "Enable dark theme" : "Aktivera mörkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ett mörkt tema som underlättar för dina ögon genom att minska den totala ljusstyrkan.", + "System default theme" : "Systemets standardtema", + "Enable the system default" : "Aktivera systemets standard", + "Using the default system appearance." : "Använder systemets standardutseende.", + "Dyslexia font" : "Teckensnitt för dyslektiker", + "Enable dyslexia font" : "Aktivera teckensnitt för dyslektiker", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic är ett fritt teckensnitt/font som är utformat för att mildra några av de vanligaste lässvårigheterna som orsakas av dyslexi.", + "High contrast mode" : "Läge med hög kontrast", + "Enable high contrast mode" : "Aktivera läge med hög kontrast", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ett läge med hög kontrast för att underlätta din navigering. Visuell kvalitet kommer att minska men tydligheten ökar.", + "Light theme" : "Ljust tema", + "Enable the default light theme" : "Aktivera ljust standardtema", + "The default light appearance." : "Standardutseende för ljust tema.", + "Legal notice" : "Rättsligt meddelande", + "Privacy policy" : "Integritetspolicy", + "Adjust the Nextcloud theme" : "Justera Nextcloud-tema", + "Name" : "Namn", + "Web link" : "Webblänk", + "a safe home for all your data" : "ett säkert hem för all din data", + "Slogan" : "Slogan", + "Primary color" : "Primär färg", + "Legal notice link" : "Länk rättsligt meddelande", + "Privacy policy link" : "Länk integritetspolicy", + "Header logo" : "Huvud-logga", + "Upload new header logo" : "Ladda upp ny huvud-logga", + "Favicon" : "Favicon", + "Upload new favicon" : "Ladda upp nya favicon", + "User settings" : "Användarinställningar", + "Disable user theming" : "Inaktivera teman för användare", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Även om du kan välja och anpassa din instans kan användare ändra sin bakgrund och färger. Om du vill genomdriva din anpassning kan du aktivera detta.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teman gör det möjligt att enkelt skräddarsy utseendet på ditt moln. Detta kommer att synas för alla användare.", + "Background color" : "Bakgrundsfärg", + "Upload new logo" : "Ladda upp ny logotyp", + "Logo" : "Logotyp", + "Upload new background and login image" : "Ladda upp ny bakgrund och inloggningsbild", + "Background and login image" : "Bakgrund och inloggningsbild", + "Advanced options" : "Avancerade inställningar", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installera Imagemagick PHP-tillägget med stöd för SVG-bilder för att automatiskt generera favicons baserat på den uppladdade logotypen och färgen.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Om du hittar några problem, tveka inte att rapportera dem på {issuetracker}vår problemhanterare{linkend}. Och om du vill engagera dig, gå med i {designteam}vårt designteam{linkend}!", + "Appearance and accessibility settings" : "Utseende och tillgänglighetsinställningar", + "Misc accessibility options" : "Diverse tillgänglighetsalternativ", + "Customization has been disabled by your administrator" : "Anpassning har inaktiverats av din administratör", + "Background and color" : "Bakgrund och färg", + "Keyboard shortcuts" : "Tangentbordsgenvägar", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I vissa fall kan tangentbordsgenvägar störa tillgänglighetsverktyg. För att kunna fokusera på ditt verktyg korrekt kan du inaktivera alla tangentbordsgenvägar här. Detta kommer också att inaktivera alla tillgängliga genvägar i appar.", + "Disable all keyboard shortcuts" : "Inaktivera alla tangentbordsgenvägar", + "Current selected app: {app}, position {position} of {total}" : "Aktuell vald app: {app}, position {position} av {total}", + "Move up" : "Flytta upp", + "Move down" : "Flytta ner", + "Select a background from your files" : "Välj en bakgrund från dina filer", + "Select background" : "Välj bakgrund", + "No background has been selected" : "Ingen bakgrund har valts", + "Custom background" : "Anpassad bakgrund", + "Plain background" : "Enkel bakgrund", + "Default background" : "Standardbakgrund", + "Theme selection is enforced" : "Temaval är tvingande", + "Could not set the app order" : "Det gick inte att ställa in appordningen", + "Could not reset the app order" : "Kunde inte återställa appordningen", + "Navigation bar settings" : "Inställningar för navigeringsfältet", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurera appordningen som används för navigeringsfältet. Den första posten kommer att vara standardappen, som öppnas efter inloggning eller när du klickar på logotypen.", + "The default app can not be changed because it was configured by the administrator." : "Standardappen kan inte ändras eftersom den konfigurerades av administratören.", + "The app order was changed, to see it in action you have to reload the page." : "Appordningen ändrades, för att se den måste du ladda om sidan.", + "Reset default app order" : "Återställ standardappordningen", + "Could not set primary color" : "Kunde inte ange primär färg", + "Reset primary color" : "Återställ primär färg", + "Could not set global default apps" : "Det gick inte att ställa in globala standardappar", + "Default app" : "Standardapp", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standardappen är den app som är t.ex. öppnas efter inloggning eller när logotypen i menyn klickas.", + "Use custom default app" : "Använd anpassad standardapp", + "Global default app" : "Global standardapp", + "Global default apps" : "Globala standardappar", + "Default app priority" : "Prioritet för standardappar", + "If an app is not enabled for a user, the next app with lower priority is used." : "Om en app inte är aktiverad för en användare används nästa app med lägre prioritet.", + "Select a custom color" : "Välj en anpassad färg", + "Reset to default" : "Återställ till grundinställningar", + "Upload" : "Ladda upp", + "Remove background image" : "Ta bort bakgrundsbild", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Allmän åtkomst är mycket viktig för oss. Vi följer webbstandarder och kontrollerar att allt är användbart även utan mus och hjälpmedel som skärmläsare. Vi strävar efter att följa {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 på AA-nivå, med temat hög kontrast även på AAA-nivå." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/sv.json b/apps/theming/l10n/sv.json new file mode 100644 index 00000000000..615f7618b41 --- /dev/null +++ b/apps/theming/l10n/sv.json @@ -0,0 +1,112 @@ +{ "translations": { + "The given name is too long" : "Det angivna namnet är för långt", + "The given web address is too long" : "Den angivna adressen är för lång", + "The given web address is not a valid URL" : "Den angivna webbadressen är inte en giltig webbadress", + "The given legal notice address is too long" : "Den angivna juridiska notisadressen är för lång", + "The given legal notice address is not a valid URL" : "Den angivna juridiska notisadressen är inte en giltig webbadress", + "The given privacy policy address is too long" : "Den angivna sekretesspolicyadressen är för lång", + "The given privacy policy address is not a valid URL" : "Den angivna sekretesspolicyadressen är inte en giltig webbadress", + "The given slogan is too long" : "Den angivna slogan är för lång", + "The given color is invalid" : "Den angivna färgen är inte tillgänglig", + "Disable-user-theming should be true or false" : "Inaktivera teman för användare ska vara sant eller falskt", + "Saved" : "Sparat", + "Invalid app given" : "Ogiltig app angiven", + "Invalid type for setting \"defaultApp\" given" : "Ogiltig typ för inställning av \"defaultApp\" angiven", + "Invalid setting key" : "Ogiltig inställningsnyckel", + "The file was uploaded" : "Filen laddades upp", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Uppladdningsfilen är för stor (upload_max_filesize i php.ini)", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Den uppladdade filen överstiger MAX_FILE_SIZE-instruktionen specificerad i HTML-form", + "The file was only partially uploaded" : "Filen var endast delvis uppladdad", + "No file was uploaded" : "Ingen fil laddades upp", + "Missing a temporary folder" : "Saknar en temporär mapp", + "Could not write file to disk" : "Kunde inte skriva fil till disk", + "A PHP extension stopped the file upload" : "Ett PHP-tillägg stoppade filuppladdning", + "No file uploaded" : "Ingen fil uppladdad", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Du använder redan ett anpassat tema. Dessa appinställningar kan skrivas över.", + "Theming" : "Teman", + "Appearance and accessibility" : "Utseende och tillgänglighet", + "Dark theme with high contrast mode" : "Mörkt tema med högkontrastläge", + "Enable dark high contrast mode" : "Aktivera mörkt högkontrastläge", + "Similar to the high contrast mode, but with dark colours." : "Liknar högkontrastläget, men med mörka färger.", + "Dark theme" : "Mörkt tema", + "Enable dark theme" : "Aktivera mörkt tema", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ett mörkt tema som underlättar för dina ögon genom att minska den totala ljusstyrkan.", + "System default theme" : "Systemets standardtema", + "Enable the system default" : "Aktivera systemets standard", + "Using the default system appearance." : "Använder systemets standardutseende.", + "Dyslexia font" : "Teckensnitt för dyslektiker", + "Enable dyslexia font" : "Aktivera teckensnitt för dyslektiker", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic är ett fritt teckensnitt/font som är utformat för att mildra några av de vanligaste lässvårigheterna som orsakas av dyslexi.", + "High contrast mode" : "Läge med hög kontrast", + "Enable high contrast mode" : "Aktivera läge med hög kontrast", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Ett läge med hög kontrast för att underlätta din navigering. Visuell kvalitet kommer att minska men tydligheten ökar.", + "Light theme" : "Ljust tema", + "Enable the default light theme" : "Aktivera ljust standardtema", + "The default light appearance." : "Standardutseende för ljust tema.", + "Legal notice" : "Rättsligt meddelande", + "Privacy policy" : "Integritetspolicy", + "Adjust the Nextcloud theme" : "Justera Nextcloud-tema", + "Name" : "Namn", + "Web link" : "Webblänk", + "a safe home for all your data" : "ett säkert hem för all din data", + "Slogan" : "Slogan", + "Primary color" : "Primär färg", + "Legal notice link" : "Länk rättsligt meddelande", + "Privacy policy link" : "Länk integritetspolicy", + "Header logo" : "Huvud-logga", + "Upload new header logo" : "Ladda upp ny huvud-logga", + "Favicon" : "Favicon", + "Upload new favicon" : "Ladda upp nya favicon", + "User settings" : "Användarinställningar", + "Disable user theming" : "Inaktivera teman för användare", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Även om du kan välja och anpassa din instans kan användare ändra sin bakgrund och färger. Om du vill genomdriva din anpassning kan du aktivera detta.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Teman gör det möjligt att enkelt skräddarsy utseendet på ditt moln. Detta kommer att synas för alla användare.", + "Background color" : "Bakgrundsfärg", + "Upload new logo" : "Ladda upp ny logotyp", + "Logo" : "Logotyp", + "Upload new background and login image" : "Ladda upp ny bakgrund och inloggningsbild", + "Background and login image" : "Bakgrund och inloggningsbild", + "Advanced options" : "Avancerade inställningar", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Installera Imagemagick PHP-tillägget med stöd för SVG-bilder för att automatiskt generera favicons baserat på den uppladdade logotypen och färgen.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Om du hittar några problem, tveka inte att rapportera dem på {issuetracker}vår problemhanterare{linkend}. Och om du vill engagera dig, gå med i {designteam}vårt designteam{linkend}!", + "Appearance and accessibility settings" : "Utseende och tillgänglighetsinställningar", + "Misc accessibility options" : "Diverse tillgänglighetsalternativ", + "Customization has been disabled by your administrator" : "Anpassning har inaktiverats av din administratör", + "Background and color" : "Bakgrund och färg", + "Keyboard shortcuts" : "Tangentbordsgenvägar", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "I vissa fall kan tangentbordsgenvägar störa tillgänglighetsverktyg. För att kunna fokusera på ditt verktyg korrekt kan du inaktivera alla tangentbordsgenvägar här. Detta kommer också att inaktivera alla tillgängliga genvägar i appar.", + "Disable all keyboard shortcuts" : "Inaktivera alla tangentbordsgenvägar", + "Current selected app: {app}, position {position} of {total}" : "Aktuell vald app: {app}, position {position} av {total}", + "Move up" : "Flytta upp", + "Move down" : "Flytta ner", + "Select a background from your files" : "Välj en bakgrund från dina filer", + "Select background" : "Välj bakgrund", + "No background has been selected" : "Ingen bakgrund har valts", + "Custom background" : "Anpassad bakgrund", + "Plain background" : "Enkel bakgrund", + "Default background" : "Standardbakgrund", + "Theme selection is enforced" : "Temaval är tvingande", + "Could not set the app order" : "Det gick inte att ställa in appordningen", + "Could not reset the app order" : "Kunde inte återställa appordningen", + "Navigation bar settings" : "Inställningar för navigeringsfältet", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Du kan konfigurera appordningen som används för navigeringsfältet. Den första posten kommer att vara standardappen, som öppnas efter inloggning eller när du klickar på logotypen.", + "The default app can not be changed because it was configured by the administrator." : "Standardappen kan inte ändras eftersom den konfigurerades av administratören.", + "The app order was changed, to see it in action you have to reload the page." : "Appordningen ändrades, för att se den måste du ladda om sidan.", + "Reset default app order" : "Återställ standardappordningen", + "Could not set primary color" : "Kunde inte ange primär färg", + "Reset primary color" : "Återställ primär färg", + "Could not set global default apps" : "Det gick inte att ställa in globala standardappar", + "Default app" : "Standardapp", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Standardappen är den app som är t.ex. öppnas efter inloggning eller när logotypen i menyn klickas.", + "Use custom default app" : "Använd anpassad standardapp", + "Global default app" : "Global standardapp", + "Global default apps" : "Globala standardappar", + "Default app priority" : "Prioritet för standardappar", + "If an app is not enabled for a user, the next app with lower priority is used." : "Om en app inte är aktiverad för en användare används nästa app med lägre prioritet.", + "Select a custom color" : "Välj en anpassad färg", + "Reset to default" : "Återställ till grundinställningar", + "Upload" : "Ladda upp", + "Remove background image" : "Ta bort bakgrundsbild", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Allmän åtkomst är mycket viktig för oss. Vi följer webbstandarder och kontrollerar att allt är användbart även utan mus och hjälpmedel som skärmläsare. Vi strävar efter att följa {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 på AA-nivå, med temat hög kontrast även på AAA-nivå." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/tr.js b/apps/theming/l10n/tr.js new file mode 100644 index 00000000000..418bc837641 --- /dev/null +++ b/apps/theming/l10n/tr.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Belirtilen ad çok uzun", + "The given web address is too long" : "Belirtilen site adresi çok uzun", + "The given web address is not a valid URL" : "Belirtilen site adresi geçersiz", + "The given legal notice address is too long" : "Belirtilen yasal bildirim adresi çok uzun", + "The given legal notice address is not a valid URL" : "Belirtilen yasal bildirim adresi geçersiz", + "The given privacy policy address is too long" : "Belirtilen kişisel gizliliğin korunması ilkesi adresi çok uzun", + "The given privacy policy address is not a valid URL" : "Belirtilen gizlilik ilkesi adresi geçersiz", + "The given slogan is too long" : "Belirtilen slogan çok uzun", + "The given color is invalid" : "Belirtilen renk geçersiz", + "Disable-user-theming should be true or false" : "Disable-user-theming seçeneği true ya da false olmalıdır", + "Saved" : "Kaydedildi", + "Invalid app given" : "Belirtilen uygulama geçersiz", + "Invalid type for setting \"defaultApp\" given" : "belirtilen \"defaultApp\" ayarı türü geçersiz ", + "Invalid setting key" : "Ayar tuşu geçersiz", + "The file was uploaded" : "Dosya yüklendi", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor", + "The file was only partially uploaded" : "Dosyanın yalnızca bir bölümü yüklendi", + "No file was uploaded" : "Herhangi bir dosya yüklenmedi", + "Missing a temporary folder" : "Geçici klasör bulunamadı", + "Could not write file to disk" : "Dosya diske yazılamadı", + "A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi", + "No file uploaded" : "Henüz bir dosya yüklenmemiş", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Zaten özel bir tema kullanıyorsunuz. Tema uygulaması ayarları bu değer ile değiştirilebilir.", + "Theming" : "Tema", + "Appearance and accessibility" : "Görünüm ve erişilebilirlik", + "PHP Imagick module" : "PHP Imagick modülü", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Tema uygulamasında olmasına rağmen \"imagick\" PHP modülü kullanıma alınmamış. Favicon oluşturma işleminin yapılabilmesi için bu modülü kurmanız ve kullanıma almanız gerekir.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Bu kopyadaki PHP \"imagick\" modülünde SVG desteği yok. Daha iyi başarım ve uyumluluk için bu modülün kurulması önemle önerilir.", + "Dark theme with high contrast mode" : "Koyu tema ve yüksek renk karşıtlığı kipi", + "Enable dark high contrast mode" : "Koyu yüksek renk karşıtlığı kipi kullanılsın", + "Similar to the high contrast mode, but with dark colours." : "Yüksek renk karşıtlığı kipine benzer ancak koyu renkleri kullanır.", + "Dark theme" : "Koyu tema", + "Enable dark theme" : "Koyu tema kullanılsın", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Koyu tema genel aydınlık ve parlaklığı azaltarak gözlerinizi dinlendirir.", + "System default theme" : "Varsayılan sistem teması", + "Enable the system default" : "Sistem varsayılanı kullanılsın", + "Using the default system appearance." : "Varsayılan sistem görünümü kullanılıyor.", + "Dyslexia font" : "Disleksik yazı türü", + "Enable dyslexia font" : "Disleksik yazı türü kullanılsın", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic, disleksi nedeniyle sık karşılaşılan sorunları aşmak için geliştirilmiş ücretsiz bir yazı türüdür.", + "High contrast mode" : "Yüksek renk karşıtlığı kipi", + "Enable high contrast mode" : "Yüksek renk karşıtlığı kipi kullanılsın", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Yüksek renk karşıtlığı kipi gezinmeyi kolaylaştırır. Görsel kalite azalır ancak netlik artar.", + "Light theme" : "Açık tema", + "Enable the default light theme" : "Varsayılan açık tema kullanılsın", + "The default light appearance." : "Varsayılan açık renkli görünüm.", + "Legal notice" : "Yasal bildirim", + "Privacy policy" : "Kişisel gizliliğin korunması ilkesi", + "Adjust the Nextcloud theme" : "Nextcloud temasını ayarla", + "Name" : "Ad", + "Web link" : "Site bağlantısı", + "a safe home for all your data" : "verileriniz için güvenli bir barınak", + "Slogan" : "Slogan", + "Primary color" : "Birincil renk", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Birincil renk, önemli düğmeler gibi ögeleri vurgulamak için kullanılır. Geçerli renk temasına bağlı olarak biraz değiştirilebilir.", + "Legal notice link" : "Yasal bildirim bağlantısı", + "Privacy policy link" : "Gizlilik ilkesi bağlantısı", + "Header logo" : "Üst bilgi logosu", + "Upload new header logo" : "Yeni üst bilgi logosu yükle", + "Favicon" : "Favicon", + "Upload new favicon" : "Yeni favicon yükle", + "User settings" : "Kullanıcı ayarları", + "Disable user theming" : "Kullanıcı teması kullanımdan kaldırılsın", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kopyanızı seçip özelleştirebilmenize rağmen, kullanıcılar arka planlarını ve renklerini değiştirebilir. Özelleştirmenizi zorunlu kılmak istiyorsanız, bu seçeneği açabilirsiniz.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temalar kullandığınız kopyanın ve desteklenen istemcilerin genel görünümün kolayca değiştirilmesini sağlar. Tüm kullanıcılara görüntülenir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Arka plan görseli yerine düz bir arka plan rengi de yapılandırabilirsiniz. Arka plan görseli kullanıyorsanız bu rengi değiştirmek uygulama menüsü simgelerinin rengini etkiler.", + "Background color" : "Arka plan rengi", + "Upload new logo" : "Yeni logo yükle", + "Logo" : "Logo", + "Upload new background and login image" : "Yeni arka plan ve oturum açma görselini yükleyin", + "Background and login image" : "Arka plan ve oturum açma görseli", + "Advanced options" : "Gelişmiş ayarlar", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Yüklenen logo ve renge göre otomatik olarak favicon oluşturulması için ImageMagick PHP eklentisini SVG desteği ile kurun.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uygulamalarımızı herkesin kullanabilmesini çok önemsiyoruz. internet sitesi standartlarını izleyerek, işlemlerin fare olmadan da yapılabilmesini ve ekran okuyucular gibi yardımcı yazılımların kullanılabilmesini sağlıyoruz. AAA düzeyinde yüksek renk karşıtlığı teması ile AA düzeyinde {linkstart}İnternet Sitesi İçeriği Erişilebilirlik Kuralları{linkend} 2.1 ile uyumlu olmayı amaçladık.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Bir sorunla karşılaşırsanız, bunları {issuetracker}sorun izleyicimiz{linkend} üzerinden bildirmekten çekinmeyin. Katkıda bulunmak istiyorsanız {designteam}tasarım ekibimize{linkend} katılın!", + "Unable to apply the setting." : "Ayar uygulanamadı.", + "Appearance and accessibility settings" : "Görünüm ve erişilebilirlik ayarları", + "Misc accessibility options" : "Çeşitli erişilebilirlik seçenekleri", + "Enable blur background filter (may increase GPU load)" : "Arka plan bulanıklaştırılsın (grafik işlemci yükünü artırabilir)", + "Customization has been disabled by your administrator" : "Özelleştirme özelliği yöneticiniz tarafından kapatılmış", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Önemli ögeleri vurgulamak için bir birincil renk ayarlayın. Birincil düğmeler gibi ögeler için kullanılan renk, erişilebilirlik gereksinimlerini karşılamak üzere ayarlandığında biraz farklılık gösterebilir.", + "Background and color" : "Arka plan ve renk", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Arka plan varsayılan ayardaki bir görsele, özel olarak yüklenen bir görsele veya düz bir renge ayarlanabilir.", + "Keyboard shortcuts" : "Kısayol tuşları", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Bazı durumlarda klavye kısayolları erişilebilirlik araçlarına etki edebilir. Aracınıza doğru şekilde odaklanmanızı sağlamak için tüm klavye kısayollarını buradan kullanımdan kaldırabilirsiniz. Bu aynı zamanda uygulamalarda var olan tüm kısayolları da kullanımdan kaldırır.", + "Disable all keyboard shortcuts" : "Tüm klavye kısayolları kullanımdan kaldırılsın", + "Current selected app: {app}, position {position} of {total}" : "Seçilmiş geçerli uygulama: {app}, {position} / {total} konumunda", + "Move up" : "Yukarı taşı", + "Move down" : "Aşağı taşı", + "Select a background from your files" : "Dosyalarınızdan bir arka plan seçin", + "Select background" : "Arka planı seçin", + "No background has been selected" : "Herhangi bir arka plan seçilmemiş", + "Custom background" : "Özel arka plan", + "Plain background" : "Düz arka plan", + "Default background" : "Varsayılan arka plan", + "Theme selection is enforced" : "Tema seçimi zorunlu kılınmış", + "Could not set the app order" : "Uygulama sırası ayarlanamadı", + "Could not reset the app order" : "Uygulama sırasını sıfırla", + "Navigation bar settings" : "Gezinme çubuğu ayarları", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Gezinme çubuğundaki uygulama sırasını yapılandırabilirsiniz. İlk kayıt, oturum açtıktan sonra ya da logoya tıklandığında açılacak varsayılan uygulama olur.", + "The default app can not be changed because it was configured by the administrator." : "Varsayılan uygulama, yönetici tarafından yapılandırıldığından değiştirilemez.", + "The app order was changed, to see it in action you have to reload the page." : "Uygulama sırası değiştirildi. Uygulamanın açıldığını görmek için sayfayı yeniden yüklemelisiniz.", + "Reset default app order" : "Varsayılan uygulama sırasını yükle", + "Could not set primary color" : "Birincil renk ayarlanamadı", + "Reset primary color" : "Birincil rengi sıfırla", + "Could not set global default apps" : "Genel varsayılan uygulamalar ayarlanamadı", + "Default app" : "Varsayılan uygulama", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Varsayılan uygulama, oturum açtıktan ya da menüdeki logo üzerine tıkladıktan sonra açılır.", + "Use custom default app" : "Özel varsayılan uygulama kullanılsın", + "Global default app" : "Genel varsayılan uygulama", + "Global default apps" : "Genel varsayılan uygulamalar", + "Default app priority" : "Varsayılan uygulama önceliği", + "If an app is not enabled for a user, the next app with lower priority is used." : "Bir uygulama, bir kullanıcı için kullanıma alınmamışsa, daha düşük öncelikli bir sonraki uygulama kullanılır.", + "Select a custom color" : "Özel bir renk seçin", + "Reset to default" : "Varsayılanlara dön", + "Upload" : "Yükle", + "Remove background image" : "Arka plan görselini kaldır", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uygulamalarımızı herkesin kullanabilmesini çok önemsiyoruz. internet sitesi standartlarını izleyerek, işlemlerin fare olmadan da yapılabilmesini ve ekran okuyucular gibi yardımcı yazılımların kullanılabilmesini sağlıyoruz. AAA düzeyinde yüksek renk karşıtlığı teması ile AA düzeyinde {guidelines}İnternet Sitesi İçeriği Erişilebilirlik Kuralları{linkend} 2.1 ile uyumlu olmayı amaçladık.", + ". Unable to apply the setting." : ". Ayar uygulanamadı." +}, +"nplurals=2; plural=(n > 1);"); diff --git a/apps/theming/l10n/tr.json b/apps/theming/l10n/tr.json new file mode 100644 index 00000000000..3642c44db8f --- /dev/null +++ b/apps/theming/l10n/tr.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Belirtilen ad çok uzun", + "The given web address is too long" : "Belirtilen site adresi çok uzun", + "The given web address is not a valid URL" : "Belirtilen site adresi geçersiz", + "The given legal notice address is too long" : "Belirtilen yasal bildirim adresi çok uzun", + "The given legal notice address is not a valid URL" : "Belirtilen yasal bildirim adresi geçersiz", + "The given privacy policy address is too long" : "Belirtilen kişisel gizliliğin korunması ilkesi adresi çok uzun", + "The given privacy policy address is not a valid URL" : "Belirtilen gizlilik ilkesi adresi geçersiz", + "The given slogan is too long" : "Belirtilen slogan çok uzun", + "The given color is invalid" : "Belirtilen renk geçersiz", + "Disable-user-theming should be true or false" : "Disable-user-theming seçeneği true ya da false olmalıdır", + "Saved" : "Kaydedildi", + "Invalid app given" : "Belirtilen uygulama geçersiz", + "Invalid type for setting \"defaultApp\" given" : "belirtilen \"defaultApp\" ayarı türü geçersiz ", + "Invalid setting key" : "Ayar tuşu geçersiz", + "The file was uploaded" : "Dosya yüklendi", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor", + "The file was only partially uploaded" : "Dosyanın yalnızca bir bölümü yüklendi", + "No file was uploaded" : "Herhangi bir dosya yüklenmedi", + "Missing a temporary folder" : "Geçici klasör bulunamadı", + "Could not write file to disk" : "Dosya diske yazılamadı", + "A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi", + "No file uploaded" : "Henüz bir dosya yüklenmemiş", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Zaten özel bir tema kullanıyorsunuz. Tema uygulaması ayarları bu değer ile değiştirilebilir.", + "Theming" : "Tema", + "Appearance and accessibility" : "Görünüm ve erişilebilirlik", + "PHP Imagick module" : "PHP Imagick modülü", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Tema uygulamasında olmasına rağmen \"imagick\" PHP modülü kullanıma alınmamış. Favicon oluşturma işleminin yapılabilmesi için bu modülü kurmanız ve kullanıma almanız gerekir.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Bu kopyadaki PHP \"imagick\" modülünde SVG desteği yok. Daha iyi başarım ve uyumluluk için bu modülün kurulması önemle önerilir.", + "Dark theme with high contrast mode" : "Koyu tema ve yüksek renk karşıtlığı kipi", + "Enable dark high contrast mode" : "Koyu yüksek renk karşıtlığı kipi kullanılsın", + "Similar to the high contrast mode, but with dark colours." : "Yüksek renk karşıtlığı kipine benzer ancak koyu renkleri kullanır.", + "Dark theme" : "Koyu tema", + "Enable dark theme" : "Koyu tema kullanılsın", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Koyu tema genel aydınlık ve parlaklığı azaltarak gözlerinizi dinlendirir.", + "System default theme" : "Varsayılan sistem teması", + "Enable the system default" : "Sistem varsayılanı kullanılsın", + "Using the default system appearance." : "Varsayılan sistem görünümü kullanılıyor.", + "Dyslexia font" : "Disleksik yazı türü", + "Enable dyslexia font" : "Disleksik yazı türü kullanılsın", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic, disleksi nedeniyle sık karşılaşılan sorunları aşmak için geliştirilmiş ücretsiz bir yazı türüdür.", + "High contrast mode" : "Yüksek renk karşıtlığı kipi", + "Enable high contrast mode" : "Yüksek renk karşıtlığı kipi kullanılsın", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Yüksek renk karşıtlığı kipi gezinmeyi kolaylaştırır. Görsel kalite azalır ancak netlik artar.", + "Light theme" : "Açık tema", + "Enable the default light theme" : "Varsayılan açık tema kullanılsın", + "The default light appearance." : "Varsayılan açık renkli görünüm.", + "Legal notice" : "Yasal bildirim", + "Privacy policy" : "Kişisel gizliliğin korunması ilkesi", + "Adjust the Nextcloud theme" : "Nextcloud temasını ayarla", + "Name" : "Ad", + "Web link" : "Site bağlantısı", + "a safe home for all your data" : "verileriniz için güvenli bir barınak", + "Slogan" : "Slogan", + "Primary color" : "Birincil renk", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Birincil renk, önemli düğmeler gibi ögeleri vurgulamak için kullanılır. Geçerli renk temasına bağlı olarak biraz değiştirilebilir.", + "Legal notice link" : "Yasal bildirim bağlantısı", + "Privacy policy link" : "Gizlilik ilkesi bağlantısı", + "Header logo" : "Üst bilgi logosu", + "Upload new header logo" : "Yeni üst bilgi logosu yükle", + "Favicon" : "Favicon", + "Upload new favicon" : "Yeni favicon yükle", + "User settings" : "Kullanıcı ayarları", + "Disable user theming" : "Kullanıcı teması kullanımdan kaldırılsın", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Kopyanızı seçip özelleştirebilmenize rağmen, kullanıcılar arka planlarını ve renklerini değiştirebilir. Özelleştirmenizi zorunlu kılmak istiyorsanız, bu seçeneği açabilirsiniz.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Temalar kullandığınız kopyanın ve desteklenen istemcilerin genel görünümün kolayca değiştirilmesini sağlar. Tüm kullanıcılara görüntülenir.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Arka plan görseli yerine düz bir arka plan rengi de yapılandırabilirsiniz. Arka plan görseli kullanıyorsanız bu rengi değiştirmek uygulama menüsü simgelerinin rengini etkiler.", + "Background color" : "Arka plan rengi", + "Upload new logo" : "Yeni logo yükle", + "Logo" : "Logo", + "Upload new background and login image" : "Yeni arka plan ve oturum açma görselini yükleyin", + "Background and login image" : "Arka plan ve oturum açma görseli", + "Advanced options" : "Gelişmiş ayarlar", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Yüklenen logo ve renge göre otomatik olarak favicon oluşturulması için ImageMagick PHP eklentisini SVG desteği ile kurun.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uygulamalarımızı herkesin kullanabilmesini çok önemsiyoruz. internet sitesi standartlarını izleyerek, işlemlerin fare olmadan da yapılabilmesini ve ekran okuyucular gibi yardımcı yazılımların kullanılabilmesini sağlıyoruz. AAA düzeyinde yüksek renk karşıtlığı teması ile AA düzeyinde {linkstart}İnternet Sitesi İçeriği Erişilebilirlik Kuralları{linkend} 2.1 ile uyumlu olmayı amaçladık.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Bir sorunla karşılaşırsanız, bunları {issuetracker}sorun izleyicimiz{linkend} üzerinden bildirmekten çekinmeyin. Katkıda bulunmak istiyorsanız {designteam}tasarım ekibimize{linkend} katılın!", + "Unable to apply the setting." : "Ayar uygulanamadı.", + "Appearance and accessibility settings" : "Görünüm ve erişilebilirlik ayarları", + "Misc accessibility options" : "Çeşitli erişilebilirlik seçenekleri", + "Enable blur background filter (may increase GPU load)" : "Arka plan bulanıklaştırılsın (grafik işlemci yükünü artırabilir)", + "Customization has been disabled by your administrator" : "Özelleştirme özelliği yöneticiniz tarafından kapatılmış", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Önemli ögeleri vurgulamak için bir birincil renk ayarlayın. Birincil düğmeler gibi ögeler için kullanılan renk, erişilebilirlik gereksinimlerini karşılamak üzere ayarlandığında biraz farklılık gösterebilir.", + "Background and color" : "Arka plan ve renk", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Arka plan varsayılan ayardaki bir görsele, özel olarak yüklenen bir görsele veya düz bir renge ayarlanabilir.", + "Keyboard shortcuts" : "Kısayol tuşları", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Bazı durumlarda klavye kısayolları erişilebilirlik araçlarına etki edebilir. Aracınıza doğru şekilde odaklanmanızı sağlamak için tüm klavye kısayollarını buradan kullanımdan kaldırabilirsiniz. Bu aynı zamanda uygulamalarda var olan tüm kısayolları da kullanımdan kaldırır.", + "Disable all keyboard shortcuts" : "Tüm klavye kısayolları kullanımdan kaldırılsın", + "Current selected app: {app}, position {position} of {total}" : "Seçilmiş geçerli uygulama: {app}, {position} / {total} konumunda", + "Move up" : "Yukarı taşı", + "Move down" : "Aşağı taşı", + "Select a background from your files" : "Dosyalarınızdan bir arka plan seçin", + "Select background" : "Arka planı seçin", + "No background has been selected" : "Herhangi bir arka plan seçilmemiş", + "Custom background" : "Özel arka plan", + "Plain background" : "Düz arka plan", + "Default background" : "Varsayılan arka plan", + "Theme selection is enforced" : "Tema seçimi zorunlu kılınmış", + "Could not set the app order" : "Uygulama sırası ayarlanamadı", + "Could not reset the app order" : "Uygulama sırasını sıfırla", + "Navigation bar settings" : "Gezinme çubuğu ayarları", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Gezinme çubuğundaki uygulama sırasını yapılandırabilirsiniz. İlk kayıt, oturum açtıktan sonra ya da logoya tıklandığında açılacak varsayılan uygulama olur.", + "The default app can not be changed because it was configured by the administrator." : "Varsayılan uygulama, yönetici tarafından yapılandırıldığından değiştirilemez.", + "The app order was changed, to see it in action you have to reload the page." : "Uygulama sırası değiştirildi. Uygulamanın açıldığını görmek için sayfayı yeniden yüklemelisiniz.", + "Reset default app order" : "Varsayılan uygulama sırasını yükle", + "Could not set primary color" : "Birincil renk ayarlanamadı", + "Reset primary color" : "Birincil rengi sıfırla", + "Could not set global default apps" : "Genel varsayılan uygulamalar ayarlanamadı", + "Default app" : "Varsayılan uygulama", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Varsayılan uygulama, oturum açtıktan ya da menüdeki logo üzerine tıkladıktan sonra açılır.", + "Use custom default app" : "Özel varsayılan uygulama kullanılsın", + "Global default app" : "Genel varsayılan uygulama", + "Global default apps" : "Genel varsayılan uygulamalar", + "Default app priority" : "Varsayılan uygulama önceliği", + "If an app is not enabled for a user, the next app with lower priority is used." : "Bir uygulama, bir kullanıcı için kullanıma alınmamışsa, daha düşük öncelikli bir sonraki uygulama kullanılır.", + "Select a custom color" : "Özel bir renk seçin", + "Reset to default" : "Varsayılanlara dön", + "Upload" : "Yükle", + "Remove background image" : "Arka plan görselini kaldır", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Uygulamalarımızı herkesin kullanabilmesini çok önemsiyoruz. internet sitesi standartlarını izleyerek, işlemlerin fare olmadan da yapılabilmesini ve ekran okuyucular gibi yardımcı yazılımların kullanılabilmesini sağlıyoruz. AAA düzeyinde yüksek renk karşıtlığı teması ile AA düzeyinde {guidelines}İnternet Sitesi İçeriği Erişilebilirlik Kuralları{linkend} 2.1 ile uyumlu olmayı amaçladık.", + ". Unable to apply the setting." : ". Ayar uygulanamadı." +},"pluralForm" :"nplurals=2; plural=(n > 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ug.js b/apps/theming/l10n/ug.js new file mode 100644 index 00000000000..a7f0e89c285 --- /dev/null +++ b/apps/theming/l10n/ug.js @@ -0,0 +1,122 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "بېرىلگەن ئىسىم بەك ئۇزۇن", + "The given web address is too long" : "بېرىلگەن تور ئادرېسى بەك ئۇزۇن", + "The given web address is not a valid URL" : "بېرىلگەن تور ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given legal notice address is too long" : "بېرىلگەن قانۇن ئۇقتۇرۇشى ئادرېسى بەك ئۇزۇن", + "The given legal notice address is not a valid URL" : "بېرىلگەن قانۇن ئۇقتۇرۇشى ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given privacy policy address is too long" : "بېرىلگەن مەخپىيەتلىك سىياسىتى ئادرېسى بەك ئۇزۇن", + "The given privacy policy address is not a valid URL" : "بېرىلگەن مەخپىيەتلىك سىياسىتى ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given slogan is too long" : "بېرىلگەن شۇئار بەك ئۇزۇن", + "The given color is invalid" : "بېرىلگەن رەڭ ئىناۋەتسىز", + "Disable-user-theming should be true or false" : "چەكلەش-ئىشلەتكۈچى باش تېمىسى راست ياكى يالغان بولۇشى كېرەك", + "Saved" : "ساقلاندى", + "Invalid app given" : "ئىناۋەتسىز ئەپ بېرىلگەن", + "Invalid type for setting \"defaultApp\" given" : "بېرىلگەن \"defaultApp\" نى تەڭشەشنىڭ ئىناۋەتسىز تىپى", + "Invalid setting key" : "تەڭشەش كۇنۇپكىسى ئىناۋەتسىز", + "The file was uploaded" : "ھۆججەت يۈكلەندى", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "يۈكلەنگەن ھۆججەت php.ini دىكى upload_max_filesize كۆرسەتمىسىدىن ئېشىپ كەتتى", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "يۈكلەنگەن ھۆججەت HTML شەكلىدە كۆرسىتىلگەن MAX_FILE_SIZE كۆرسەتمىسىدىن ئېشىپ كەتتى", + "The file was only partially uploaded" : "بۇ ھۆججەت پەقەت قىسمەن يوللانغان", + "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى", + "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.", + "Could not write file to disk" : "دىسكىغا ھۆججەت يازالمىدى", + "A PHP extension stopped the file upload" : "PHP كېڭەيتىلمىسى ھۆججەت يوللاشنى توختاتتى", + "No file uploaded" : "ھۆججەت يۈكلەنمىدى", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "سىز ئاللىبۇرۇن خاس ئۇسلۇبنى ئىشلىتىۋاتىسىز. تېما دېتالىنىڭ تەڭشىكى ئۇنىڭ تەرىپىدىن يېزىلغان بولۇشى مۇمكىن.", + "Theming" : "Theming", + "Appearance and accessibility" : "تاشقى كۆرۈنۈشى ۋە قولايلىقلىقى", + "PHP Imagick module" : "PHP تەسەۋۋۇر مودۇلى", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "باش تېما دېتالى بولسىمۇ PHP مودۇلى «imagick» قوزغىتىلمىدى. Favicon ئەۋلادلىرىنىڭ نورمال ئىشلىشى ئۈچۈن ، بۇ مودۇلنى ئورنىتىشىڭىز ۋە قوزغىتىشىڭىز كېرەك.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "بۇ خىلدىكى PHP مودۇلى «تەسەۋۋۇر» SVG نى قوللىمايدۇ. تېخىمۇ ياخشى ماسلىشىش ئۈچۈن ئۇنى ئورنىتىش تەۋسىيە قىلىنىدۇ.", + "Dark theme with high contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتىدىكى قاراڭغۇ تېما", + "Enable dark high contrast mode" : "قاراڭغۇ يۇقىرى سېلىشتۇرما ھالىتىنى قوزغىتىڭ", + "Similar to the high contrast mode, but with dark colours." : "يۇقىرى سېلىشتۇرما ھالىتىگە ئوخشاش ، ئەمما قېنىق رەڭلەر بىلەن.", + "Dark theme" : "قاراڭغۇ تېما", + "Enable dark theme" : "قاراڭغۇ باشتېمىنى قوزغىتىڭ", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "ئومۇمىي يورۇقلۇق ۋە يورۇقلۇقنى تۆۋەنلىتىش ئارقىلىق كۆزىڭىزنى ئاسانلاشتۇرىدىغان قاراڭغۇ تېما.", + "System default theme" : "سىستېما سۈكۈتتىكى باشتېما", + "Enable the system default" : "سىستېمىنىڭ سۈكۈتتىكى ھالىتىنى قوزغىتىڭ", + "Using the default system appearance." : "سۈكۈتتىكى سىستېما كۆرۈنۈشىنى ئىشلىتىش.", + "Dyslexia font" : "Dyslexia خەت نۇسخىسى", + "Enable dyslexia font" : "Dyslexia خەت نۇسخىسىنى قوزغىتىڭ", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic بىر خىل ھەقسىز خەت شەكلى / خەت نۇسخىسى بولۇپ ، ھەزىم قىلىش ئىقتىدارى تۆۋەنلەش سەۋەبىدىن كېلىپ چىققان بىر قىسىم كۆپ كۆرۈلىدىغان خاتالىقلارنى ئازايتىدۇ.", + "High contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتى", + "Enable high contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتىنى قوزغىتىڭ", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "يول باشلىشىڭىزنى ئاسانلاشتۇرىدىغان يۇقىرى سېلىشتۇرما ھالەت. كۆرۈش سۈپىتى تۆۋەنلەيدۇ ، ئەمما ئېنىقلىق دەرىجىسى ئۆستۈرۈلىدۇ.", + "Light theme" : "يېنىك تېما", + "Enable the default light theme" : "سۈكۈتتىكى نۇر تېمىسىنى قوزغىتىڭ", + "The default light appearance." : "سۈكۈتتىكى نۇر كۆرۈنۈشى.", + "Legal notice" : "قانۇن ئۇقتۇرۇشى", + "Privacy policy" : "مەخپىيەتلىك تۈزۈمى", + "Adjust the Nextcloud theme" : "Nextcloud تېمىسىنى تەڭشەڭ", + "Name" : "ئاتى", + "Web link" : "تور ئۇلىنىشى", + "a safe home for all your data" : "بارلىق سانلىق مەلۇماتلىرىڭىز ئۈچۈن بىخەتەر ئۆي", + "Slogan" : "شۇئار", + "Primary color" : "دەسلەپكى رەڭ", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "دەسلەپكى رەڭ مۇھىم كۇنۇپكىلارغا ئوخشاش ئېلېمېنتلارنى گەۋدىلەندۈرۈشكە ئىشلىتىلىدۇ. ئۇ ھازىرقى رەڭ لايىھىسىگە ئاساسەن ئازراق تەڭشىلىشى مۇمكىن.", + "Legal notice link" : "قانۇن ئۇقتۇرۇشى", + "Privacy policy link" : "مەخپىيەتلىك سىياسىتى ئۇلىنىشى", + "Header logo" : "بەت بەلگىسى", + "Upload new header logo" : "يېڭى ماۋزۇ بەلگىسىنى يۈكلەڭ", + "Favicon" : "Favicon", + "Upload new favicon" : "يېڭى favicon نى يۈكلەڭ", + "User settings" : "ئىشلەتكۈچى تەڭشەكلىرى", + "Disable user theming" : "ئىشلەتكۈچى باشتېمىسىنى چەكلەڭ", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "سىز ئۈلگىڭىزنى تاللىسىڭىز ۋە خاسلاشتۇرسىڭىزمۇ ، ئابونتلار ئۇلارنىڭ ئارقا كۆرۈنۈشى ۋە رەڭگىنى ئۆزگەرتەلەيدۇ. خاسلاشتۇرۇشنى ئىجرا قىلماقچى بولسىڭىز ، ئۇنى ئاچسىڭىز بولىدۇ.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "تېمىڭىز سىزنىڭ قوللىشىڭىز ۋە قوللىغان خېرىدارلىرىڭىزنىڭ كۆرۈنۈشى ۋە ھېسسىياتىنى ئاسانلا خاسلاشتۇرالايدۇ. بۇ بارلىق ئىشلەتكۈچىلەر ئۈچۈن كۆرۈنىدۇ.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "تەگلىك رەسىمنىڭ ئورنىغا ئاددىي تەگلىك رەڭگىمۇ تەڭشىيەلەيسىز. تەگلىك سۈرىتىنى ئىشلەتسىڭىز بۇ رەڭنى ئۆزگەرتسىڭىز ئەپ تىزىملىكى سىنبەلگىسىنىڭ رەڭگىگە تەسىر كۆرسىتىدۇ.", + "Background color" : "تەگلىك رەڭگى", + "Upload new logo" : "يېڭى بەلگە يۈكلەڭ", + "Logo" : "Logo", + "Upload new background and login image" : "يېڭى تەگلىك ۋە كىرىش سۈرىتىنى يۈكلەڭ", + "Background and login image" : "تەگلىك ۋە كىرىش سۈرىتى", + "Advanced options" : "ئىلغار تاللاشلار", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "يۈكلەنگەن لوگو ۋە رەڭگە ئاساسەن SVG رەسىملىرىنى قوللاپ ImageMagick PHP كېڭەيتىلمىسىنى قاچىلاڭ.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "ئەگەر مەسىلىگە يولۇقسىڭىز ، ئىككىلەنمەستىن ئۇلارنى {issuetracker} بىزنىڭ مەسىلە ئىز قوغلاش {linkend} on غا دوكلات قىلىڭ. ئەگەر قاتناشماقچى بولسىڭىز ، {designteam} بىزنىڭ لايىھىلەش ئەترىتىمىز {linkend} join غا قوشۇلۇڭ.", + "Appearance and accessibility settings" : "كۆرۈنۈش ۋە زىيارەت قىلىش تەڭشەكلىرى", + "Misc accessibility options" : "قولايلىق تاللاش تاللانمىلىرى", + "Enable blur background filter (may increase GPU load)" : "تۇتۇق تەگلىك سۈزگۈچنى قوزغىتىڭ (GPU يۈكىنى ئاشۇرۇشى مۇمكىن)", + "Customization has been disabled by your administrator" : "باشقۇرغۇچىڭىز تەرىپىدىن خاسلاشتۇرۇش چەكلەنگەن", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "مۇھىم ئېلېمېنتلارنى گەۋدىلەندۈرۈش ئۈچۈن دەسلەپكى رەڭ بەلگىلەڭ. دەسلەپكى كۇنۇپكىلار قاتارلىق ئېلېمېنتلارغا ئىشلىتىلىدىغان رەڭ قولايلىق بولۇش تەلىپىنى قاندۇرۇش ئۈچۈن تەڭشەلگەندە ئازراق پەرقلىنىشى مۇمكىن.", + "Background and color" : "تەگلىك ۋە رەڭ", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "تەگلىك سۈكۈتتىكى سۈكۈتتىكى رەسىم ، ئىختىيارى يۈكلەنگەن رەسىم ياكى ئوچۇق رەڭگە تەڭشىلىدۇ.", + "Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "بەزى ئەھۋاللاردا كۇنۇپكا تاختىسىنىڭ تېزلەتمىلىرى قولايلىق قوراللارغا دەخلى قىلىدۇ. قورالىڭىزغا توغرا دىققەت قىلىش ئۈچۈن ، بۇ يەردىكى بارلىق كۇنۇپكا تاختىسىنى چەكلىيەلەيسىز. بۇ يەنە ئەپلەردىكى بارلىق تېزلەتمىلەرنى چەكلەيدۇ.", + "Disable all keyboard shortcuts" : "بارلىق كۇنۇپكا تاختىسىنى چەكلەڭ", + "Current selected app: {app}, position {position} of {total}" : "نۆۋەتتىكى تاللانغان ئەپ: {app} ، ئورنى {position} {total}", + "Move up" : "يۆتكەڭ", + "Move down" : "تۆۋەنگە يۆتكەڭ", + "Select a background from your files" : "ھۆججەتلىرىڭىزدىن تەگلىك تاللاڭ", + "Select background" : "تەگلىكنى تاللاڭ", + "No background has been selected" : "تەگلىك تاللانمىدى", + "Custom background" : "ئىختىيارى تەگلىك", + "Plain background" : "تۈزلەڭلىك تەگلىكى", + "Default background" : "سۈكۈتتىكى تەگلىك", + "Theme selection is enforced" : "باشتېما تاللاش ئىجرا قىلىنىدۇ", + "Could not set the app order" : "ئەپ تەرتىپىنى تەڭشىيەلمىدى", + "Could not reset the app order" : "ئەپ تەرتىپىنى ئەسلىگە كەلتۈرەلمىدى", + "Navigation bar settings" : "يولباشچى تاياقچە تەڭشىكى", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "يولباشچى ستونىغا ئىشلىتىلىدىغان ئەپ تەرتىپىنى تەڭشىيەلەيسىز. بىرىنچى تۈر سۈكۈتتىكى ئەپ بولۇپ ، كىرگەندىن كېيىن ياكى بەلگىنى چەككەندە ئېچىلىدۇ.", + "The default app can not be changed because it was configured by the administrator." : "سۈكۈتتىكى ئەپنى باشقۇرغۇچى تەڭشىگەنلىكى ئۈچۈن ئۆزگەرتكىلى بولمايدۇ.", + "The app order was changed, to see it in action you have to reload the page." : "ئەپ تەرتىپى ئۆزگەرتىلدى ، ئۇنى ھەرىكەتتە كۆرۈش ئۈچۈن بەتنى قايتا يۈكلىشىڭىز كېرەك.", + "Reset default app order" : "كۆڭۈلدىكى ئەپ تەرتىپىنى ئەسلىگە كەلتۈرۈڭ", + "Could not set primary color" : "دەسلەپكى رەڭنى تەڭشىگىلى بولمىدى", + "Reset primary color" : "دەسلەپكى رەڭنى ئەسلىگە كەلتۈرۈڭ", + "Could not set global default apps" : "يەرشارى سۈكۈتتىكى ئەپلەرنى تەڭشىيەلمىدى", + "Default app" : "كۆڭۈلدىكى ئەپ", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "سۈكۈتتىكى ئەپ بولسا ئەپ. كىرگەندىن كېيىن ياكى تىزىملىكتىكى بەلگە چەككەندە ئېچىلدى.", + "Use custom default app" : "ئىختىيارى كۆڭۈلدىكى ئەپنى ئىشلىتىڭ", + "Global default app" : "يەرشارى سۈكۈتتىكى ئەپ", + "Global default apps" : "يەرشارىدىكى سۈكۈتتىكى ئەپلەر", + "Default app priority" : "كۆڭۈلدىكى ئەپ ئەۋزەللىكى", + "If an app is not enabled for a user, the next app with lower priority is used." : "ئەگەر بىر ئىشلەتكۈچى ئۈچۈن بىر ئەپ قوزغىتىلمىغان بولسا ، تۆۋەن ئورۇنغا قويۇلغان كېيىنكى ئەپ ئىشلىتىلىدۇ.", + "Select a custom color" : "ئىختىيارى رەڭنى تاللاڭ", + "Reset to default" : "سۈكۈتتىكى ھالىتىگە قايتىڭ", + "Upload" : "يۈكلە", + "Remove background image" : "تەگلىك سۈرىتىنى ئۆچۈرۈڭ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ھەممىباب زىيارەت قىلىش بىز ئۈچۈن ئىنتايىن مۇھىم. بىز تور ئۆلچىمىگە ئەمەل قىلىپ ، مائۇسسىز ۋە ئېكران ئوقۇغۇچ قاتارلىق ياردەمچى يۇمشاق دېتاللارنىڭ ھەممىسىنى ئىشلىتىشكە بولىدىغانلىقىنى تەكشۈرۈپ تۇرىمىز. بىز AA سەۋىيىسىدىكى {guidelines} تور مەزمۇنىنىڭ زىيارەت قىلىش قوللانمىسى {linkend} 2.1 گە ماسلىشىشنى مەقسەت قىلىمىز ، يۇقىرى سېلىشتۇرما تېمىسى ھەتتا AAA سەۋىيىسىدە." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/ug.json b/apps/theming/l10n/ug.json new file mode 100644 index 00000000000..265de7c6456 --- /dev/null +++ b/apps/theming/l10n/ug.json @@ -0,0 +1,120 @@ +{ "translations": { + "The given name is too long" : "بېرىلگەن ئىسىم بەك ئۇزۇن", + "The given web address is too long" : "بېرىلگەن تور ئادرېسى بەك ئۇزۇن", + "The given web address is not a valid URL" : "بېرىلگەن تور ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given legal notice address is too long" : "بېرىلگەن قانۇن ئۇقتۇرۇشى ئادرېسى بەك ئۇزۇن", + "The given legal notice address is not a valid URL" : "بېرىلگەن قانۇن ئۇقتۇرۇشى ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given privacy policy address is too long" : "بېرىلگەن مەخپىيەتلىك سىياسىتى ئادرېسى بەك ئۇزۇن", + "The given privacy policy address is not a valid URL" : "بېرىلگەن مەخپىيەتلىك سىياسىتى ئادرېسى ئىناۋەتلىك URL ئەمەس", + "The given slogan is too long" : "بېرىلگەن شۇئار بەك ئۇزۇن", + "The given color is invalid" : "بېرىلگەن رەڭ ئىناۋەتسىز", + "Disable-user-theming should be true or false" : "چەكلەش-ئىشلەتكۈچى باش تېمىسى راست ياكى يالغان بولۇشى كېرەك", + "Saved" : "ساقلاندى", + "Invalid app given" : "ئىناۋەتسىز ئەپ بېرىلگەن", + "Invalid type for setting \"defaultApp\" given" : "بېرىلگەن \"defaultApp\" نى تەڭشەشنىڭ ئىناۋەتسىز تىپى", + "Invalid setting key" : "تەڭشەش كۇنۇپكىسى ئىناۋەتسىز", + "The file was uploaded" : "ھۆججەت يۈكلەندى", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "يۈكلەنگەن ھۆججەت php.ini دىكى upload_max_filesize كۆرسەتمىسىدىن ئېشىپ كەتتى", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "يۈكلەنگەن ھۆججەت HTML شەكلىدە كۆرسىتىلگەن MAX_FILE_SIZE كۆرسەتمىسىدىن ئېشىپ كەتتى", + "The file was only partially uploaded" : "بۇ ھۆججەت پەقەت قىسمەن يوللانغان", + "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى", + "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.", + "Could not write file to disk" : "دىسكىغا ھۆججەت يازالمىدى", + "A PHP extension stopped the file upload" : "PHP كېڭەيتىلمىسى ھۆججەت يوللاشنى توختاتتى", + "No file uploaded" : "ھۆججەت يۈكلەنمىدى", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "سىز ئاللىبۇرۇن خاس ئۇسلۇبنى ئىشلىتىۋاتىسىز. تېما دېتالىنىڭ تەڭشىكى ئۇنىڭ تەرىپىدىن يېزىلغان بولۇشى مۇمكىن.", + "Theming" : "Theming", + "Appearance and accessibility" : "تاشقى كۆرۈنۈشى ۋە قولايلىقلىقى", + "PHP Imagick module" : "PHP تەسەۋۋۇر مودۇلى", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "باش تېما دېتالى بولسىمۇ PHP مودۇلى «imagick» قوزغىتىلمىدى. Favicon ئەۋلادلىرىنىڭ نورمال ئىشلىشى ئۈچۈن ، بۇ مودۇلنى ئورنىتىشىڭىز ۋە قوزغىتىشىڭىز كېرەك.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "بۇ خىلدىكى PHP مودۇلى «تەسەۋۋۇر» SVG نى قوللىمايدۇ. تېخىمۇ ياخشى ماسلىشىش ئۈچۈن ئۇنى ئورنىتىش تەۋسىيە قىلىنىدۇ.", + "Dark theme with high contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتىدىكى قاراڭغۇ تېما", + "Enable dark high contrast mode" : "قاراڭغۇ يۇقىرى سېلىشتۇرما ھالىتىنى قوزغىتىڭ", + "Similar to the high contrast mode, but with dark colours." : "يۇقىرى سېلىشتۇرما ھالىتىگە ئوخشاش ، ئەمما قېنىق رەڭلەر بىلەن.", + "Dark theme" : "قاراڭغۇ تېما", + "Enable dark theme" : "قاراڭغۇ باشتېمىنى قوزغىتىڭ", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "ئومۇمىي يورۇقلۇق ۋە يورۇقلۇقنى تۆۋەنلىتىش ئارقىلىق كۆزىڭىزنى ئاسانلاشتۇرىدىغان قاراڭغۇ تېما.", + "System default theme" : "سىستېما سۈكۈتتىكى باشتېما", + "Enable the system default" : "سىستېمىنىڭ سۈكۈتتىكى ھالىتىنى قوزغىتىڭ", + "Using the default system appearance." : "سۈكۈتتىكى سىستېما كۆرۈنۈشىنى ئىشلىتىش.", + "Dyslexia font" : "Dyslexia خەت نۇسخىسى", + "Enable dyslexia font" : "Dyslexia خەت نۇسخىسىنى قوزغىتىڭ", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic بىر خىل ھەقسىز خەت شەكلى / خەت نۇسخىسى بولۇپ ، ھەزىم قىلىش ئىقتىدارى تۆۋەنلەش سەۋەبىدىن كېلىپ چىققان بىر قىسىم كۆپ كۆرۈلىدىغان خاتالىقلارنى ئازايتىدۇ.", + "High contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتى", + "Enable high contrast mode" : "يۇقىرى سېلىشتۇرما ھالىتىنى قوزغىتىڭ", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "يول باشلىشىڭىزنى ئاسانلاشتۇرىدىغان يۇقىرى سېلىشتۇرما ھالەت. كۆرۈش سۈپىتى تۆۋەنلەيدۇ ، ئەمما ئېنىقلىق دەرىجىسى ئۆستۈرۈلىدۇ.", + "Light theme" : "يېنىك تېما", + "Enable the default light theme" : "سۈكۈتتىكى نۇر تېمىسىنى قوزغىتىڭ", + "The default light appearance." : "سۈكۈتتىكى نۇر كۆرۈنۈشى.", + "Legal notice" : "قانۇن ئۇقتۇرۇشى", + "Privacy policy" : "مەخپىيەتلىك تۈزۈمى", + "Adjust the Nextcloud theme" : "Nextcloud تېمىسىنى تەڭشەڭ", + "Name" : "ئاتى", + "Web link" : "تور ئۇلىنىشى", + "a safe home for all your data" : "بارلىق سانلىق مەلۇماتلىرىڭىز ئۈچۈن بىخەتەر ئۆي", + "Slogan" : "شۇئار", + "Primary color" : "دەسلەپكى رەڭ", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "دەسلەپكى رەڭ مۇھىم كۇنۇپكىلارغا ئوخشاش ئېلېمېنتلارنى گەۋدىلەندۈرۈشكە ئىشلىتىلىدۇ. ئۇ ھازىرقى رەڭ لايىھىسىگە ئاساسەن ئازراق تەڭشىلىشى مۇمكىن.", + "Legal notice link" : "قانۇن ئۇقتۇرۇشى", + "Privacy policy link" : "مەخپىيەتلىك سىياسىتى ئۇلىنىشى", + "Header logo" : "بەت بەلگىسى", + "Upload new header logo" : "يېڭى ماۋزۇ بەلگىسىنى يۈكلەڭ", + "Favicon" : "Favicon", + "Upload new favicon" : "يېڭى favicon نى يۈكلەڭ", + "User settings" : "ئىشلەتكۈچى تەڭشەكلىرى", + "Disable user theming" : "ئىشلەتكۈچى باشتېمىسىنى چەكلەڭ", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "سىز ئۈلگىڭىزنى تاللىسىڭىز ۋە خاسلاشتۇرسىڭىزمۇ ، ئابونتلار ئۇلارنىڭ ئارقا كۆرۈنۈشى ۋە رەڭگىنى ئۆزگەرتەلەيدۇ. خاسلاشتۇرۇشنى ئىجرا قىلماقچى بولسىڭىز ، ئۇنى ئاچسىڭىز بولىدۇ.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "تېمىڭىز سىزنىڭ قوللىشىڭىز ۋە قوللىغان خېرىدارلىرىڭىزنىڭ كۆرۈنۈشى ۋە ھېسسىياتىنى ئاسانلا خاسلاشتۇرالايدۇ. بۇ بارلىق ئىشلەتكۈچىلەر ئۈچۈن كۆرۈنىدۇ.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "تەگلىك رەسىمنىڭ ئورنىغا ئاددىي تەگلىك رەڭگىمۇ تەڭشىيەلەيسىز. تەگلىك سۈرىتىنى ئىشلەتسىڭىز بۇ رەڭنى ئۆزگەرتسىڭىز ئەپ تىزىملىكى سىنبەلگىسىنىڭ رەڭگىگە تەسىر كۆرسىتىدۇ.", + "Background color" : "تەگلىك رەڭگى", + "Upload new logo" : "يېڭى بەلگە يۈكلەڭ", + "Logo" : "Logo", + "Upload new background and login image" : "يېڭى تەگلىك ۋە كىرىش سۈرىتىنى يۈكلەڭ", + "Background and login image" : "تەگلىك ۋە كىرىش سۈرىتى", + "Advanced options" : "ئىلغار تاللاشلار", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "يۈكلەنگەن لوگو ۋە رەڭگە ئاساسەن SVG رەسىملىرىنى قوللاپ ImageMagick PHP كېڭەيتىلمىسىنى قاچىلاڭ.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "ئەگەر مەسىلىگە يولۇقسىڭىز ، ئىككىلەنمەستىن ئۇلارنى {issuetracker} بىزنىڭ مەسىلە ئىز قوغلاش {linkend} on غا دوكلات قىلىڭ. ئەگەر قاتناشماقچى بولسىڭىز ، {designteam} بىزنىڭ لايىھىلەش ئەترىتىمىز {linkend} join غا قوشۇلۇڭ.", + "Appearance and accessibility settings" : "كۆرۈنۈش ۋە زىيارەت قىلىش تەڭشەكلىرى", + "Misc accessibility options" : "قولايلىق تاللاش تاللانمىلىرى", + "Enable blur background filter (may increase GPU load)" : "تۇتۇق تەگلىك سۈزگۈچنى قوزغىتىڭ (GPU يۈكىنى ئاشۇرۇشى مۇمكىن)", + "Customization has been disabled by your administrator" : "باشقۇرغۇچىڭىز تەرىپىدىن خاسلاشتۇرۇش چەكلەنگەن", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "مۇھىم ئېلېمېنتلارنى گەۋدىلەندۈرۈش ئۈچۈن دەسلەپكى رەڭ بەلگىلەڭ. دەسلەپكى كۇنۇپكىلار قاتارلىق ئېلېمېنتلارغا ئىشلىتىلىدىغان رەڭ قولايلىق بولۇش تەلىپىنى قاندۇرۇش ئۈچۈن تەڭشەلگەندە ئازراق پەرقلىنىشى مۇمكىن.", + "Background and color" : "تەگلىك ۋە رەڭ", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "تەگلىك سۈكۈتتىكى سۈكۈتتىكى رەسىم ، ئىختىيارى يۈكلەنگەن رەسىم ياكى ئوچۇق رەڭگە تەڭشىلىدۇ.", + "Keyboard shortcuts" : "كۇنۇپكا تاختىسى تېزلەتمىسى", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "بەزى ئەھۋاللاردا كۇنۇپكا تاختىسىنىڭ تېزلەتمىلىرى قولايلىق قوراللارغا دەخلى قىلىدۇ. قورالىڭىزغا توغرا دىققەت قىلىش ئۈچۈن ، بۇ يەردىكى بارلىق كۇنۇپكا تاختىسىنى چەكلىيەلەيسىز. بۇ يەنە ئەپلەردىكى بارلىق تېزلەتمىلەرنى چەكلەيدۇ.", + "Disable all keyboard shortcuts" : "بارلىق كۇنۇپكا تاختىسىنى چەكلەڭ", + "Current selected app: {app}, position {position} of {total}" : "نۆۋەتتىكى تاللانغان ئەپ: {app} ، ئورنى {position} {total}", + "Move up" : "يۆتكەڭ", + "Move down" : "تۆۋەنگە يۆتكەڭ", + "Select a background from your files" : "ھۆججەتلىرىڭىزدىن تەگلىك تاللاڭ", + "Select background" : "تەگلىكنى تاللاڭ", + "No background has been selected" : "تەگلىك تاللانمىدى", + "Custom background" : "ئىختىيارى تەگلىك", + "Plain background" : "تۈزلەڭلىك تەگلىكى", + "Default background" : "سۈكۈتتىكى تەگلىك", + "Theme selection is enforced" : "باشتېما تاللاش ئىجرا قىلىنىدۇ", + "Could not set the app order" : "ئەپ تەرتىپىنى تەڭشىيەلمىدى", + "Could not reset the app order" : "ئەپ تەرتىپىنى ئەسلىگە كەلتۈرەلمىدى", + "Navigation bar settings" : "يولباشچى تاياقچە تەڭشىكى", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "يولباشچى ستونىغا ئىشلىتىلىدىغان ئەپ تەرتىپىنى تەڭشىيەلەيسىز. بىرىنچى تۈر سۈكۈتتىكى ئەپ بولۇپ ، كىرگەندىن كېيىن ياكى بەلگىنى چەككەندە ئېچىلىدۇ.", + "The default app can not be changed because it was configured by the administrator." : "سۈكۈتتىكى ئەپنى باشقۇرغۇچى تەڭشىگەنلىكى ئۈچۈن ئۆزگەرتكىلى بولمايدۇ.", + "The app order was changed, to see it in action you have to reload the page." : "ئەپ تەرتىپى ئۆزگەرتىلدى ، ئۇنى ھەرىكەتتە كۆرۈش ئۈچۈن بەتنى قايتا يۈكلىشىڭىز كېرەك.", + "Reset default app order" : "كۆڭۈلدىكى ئەپ تەرتىپىنى ئەسلىگە كەلتۈرۈڭ", + "Could not set primary color" : "دەسلەپكى رەڭنى تەڭشىگىلى بولمىدى", + "Reset primary color" : "دەسلەپكى رەڭنى ئەسلىگە كەلتۈرۈڭ", + "Could not set global default apps" : "يەرشارى سۈكۈتتىكى ئەپلەرنى تەڭشىيەلمىدى", + "Default app" : "كۆڭۈلدىكى ئەپ", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "سۈكۈتتىكى ئەپ بولسا ئەپ. كىرگەندىن كېيىن ياكى تىزىملىكتىكى بەلگە چەككەندە ئېچىلدى.", + "Use custom default app" : "ئىختىيارى كۆڭۈلدىكى ئەپنى ئىشلىتىڭ", + "Global default app" : "يەرشارى سۈكۈتتىكى ئەپ", + "Global default apps" : "يەرشارىدىكى سۈكۈتتىكى ئەپلەر", + "Default app priority" : "كۆڭۈلدىكى ئەپ ئەۋزەللىكى", + "If an app is not enabled for a user, the next app with lower priority is used." : "ئەگەر بىر ئىشلەتكۈچى ئۈچۈن بىر ئەپ قوزغىتىلمىغان بولسا ، تۆۋەن ئورۇنغا قويۇلغان كېيىنكى ئەپ ئىشلىتىلىدۇ.", + "Select a custom color" : "ئىختىيارى رەڭنى تاللاڭ", + "Reset to default" : "سۈكۈتتىكى ھالىتىگە قايتىڭ", + "Upload" : "يۈكلە", + "Remove background image" : "تەگلىك سۈرىتىنى ئۆچۈرۈڭ", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "ھەممىباب زىيارەت قىلىش بىز ئۈچۈن ئىنتايىن مۇھىم. بىز تور ئۆلچىمىگە ئەمەل قىلىپ ، مائۇسسىز ۋە ئېكران ئوقۇغۇچ قاتارلىق ياردەمچى يۇمشاق دېتاللارنىڭ ھەممىسىنى ئىشلىتىشكە بولىدىغانلىقىنى تەكشۈرۈپ تۇرىمىز. بىز AA سەۋىيىسىدىكى {guidelines} تور مەزمۇنىنىڭ زىيارەت قىلىش قوللانمىسى {linkend} 2.1 گە ماسلىشىشنى مەقسەت قىلىمىز ، يۇقىرى سېلىشتۇرما تېمىسى ھەتتا AAA سەۋىيىسىدە." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/uk.js b/apps/theming/l10n/uk.js new file mode 100644 index 00000000000..f24ffde5f72 --- /dev/null +++ b/apps/theming/l10n/uk.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Ім'я задовге", + "The given web address is too long" : "Вебадреса занадто довга", + "The given web address is not a valid URL" : "Зазначена вебадреса не є правильним посиланням", + "The given legal notice address is too long" : "Зазначена адреса з правовою інформацією задовга", + "The given legal notice address is not a valid URL" : "Зазначена адреса з правовою інформацією не є правильним посиланням", + "The given privacy policy address is too long" : "Зазначена адреса з інформацією про конфіденційність задовга", + "The given privacy policy address is not a valid URL" : "Зазначена адреса з інформацією про конфіденційність не є правильним посиланням", + "The given slogan is too long" : "Зазначене гасло є задовгим", + "The given color is invalid" : "Зазначений колір є неправильним", + "Disable-user-theming should be true or false" : "Вимкнення можливості користувачів змінювати оформлення має мати значення так або ні", + "Saved" : "Збережено", + "Invalid app given" : "Зазначено неправильний застосунок", + "Invalid type for setting \"defaultApp\" given" : "Зазначено неправильний тип у налаштуваннях \"defaultApp\"", + "Invalid setting key" : "Неправильний ключ налаштувань", + "The file was uploaded" : "Файл завантажено", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Файл для завантаження перевищує параметр upload_max_filesize у php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Розмір завантаженого файлу перевищує директиву MAX_FILE_SIZE, зазначену у HTML-формі", + "The file was only partially uploaded" : "Файл завантажено лише частково", + "No file was uploaded" : "Жодного файлу не було завантажено", + "Missing a temporary folder" : "Відсутній тимчасовий каталог", + "Could not write file to disk" : "Неможливо записати файл на диск", + "A PHP extension stopped the file upload" : "Розширення PHP призупинило завантаження файлу", + "No file uploaded" : "Файл не завантажено", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ви уже використовуєте власну тему. Таким чином налаштування застосунку Оформлення може бути перезаписано.", + "Theming" : "Оформлення", + "Appearance and accessibility" : "Тема та вигляд", + "PHP Imagick module" : "Модуль PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-модуль \"imagick\" не активовано, в той же час застосунок оформлення увімкнено. Щоби значки сайтів створювалися коректно, вам необхідно встановити та увімкнути цей модуль PHP.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Модуль PHP \"imagick\" у цьому примірнику хмари не підтримує SVG. Для кращої сумісности рекомендується встановити цей модуль.", + "Dark theme with high contrast mode" : "Темна тема з режимом високої контрастності", + "Enable dark high contrast mode" : "Увімкнути темний режим високої контрастності", + "Similar to the high contrast mode, but with dark colours." : "Подібно до режиму високої контрастності, але з темними кольорами.", + "Dark theme" : "Темна тема", + "Enable dark theme" : "Увімкнути темну тему", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темна тема, щоб полегшити ваші очі, зменшивши загальну яскравість і яскравість.", + "System default theme" : "Типова тема системи", + "Enable the system default" : "Згідно із системними налаштуваннями", + "Using the default system appearance." : "Використання зовнішнього вигляду системи за замовчуванням.", + "Dyslexia font" : "Шрифт для людей, які страждають від дислексії", + "Enable dyslexia font" : "Увімкнути шрифт для людей, які страждають на дислексію", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "\"OpenDyslexic\" - це безплатний шрифт, розроблений для зменшення поширених помилок при читанні, які виникають у людей з дислексією.", + "High contrast mode" : "Висококонтрастний режим", + "Enable high contrast mode" : "Увімкнути висококонтрастний режим", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Висококонтрастний режим спрощує Вашу навігацію. Візуальна якість буде знижена, але чіткість підвищиться..", + "Light theme" : "Світла тема", + "Enable the default light theme" : "Увімкнути типову світлу тему", + "The default light appearance." : "Типово світла тема.", + "Legal notice" : "Правові застереження", + "Privacy policy" : "Політика конфіденційності", + "Adjust the Nextcloud theme" : "Налаштуйте тему Nextcloud", + "Name" : "Ім’я", + "Web link" : "Посилання", + "a safe home for all your data" : "безпечна домівка для ваших даних", + "Slogan" : "Гасло", + "Primary color" : "Основний колір", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Основний колір використовується для підсвічування елементів, напр., важливих кнопок. Цей колір підлаштовується під вибрану схему кольорів.", + "Legal notice link" : "Посилання на правову інформацію", + "Privacy policy link" : "Посилання на політику конфіденційності", + "Header logo" : "Логотип заголовка", + "Upload new header logo" : "Завантажити новий логотип заголовка", + "Favicon" : "Значок сайту", + "Upload new favicon" : "Завантажити новий значок", + "User settings" : "Налаштування користувача", + "Disable user theming" : "Вимкнути можливість користувачів змінювати оформлення", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "На додаток до встановлення оформлення вашої хмари користувачі також можуть змінювати тло та кольорову гаму. Тут ви можете встановити оформлення однаковим для всіх користувачів.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Оформлення дозволяє легко налаштувати зовнішній вигляд вашого сервера та підтримуваних клієнтів. Це будуть бачити всі користувачі.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Замість зображень тла ви можете вибрати просту заливку кольором. Якщо ви використовуватимете зображення, то зміна кольору автоматично вплине на колір значків застосунків у меню.", + "Background color" : "Колір тла", + "Upload new logo" : "Завантажити новий логотип", + "Logo" : "Логотип", + "Upload new background and login image" : "Завантажити нове зображення тла та логотип сторінки авторизації", + "Background and login image" : "Зображення тла та логотипу організації на сторінці авторизації", + "Advanced options" : "Розширені налаштування", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Встановіть розширення ImageMagick PHP з підтримкою SVG-зображень, щоб автоматично генерувати іконки на основі завантаженого логотипа і кольору.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось сучасних стандартів розробки у вебі, намагаємося забезпечити зручність користування без комп'ютерної миші, а також за допомогою допоміжного програмного забезпечення, наприклад, застосунки зчитування з екрана. Ми прагнемо відповідати {linkstart}Правилам доступу до вмісту у мережі {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви виявите будь-які проблеми, не соромтеся повідомити про них на {issuetracker}нашій системі відстеження проблем{linkend}. І якщо ви хочете взяти участь, приєднуйтесь до {designteam}нашої команди дизайнерів{linkend}!", + "Unable to apply the setting." : "Не вдалося застосувати налаштування.", + "Appearance and accessibility settings" : "Налаштування оформлення та доступности", + "Misc accessibility options" : "Різні налаштування доступності", + "Enable blur background filter (may increase GPU load)" : "Увімкнути фільтр розмиття тла (матиме додаткове навантаження на GPU)", + "Customization has been disabled by your administrator" : "Налаштування персоналізації вимкнено адміністатором.", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Встановіть основний колір для підсвічування важливих елементів. Колір, який використовується для таких елементів, як основні кнопки, може частково відрізнятися, залежно від вимог доступності.", + "Background and color" : "Тло та колір", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Зображення тла можна вибрати з попередньо встановлених зображень, завантажити власне або використати просту заливку кольором.", + "Keyboard shortcuts" : "Скорочення", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У деяких випадках комбінації клавіш можуть заважати роботі з інструментами доступності. Щоб правильно зосередитися на інструменті, ви можете вимкнути всі комбінації клавіш тут. Це також вимкне всі доступні комбінації клавіш у застосунках.", + "Disable all keyboard shortcuts" : "Вимкнути всі комбінації клавіш", + "Current selected app: {app}, position {position} of {total}" : "Вибрано застосунок: {app}, позиція {position} із {total}.", + "Move up" : "Пересунуту догори", + "Move down" : "Пересунути вниз", + "Select a background from your files" : "Виберіть зображення тла з ваших файлів", + "Select background" : "Виберіть тло", + "No background has been selected" : "Не вибрано тло", + "Custom background" : "Користувацьке тло", + "Plain background" : "Однокольорове тло", + "Default background" : "Типове тло", + "Theme selection is enforced" : "Вибір теми виконується примусово", + "Could not set the app order" : "Не вдалося встановити порядок розташування застосунків", + "Could not reset the app order" : "Не вдалося скинути порядок розташування застосунків", + "Navigation bar settings" : "Налаштування панелі навігації", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Ви можете налаштувати порядок розташування застосунків у панелі навігації. Першим записом має йти типовий застосунок, який відкривається одразу після авторизації користувача або коли користувач клацає по логотипу сайту.", + "The default app can not be changed because it was configured by the administrator." : "Неможливо змінити типовий застосунок, оскільки його було налаштовано адміністратором.", + "The app order was changed, to see it in action you have to reload the page." : "Порядок розташування застосунків змінено. Будь ласка, оновіть сторінку, щоби побачити оновлене розташування елементів.", + "Reset default app order" : "Скинути до попередньо визначеного порядку розташування застосунків", + "Could not set primary color" : "Не вдалося встановити основний колір", + "Reset primary color" : "Скинути налаштування основного кольору", + "Could not set global default apps" : "Не вдалося встановити системний типовий застосунок", + "Default app" : "Типовий застосунок", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Типовий застосунок - це застосунок, який відкривається одразу після авторизації користувача або коли користувач клацає по логотипу сайту.", + "Use custom default app" : "Використосувати власний типовий застосунок", + "Global default app" : "Системний типовий застосунок", + "Global default apps" : "Системні типові застосунки", + "Default app priority" : "Типовий пріоритет застосунків", + "If an app is not enabled for a user, the next app with lower priority is used." : "Якщо застосунок не увімкнено для певного користувача, то наступний застосунок з нижчим пріоритетом буде використано.", + "Select a custom color" : "Виберіть власний колір", + "Reset to default" : "Скинути до типового", + "Upload" : "Завантажити", + "Remove background image" : "Вилучити зображення тла", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось сучасних стандартів розробки у вебі, намагаємося забезпечити зручність користування без комп'ютерної миші, а також за допомогою допоміжного програмного забезпечення, наприклад, застосунки зчитування з екрана. Ми прагнемо відповідати {guidelines} Правилам доступу до вмісту у мережі {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.", + ". Unable to apply the setting." : ". Не вдалося застосувати налаштування." +}, +"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/theming/l10n/uk.json b/apps/theming/l10n/uk.json new file mode 100644 index 00000000000..aa6a292e7a3 --- /dev/null +++ b/apps/theming/l10n/uk.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "Ім'я задовге", + "The given web address is too long" : "Вебадреса занадто довга", + "The given web address is not a valid URL" : "Зазначена вебадреса не є правильним посиланням", + "The given legal notice address is too long" : "Зазначена адреса з правовою інформацією задовга", + "The given legal notice address is not a valid URL" : "Зазначена адреса з правовою інформацією не є правильним посиланням", + "The given privacy policy address is too long" : "Зазначена адреса з інформацією про конфіденційність задовга", + "The given privacy policy address is not a valid URL" : "Зазначена адреса з інформацією про конфіденційність не є правильним посиланням", + "The given slogan is too long" : "Зазначене гасло є задовгим", + "The given color is invalid" : "Зазначений колір є неправильним", + "Disable-user-theming should be true or false" : "Вимкнення можливості користувачів змінювати оформлення має мати значення так або ні", + "Saved" : "Збережено", + "Invalid app given" : "Зазначено неправильний застосунок", + "Invalid type for setting \"defaultApp\" given" : "Зазначено неправильний тип у налаштуваннях \"defaultApp\"", + "Invalid setting key" : "Неправильний ключ налаштувань", + "The file was uploaded" : "Файл завантажено", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Файл для завантаження перевищує параметр upload_max_filesize у php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Розмір завантаженого файлу перевищує директиву MAX_FILE_SIZE, зазначену у HTML-формі", + "The file was only partially uploaded" : "Файл завантажено лише частково", + "No file was uploaded" : "Жодного файлу не було завантажено", + "Missing a temporary folder" : "Відсутній тимчасовий каталог", + "Could not write file to disk" : "Неможливо записати файл на диск", + "A PHP extension stopped the file upload" : "Розширення PHP призупинило завантаження файлу", + "No file uploaded" : "Файл не завантажено", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Ви уже використовуєте власну тему. Таким чином налаштування застосунку Оформлення може бути перезаписано.", + "Theming" : "Оформлення", + "Appearance and accessibility" : "Тема та вигляд", + "PHP Imagick module" : "Модуль PHP Imagick", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP-модуль \"imagick\" не активовано, в той же час застосунок оформлення увімкнено. Щоби значки сайтів створювалися коректно, вам необхідно встановити та увімкнути цей модуль PHP.", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "Модуль PHP \"imagick\" у цьому примірнику хмари не підтримує SVG. Для кращої сумісности рекомендується встановити цей модуль.", + "Dark theme with high contrast mode" : "Темна тема з режимом високої контрастності", + "Enable dark high contrast mode" : "Увімкнути темний режим високої контрастності", + "Similar to the high contrast mode, but with dark colours." : "Подібно до режиму високої контрастності, але з темними кольорами.", + "Dark theme" : "Темна тема", + "Enable dark theme" : "Увімкнути темну тему", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Темна тема, щоб полегшити ваші очі, зменшивши загальну яскравість і яскравість.", + "System default theme" : "Типова тема системи", + "Enable the system default" : "Згідно із системними налаштуваннями", + "Using the default system appearance." : "Використання зовнішнього вигляду системи за замовчуванням.", + "Dyslexia font" : "Шрифт для людей, які страждають від дислексії", + "Enable dyslexia font" : "Увімкнути шрифт для людей, які страждають на дислексію", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "\"OpenDyslexic\" - це безплатний шрифт, розроблений для зменшення поширених помилок при читанні, які виникають у людей з дислексією.", + "High contrast mode" : "Висококонтрастний режим", + "Enable high contrast mode" : "Увімкнути висококонтрастний режим", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Висококонтрастний режим спрощує Вашу навігацію. Візуальна якість буде знижена, але чіткість підвищиться..", + "Light theme" : "Світла тема", + "Enable the default light theme" : "Увімкнути типову світлу тему", + "The default light appearance." : "Типово світла тема.", + "Legal notice" : "Правові застереження", + "Privacy policy" : "Політика конфіденційності", + "Adjust the Nextcloud theme" : "Налаштуйте тему Nextcloud", + "Name" : "Ім’я", + "Web link" : "Посилання", + "a safe home for all your data" : "безпечна домівка для ваших даних", + "Slogan" : "Гасло", + "Primary color" : "Основний колір", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "Основний колір використовується для підсвічування елементів, напр., важливих кнопок. Цей колір підлаштовується під вибрану схему кольорів.", + "Legal notice link" : "Посилання на правову інформацію", + "Privacy policy link" : "Посилання на політику конфіденційності", + "Header logo" : "Логотип заголовка", + "Upload new header logo" : "Завантажити новий логотип заголовка", + "Favicon" : "Значок сайту", + "Upload new favicon" : "Завантажити новий значок", + "User settings" : "Налаштування користувача", + "Disable user theming" : "Вимкнути можливість користувачів змінювати оформлення", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "На додаток до встановлення оформлення вашої хмари користувачі також можуть змінювати тло та кольорову гаму. Тут ви можете встановити оформлення однаковим для всіх користувачів.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Оформлення дозволяє легко налаштувати зовнішній вигляд вашого сервера та підтримуваних клієнтів. Це будуть бачити всі користувачі.", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "Замість зображень тла ви можете вибрати просту заливку кольором. Якщо ви використовуватимете зображення, то зміна кольору автоматично вплине на колір значків застосунків у меню.", + "Background color" : "Колір тла", + "Upload new logo" : "Завантажити новий логотип", + "Logo" : "Логотип", + "Upload new background and login image" : "Завантажити нове зображення тла та логотип сторінки авторизації", + "Background and login image" : "Зображення тла та логотипу організації на сторінці авторизації", + "Advanced options" : "Розширені налаштування", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Встановіть розширення ImageMagick PHP з підтримкою SVG-зображень, щоб автоматично генерувати іконки на основі завантаженого логотипа і кольору.", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось сучасних стандартів розробки у вебі, намагаємося забезпечити зручність користування без комп'ютерної миші, а також за допомогою допоміжного програмного забезпечення, наприклад, застосунки зчитування з екрана. Ми прагнемо відповідати {linkstart}Правилам доступу до вмісту у мережі {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви виявите будь-які проблеми, не соромтеся повідомити про них на {issuetracker}нашій системі відстеження проблем{linkend}. І якщо ви хочете взяти участь, приєднуйтесь до {designteam}нашої команди дизайнерів{linkend}!", + "Unable to apply the setting." : "Не вдалося застосувати налаштування.", + "Appearance and accessibility settings" : "Налаштування оформлення та доступности", + "Misc accessibility options" : "Різні налаштування доступності", + "Enable blur background filter (may increase GPU load)" : "Увімкнути фільтр розмиття тла (матиме додаткове навантаження на GPU)", + "Customization has been disabled by your administrator" : "Налаштування персоналізації вимкнено адміністатором.", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "Встановіть основний колір для підсвічування важливих елементів. Колір, який використовується для таких елементів, як основні кнопки, може частково відрізнятися, залежно від вимог доступності.", + "Background and color" : "Тло та колір", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "Зображення тла можна вибрати з попередньо встановлених зображень, завантажити власне або використати просту заливку кольором.", + "Keyboard shortcuts" : "Скорочення", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У деяких випадках комбінації клавіш можуть заважати роботі з інструментами доступності. Щоб правильно зосередитися на інструменті, ви можете вимкнути всі комбінації клавіш тут. Це також вимкне всі доступні комбінації клавіш у застосунках.", + "Disable all keyboard shortcuts" : "Вимкнути всі комбінації клавіш", + "Current selected app: {app}, position {position} of {total}" : "Вибрано застосунок: {app}, позиція {position} із {total}.", + "Move up" : "Пересунуту догори", + "Move down" : "Пересунути вниз", + "Select a background from your files" : "Виберіть зображення тла з ваших файлів", + "Select background" : "Виберіть тло", + "No background has been selected" : "Не вибрано тло", + "Custom background" : "Користувацьке тло", + "Plain background" : "Однокольорове тло", + "Default background" : "Типове тло", + "Theme selection is enforced" : "Вибір теми виконується примусово", + "Could not set the app order" : "Не вдалося встановити порядок розташування застосунків", + "Could not reset the app order" : "Не вдалося скинути порядок розташування застосунків", + "Navigation bar settings" : "Налаштування панелі навігації", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Ви можете налаштувати порядок розташування застосунків у панелі навігації. Першим записом має йти типовий застосунок, який відкривається одразу після авторизації користувача або коли користувач клацає по логотипу сайту.", + "The default app can not be changed because it was configured by the administrator." : "Неможливо змінити типовий застосунок, оскільки його було налаштовано адміністратором.", + "The app order was changed, to see it in action you have to reload the page." : "Порядок розташування застосунків змінено. Будь ласка, оновіть сторінку, щоби побачити оновлене розташування елементів.", + "Reset default app order" : "Скинути до попередньо визначеного порядку розташування застосунків", + "Could not set primary color" : "Не вдалося встановити основний колір", + "Reset primary color" : "Скинути налаштування основного кольору", + "Could not set global default apps" : "Не вдалося встановити системний типовий застосунок", + "Default app" : "Типовий застосунок", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Типовий застосунок - це застосунок, який відкривається одразу після авторизації користувача або коли користувач клацає по логотипу сайту.", + "Use custom default app" : "Використосувати власний типовий застосунок", + "Global default app" : "Системний типовий застосунок", + "Global default apps" : "Системні типові застосунки", + "Default app priority" : "Типовий пріоритет застосунків", + "If an app is not enabled for a user, the next app with lower priority is used." : "Якщо застосунок не увімкнено для певного користувача, то наступний застосунок з нижчим пріоритетом буде використано.", + "Select a custom color" : "Виберіть власний колір", + "Reset to default" : "Скинути до типового", + "Upload" : "Завантажити", + "Remove background image" : "Вилучити зображення тла", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось сучасних стандартів розробки у вебі, намагаємося забезпечити зручність користування без комп'ютерної миші, а також за допомогою допоміжного програмного забезпечення, наприклад, застосунки зчитування з екрана. Ми прагнемо відповідати {guidelines} Правилам доступу до вмісту у мережі {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.", + ". Unable to apply the setting." : ". Не вдалося застосувати налаштування." +},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/vi.js b/apps/theming/l10n/vi.js new file mode 100644 index 00000000000..f8d3a6d370c --- /dev/null +++ b/apps/theming/l10n/vi.js @@ -0,0 +1,107 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "Tên quá dài", + "The given web address is too long" : "Địa chỉ web quá dài", + "The given web address is not a valid URL" : "Địa chỉ web được cấp không phải là một đường dân URL khả dụng", + "The given legal notice address is too long" : "Địa chỉ thông cáo pháp lý được cấp quá dài", + "The given legal notice address is not a valid URL" : "Địa chỉ thông cáo pháp lý được cấp không phải là một đường dẫn URL khả dụng", + "The given privacy policy address is too long" : "Địa chỉ chính sách riêng tư quá dài", + "The given privacy policy address is not a valid URL" : "Địa chỉ chính sách riêng tư được cấp không phải là một đường dẫn URL khả dụng", + "The given slogan is too long" : "Khẩu hiệu quá dài", + "The given color is invalid" : "Màu không hợp lệ", + "Disable-user-theming should be true or false" : "Vô hiệu hóa chủ đề người dùng phải đúng hoặc sai", + "Saved" : "Đã lưu", + "Invalid app given" : "Đã cung cấp ứng dụng không hợp lệ", + "Invalid type for setting \"defaultApp\" given" : "Loại cài đặt 'defaultApp' đã cho không hợp lệ", + "Invalid setting key" : "Phím cài đặt không hợp lệ", + "The file was uploaded" : "Tập tin đã được tải lên", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Tập tin tải lên đã vượt quá upload_max_filesize giới hạn trong hệ thống", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Tập được tải lên vượt quá MAX_FILE_SIZE đã được giới hạn trong biểu mẫu HTML", + "The file was only partially uploaded" : "Tệp chỉ được tải lên một phần", + "No file was uploaded" : "Chưa có tệp nào dược tải lên", + "Missing a temporary folder" : "Thiếu một thư mục tạm thời", + "Could not write file to disk" : "Không thể ghi tệp lên ổ đĩa", + "A PHP extension stopped the file upload" : "Một phần mở rộng của PHP đã dừng tải tệp lên", + "No file uploaded" : "Không có tệp nào được tải lên", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Bạn đang sử dụng 1 chủ đề riêng. Các thiết lập của ứng dụng Chủ đề có thể bị ghi đè bởi nó.", + "Theming" : "Điều chỉnh giao diện", + "Appearance and accessibility" : "Chủ đề", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Mô-đun PHP \"imagick\" không được bật mặc dù ứng dụng chủ đề là. Để tạo favicon hoạt động chính xác, bạn cần cài đặt và bật mô-đun này.", + "Dark theme with high contrast mode" : "Chủ đề tối với chế độ tương phản cao", + "Enable dark high contrast mode" : "Bật chế độ tương phản cao tối", + "Similar to the high contrast mode, but with dark colours." : "Tương tự như chế độ tương phản cao nhưng có màu tối.", + "Dark theme" : "Chế độ ban đêm", + "Enable dark theme" : "Bật chế độ ban đêm", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Một chủ đề tối để làm dịu mắt bạn bằng cách giảm độ sáng và độ sáng tổng thể.", + "System default theme" : "Chủ đề mặc định của hệ thống", + "Enable the system default" : "Kích hoạt mặc định hệ thống", + "Using the default system appearance." : "Sử dụng giao diện hệ thống mặc định.", + "Dyslexia font" : "Chứng khó đọc", + "Enable dyslexia font" : "Bật chế độ dành cho người gặp chứng khó đọc", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic là một kiểu chữ / phông chữ miễn phí được thiết kế để giảm thiểu một số lỗi đọc phổ biến do chứng khó đọc gây ra.", + "High contrast mode" : "Chế độ tương phản cao", + "Enable high contrast mode" : "Bật chế độ tương phản cao", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Chế độ tương phản cao giúp bạn dễ dàng điều hướng và phân biệt vị trí các mục chính xác hơn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.", + "Light theme" : "Chủ đề nhẹ nhàng", + "Enable the default light theme" : "Bật chủ đề ánh sáng mặc định", + "The default light appearance." : "Sự xuất hiện ánh sáng mặc định.", + "Legal notice" : "Thông cáo pháp lý", + "Privacy policy" : "Chính sách riêng tư", + "Adjust the Nextcloud theme" : "Tinh chỉnh chủ đề Nextcloud", + "Name" : "Tên", + "Web link" : "Liên kết web", + "a safe home for all your data" : "một ngôi nhà an toàn cho tất cả dữ liệu của bạn", + "Slogan" : "Khẩu hiệu", + "Legal notice link" : "Liên kết Thông cáo pháp lý", + "Privacy policy link" : "Liên kết Chính sách riêng tư", + "Header logo" : "Logo đầu trang", + "Upload new header logo" : "Tải lên logo đầu trang mới", + "Favicon" : "Favicon", + "Upload new favicon" : "Tải lên bộ Favicon mới", + "User settings" : "Thiết lập người dùng", + "Disable user theming" : "Tắt chủ đề người dùng", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Mặc dù bạn có thể chọn và tùy chỉnh phiên bản của mình nhưng người dùng có thể thay đổi nền và màu sắc của họ. Nếu bạn muốn thực thi tùy chỉnh của mình, bạn có thể bật tính năng này.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Điều chỉnh giao diện cho phép bạn có thể dễ dàng tùy biến bố cục trình bày của hệ thống. Khi thực hiện nó sẽ hiện hữu đối với tất cả người dùng", + "Upload new logo" : "Tải lên logo mới", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Hình nền và hình ảnh đăng nhập", + "Advanced options" : "Tùy chọn nâng cao", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Cài đặt tiện ích mở rộng ImageMagick PHP có hỗ trợ hình ảnh SVG để tự động tạo favicon dựa trên logo và màu sắc đã tải lên.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Nếu bạn phát hiện bất kỳ vấn đề nào, đừng ngần ngại báo cáo chúng trên {issuetracker}trình theo dõi vấn đề của chúng tôi{linkend}. Và nếu bạn muốn tham gia, hãy tham gia {designteam}nhóm thiết kế của chúng tôi{linkend}!", + "Customization has been disabled by your administrator" : "Tùy chỉnh đã bị quản trị viên của bạn vô hiệu hóa", + "Keyboard shortcuts" : "Phím tắt", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Trong một số trường hợp, phím tắt có thể ảnh hưởng đến các công cụ trợ năng. Để cho phép tập trung vào công cụ của bạn một cách chính xác, bạn có thể tắt tất cả các phím tắt tại đây. Điều này cũng sẽ vô hiệu hóa tất cả các phím tắt có sẵn trong ứng dụng.", + "Disable all keyboard shortcuts" : "Vô hiệu hóa tất cả các phím tắt", + "Move up" : "Di chuyển lên", + "Move down" : "Di chuyển xuống", + "Select a background from your files" : "Chọn nền từ tập tin của bạn", + "Select background" : "Chọn phông nền", + "No background has been selected" : "Không có nền nào được chọn", + "Custom background" : "Tùy chỉnh nền", + "Plain background" : "Nền đơn giản", + "Default background" : "Nền mặc định", + "Theme selection is enforced" : "Lựa chọn chủ đề được thực thi", + "Could not set the app order" : "Không thể đặt thứ tự ứng dụng", + "Could not reset the app order" : "Không thể đặt lại thứ tự ứng dụng", + "Navigation bar settings" : "Cài đặt thanh điều hướng", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Bạn có thể định cấu hình thứ tự ứng dụng được sử dụng cho thanh điều hướng. Mục nhập đầu tiên sẽ là ứng dụng mặc định, được mở sau khi đăng nhập hoặc khi nhấp vào logo.", + "The default app can not be changed because it was configured by the administrator." : "Không thể thay đổi ứng dụng mặc định vì nó đã được quản trị viên định cấu hình.", + "The app order was changed, to see it in action you have to reload the page." : "Thứ tự ứng dụng đã được thay đổi, để xem nó hoạt động bạn phải tải lại trang.", + "Reset default app order" : "Đặt lại thứ tự ứng dụng mặc định", + "Could not set global default apps" : "Không thể đặt ứng dụng mặc định chung", + "Default app" : "Ứng dụng mặc định", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Ứng dụng mặc định là ứng dụng ví dụ: được mở sau khi đăng nhập hoặc khi nhấp vào biểu tượng trong menu.", + "Use custom default app" : "Sử dụng ứng dụng mặc định tùy chỉnh", + "Global default app" : "Ứng dụng mặc định toàn cầu", + "Global default apps" : "Ứng dụng mặc định toàn cầu", + "Default app priority" : "Ưu tiên ứng dụng mặc định", + "If an app is not enabled for a user, the next app with lower priority is used." : "Nếu một ứng dụng không được bật cho người dùng thì ứng dụng tiếp theo có mức độ ưu tiên thấp hơn sẽ được sử dụng.", + "Select a custom color" : "Chọn màu tùy chỉnh", + "Reset to default" : "Đặt lại về mặc định", + "Upload" : "Tải lên", + "Remove background image" : "Xóa bỏ ảnh nền", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sự truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và hỗ trợ những phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines}Nguyên Tắc Truy Cập Cho Nội Dung Mạng{linkend} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/vi.json b/apps/theming/l10n/vi.json new file mode 100644 index 00000000000..e3dd1bf1050 --- /dev/null +++ b/apps/theming/l10n/vi.json @@ -0,0 +1,105 @@ +{ "translations": { + "The given name is too long" : "Tên quá dài", + "The given web address is too long" : "Địa chỉ web quá dài", + "The given web address is not a valid URL" : "Địa chỉ web được cấp không phải là một đường dân URL khả dụng", + "The given legal notice address is too long" : "Địa chỉ thông cáo pháp lý được cấp quá dài", + "The given legal notice address is not a valid URL" : "Địa chỉ thông cáo pháp lý được cấp không phải là một đường dẫn URL khả dụng", + "The given privacy policy address is too long" : "Địa chỉ chính sách riêng tư quá dài", + "The given privacy policy address is not a valid URL" : "Địa chỉ chính sách riêng tư được cấp không phải là một đường dẫn URL khả dụng", + "The given slogan is too long" : "Khẩu hiệu quá dài", + "The given color is invalid" : "Màu không hợp lệ", + "Disable-user-theming should be true or false" : "Vô hiệu hóa chủ đề người dùng phải đúng hoặc sai", + "Saved" : "Đã lưu", + "Invalid app given" : "Đã cung cấp ứng dụng không hợp lệ", + "Invalid type for setting \"defaultApp\" given" : "Loại cài đặt 'defaultApp' đã cho không hợp lệ", + "Invalid setting key" : "Phím cài đặt không hợp lệ", + "The file was uploaded" : "Tập tin đã được tải lên", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Tập tin tải lên đã vượt quá upload_max_filesize giới hạn trong hệ thống", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Tập được tải lên vượt quá MAX_FILE_SIZE đã được giới hạn trong biểu mẫu HTML", + "The file was only partially uploaded" : "Tệp chỉ được tải lên một phần", + "No file was uploaded" : "Chưa có tệp nào dược tải lên", + "Missing a temporary folder" : "Thiếu một thư mục tạm thời", + "Could not write file to disk" : "Không thể ghi tệp lên ổ đĩa", + "A PHP extension stopped the file upload" : "Một phần mở rộng của PHP đã dừng tải tệp lên", + "No file uploaded" : "Không có tệp nào được tải lên", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "Bạn đang sử dụng 1 chủ đề riêng. Các thiết lập của ứng dụng Chủ đề có thể bị ghi đè bởi nó.", + "Theming" : "Điều chỉnh giao diện", + "Appearance and accessibility" : "Chủ đề", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Mô-đun PHP \"imagick\" không được bật mặc dù ứng dụng chủ đề là. Để tạo favicon hoạt động chính xác, bạn cần cài đặt và bật mô-đun này.", + "Dark theme with high contrast mode" : "Chủ đề tối với chế độ tương phản cao", + "Enable dark high contrast mode" : "Bật chế độ tương phản cao tối", + "Similar to the high contrast mode, but with dark colours." : "Tương tự như chế độ tương phản cao nhưng có màu tối.", + "Dark theme" : "Chế độ ban đêm", + "Enable dark theme" : "Bật chế độ ban đêm", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Một chủ đề tối để làm dịu mắt bạn bằng cách giảm độ sáng và độ sáng tổng thể.", + "System default theme" : "Chủ đề mặc định của hệ thống", + "Enable the system default" : "Kích hoạt mặc định hệ thống", + "Using the default system appearance." : "Sử dụng giao diện hệ thống mặc định.", + "Dyslexia font" : "Chứng khó đọc", + "Enable dyslexia font" : "Bật chế độ dành cho người gặp chứng khó đọc", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic là một kiểu chữ / phông chữ miễn phí được thiết kế để giảm thiểu một số lỗi đọc phổ biến do chứng khó đọc gây ra.", + "High contrast mode" : "Chế độ tương phản cao", + "Enable high contrast mode" : "Bật chế độ tương phản cao", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Chế độ tương phản cao giúp bạn dễ dàng điều hướng và phân biệt vị trí các mục chính xác hơn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.", + "Light theme" : "Chủ đề nhẹ nhàng", + "Enable the default light theme" : "Bật chủ đề ánh sáng mặc định", + "The default light appearance." : "Sự xuất hiện ánh sáng mặc định.", + "Legal notice" : "Thông cáo pháp lý", + "Privacy policy" : "Chính sách riêng tư", + "Adjust the Nextcloud theme" : "Tinh chỉnh chủ đề Nextcloud", + "Name" : "Tên", + "Web link" : "Liên kết web", + "a safe home for all your data" : "một ngôi nhà an toàn cho tất cả dữ liệu của bạn", + "Slogan" : "Khẩu hiệu", + "Legal notice link" : "Liên kết Thông cáo pháp lý", + "Privacy policy link" : "Liên kết Chính sách riêng tư", + "Header logo" : "Logo đầu trang", + "Upload new header logo" : "Tải lên logo đầu trang mới", + "Favicon" : "Favicon", + "Upload new favicon" : "Tải lên bộ Favicon mới", + "User settings" : "Thiết lập người dùng", + "Disable user theming" : "Tắt chủ đề người dùng", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "Mặc dù bạn có thể chọn và tùy chỉnh phiên bản của mình nhưng người dùng có thể thay đổi nền và màu sắc của họ. Nếu bạn muốn thực thi tùy chỉnh của mình, bạn có thể bật tính năng này.", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Điều chỉnh giao diện cho phép bạn có thể dễ dàng tùy biến bố cục trình bày của hệ thống. Khi thực hiện nó sẽ hiện hữu đối với tất cả người dùng", + "Upload new logo" : "Tải lên logo mới", + "Logo" : "Logo", + "Upload new background and login image" : "Upload new background and login image", + "Background and login image" : "Hình nền và hình ảnh đăng nhập", + "Advanced options" : "Tùy chọn nâng cao", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Cài đặt tiện ích mở rộng ImageMagick PHP có hỗ trợ hình ảnh SVG để tự động tạo favicon dựa trên logo và màu sắc đã tải lên.", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Nếu bạn phát hiện bất kỳ vấn đề nào, đừng ngần ngại báo cáo chúng trên {issuetracker}trình theo dõi vấn đề của chúng tôi{linkend}. Và nếu bạn muốn tham gia, hãy tham gia {designteam}nhóm thiết kế của chúng tôi{linkend}!", + "Customization has been disabled by your administrator" : "Tùy chỉnh đã bị quản trị viên của bạn vô hiệu hóa", + "Keyboard shortcuts" : "Phím tắt", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Trong một số trường hợp, phím tắt có thể ảnh hưởng đến các công cụ trợ năng. Để cho phép tập trung vào công cụ của bạn một cách chính xác, bạn có thể tắt tất cả các phím tắt tại đây. Điều này cũng sẽ vô hiệu hóa tất cả các phím tắt có sẵn trong ứng dụng.", + "Disable all keyboard shortcuts" : "Vô hiệu hóa tất cả các phím tắt", + "Move up" : "Di chuyển lên", + "Move down" : "Di chuyển xuống", + "Select a background from your files" : "Chọn nền từ tập tin của bạn", + "Select background" : "Chọn phông nền", + "No background has been selected" : "Không có nền nào được chọn", + "Custom background" : "Tùy chỉnh nền", + "Plain background" : "Nền đơn giản", + "Default background" : "Nền mặc định", + "Theme selection is enforced" : "Lựa chọn chủ đề được thực thi", + "Could not set the app order" : "Không thể đặt thứ tự ứng dụng", + "Could not reset the app order" : "Không thể đặt lại thứ tự ứng dụng", + "Navigation bar settings" : "Cài đặt thanh điều hướng", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "Bạn có thể định cấu hình thứ tự ứng dụng được sử dụng cho thanh điều hướng. Mục nhập đầu tiên sẽ là ứng dụng mặc định, được mở sau khi đăng nhập hoặc khi nhấp vào logo.", + "The default app can not be changed because it was configured by the administrator." : "Không thể thay đổi ứng dụng mặc định vì nó đã được quản trị viên định cấu hình.", + "The app order was changed, to see it in action you have to reload the page." : "Thứ tự ứng dụng đã được thay đổi, để xem nó hoạt động bạn phải tải lại trang.", + "Reset default app order" : "Đặt lại thứ tự ứng dụng mặc định", + "Could not set global default apps" : "Không thể đặt ứng dụng mặc định chung", + "Default app" : "Ứng dụng mặc định", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "Ứng dụng mặc định là ứng dụng ví dụ: được mở sau khi đăng nhập hoặc khi nhấp vào biểu tượng trong menu.", + "Use custom default app" : "Sử dụng ứng dụng mặc định tùy chỉnh", + "Global default app" : "Ứng dụng mặc định toàn cầu", + "Global default apps" : "Ứng dụng mặc định toàn cầu", + "Default app priority" : "Ưu tiên ứng dụng mặc định", + "If an app is not enabled for a user, the next app with lower priority is used." : "Nếu một ứng dụng không được bật cho người dùng thì ứng dụng tiếp theo có mức độ ưu tiên thấp hơn sẽ được sử dụng.", + "Select a custom color" : "Chọn màu tùy chỉnh", + "Reset to default" : "Đặt lại về mặc định", + "Upload" : "Tải lên", + "Remove background image" : "Xóa bỏ ảnh nền", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Sự truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và hỗ trợ những phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines}Nguyên Tắc Truy Cập Cho Nội Dung Mạng{linkend} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/zh_CN.js b/apps/theming/l10n/zh_CN.js new file mode 100644 index 00000000000..8a4cde098e1 --- /dev/null +++ b/apps/theming/l10n/zh_CN.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "输入的名称过长", + "The given web address is too long" : "输入的地址过长", + "The given web address is not a valid URL" : "提供的 web 地址不是一个合法的 URL", + "The given legal notice address is too long" : "提供的法律通告地址太长", + "The given legal notice address is not a valid URL" : "提供的法律通告地址不是一个合法的 URL", + "The given privacy policy address is too long" : "提供的隐私政策地址太长", + "The given privacy policy address is not a valid URL" : "提供的隐私政策地址不是一个合法的 URL", + "The given slogan is too long" : "输入的标语过长", + "The given color is invalid" : "提供的颜色无效", + "Disable-user-theming should be true or false" : "Disable-user-theming 应该是 true 或者 false", + "Saved" : "已保存", + "Invalid app given" : "指定了无效的应用程序", + "Invalid type for setting \"defaultApp\" given" : "设置“defaultApp”指定了无效类型", + "Invalid setting key" : "无效的设定键", + "The file was uploaded" : "文件已上传", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上传的文件超出了 php.ini 中的 upload_max_filesize 的值", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件超过了 HTML 表单中指定的 MAX_FILE_SIZE 指令", + "The file was only partially uploaded" : "该文件只有部分被上传", + "No file was uploaded" : "没有文件被上传", + "Missing a temporary folder" : "缺少临时文件夹", + "Could not write file to disk" : "无法写入文件到磁盘", + "A PHP extension stopped the file upload" : "PHP 扩展停止了文件上传。", + "No file uploaded" : "文件没有上传", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "你已经在使用一个自定义的主题。主题应用的设置可能会被其覆盖。", + "Theming" : "主题", + "Appearance and accessibility" : "外观和辅助功能", + "PHP Imagick module" : "PHP Imagick 模块", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP 模块“imagick”没有被启用,尽管已启用了主题程序。为了使收藏图标正常生成,您需要安装并启用这个模块。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此实例中的 PHP 模块 \"imagick\" 不支持 SVG。为了更好的兼容性,简易安装此模块。", + "Dark theme with high contrast mode" : "高对比度深色主题", + "Enable dark high contrast mode" : "使用高对比度深色模式", + "Similar to the high contrast mode, but with dark colours." : "类似高对比度模式,但是使用深色色调。", + "Dark theme" : "深色主题", + "Enable dark theme" : "启用深色主题", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "降低整体亮度以缓解视疲劳的深色主题。", + "System default theme" : "系统默认主题", + "Enable the system default" : "使用系统默认主题", + "Using the default system appearance." : "使用系统默认外观。", + "Dyslexia font" : "阅读障碍字体", + "Enable dyslexia font" : "启用阅读障碍字体", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一款免费的字样/字体,这款字体的设计目的是缓解由阅读障碍引起的一些常见阅读错误。", + "High contrast mode" : "高对比度模式", + "Enable high contrast mode" : "启用高对比度模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降,但清晰度会提升。", + "Light theme" : "浅色主题", + "Enable the default light theme" : "使用默认浅色主题", + "The default light appearance." : "默认浅色外观", + "Legal notice" : "法律声明", + "Privacy policy" : "隐私政策", + "Adjust the Nextcloud theme" : "调整 Nextcloud 主题", + "Name" : "名字", + "Web link" : "网站链接", + "a safe home for all your data" : "给您所有的数据一个安全的家", + "Slogan" : "标语", + "Primary color" : "主要颜色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "主要颜色用于突出显示重要按钮等元素。根据当前颜色方案,它可能会有轻微调整。", + "Legal notice link" : "法律声明链接", + "Privacy policy link" : "隐私政策链接", + "Header logo" : "顶栏图标", + "Upload new header logo" : "上传新的顶栏图标", + "Favicon" : "网站图标", + "Upload new favicon" : "上传新图标", + "User settings" : "用户设置", + "Disable user theming" : "禁用用户自定义主题", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "虽然你可以选择和自定义实例,但其他用户仍然可以更改其背景和颜色。如果你想强制应用你的自定义,你可以打开它。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "主题使得方便地定制您的实例的外观和体验成为可能。所有用户都可以使用。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "您也可以配置纯色背景,而不是背景图像。如果您使用背景图像,更改此颜色将影响应用程序菜单图标的颜色。", + "Background color" : "背景颜色", + "Upload new logo" : "上传新的图标", + "Logo" : "图标", + "Upload new background and login image" : "上传新的登录界面与背景图片", + "Background and login image" : "登录界面与背景图片", + "Advanced options" : "高级选项", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安装支持 SVG 图像的 PHP 扩展 ImageMagick,以根据上传的 logo 和颜色自动生成图标。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。我们的目标是达到 {linkstart}Web 内容可访问性指南 {linkend} 2.1 中的 AA 级别,并另外通过高对比度主题达到 AAA 级别。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果你发现任何问题,请随时在{issuetracker}我们的问题跟踪器{linkend}上报告。 如果你想参与其中,请加入{designteam}我们的设计团队{linkend}!", + "Unable to apply the setting." : "无法应用设置。", + "Appearance and accessibility settings" : "外观和辅助功能设置", + "Misc accessibility options" : "其他辅助功能选项", + "Enable blur background filter (may increase GPU load)" : "启用模糊背景滤镜(可能会增加 GPU 负载)", + "Customization has been disabled by your administrator" : "管理员已禁用自定义功能", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "设置主要颜色以突出显示重要元素。用于主要按钮等元素的颜色可能会有所不同,因为它会被调整以满足无障碍要求。", + "Background and color" : "背景与颜色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以设置为默认设置中的图像、自定义上传的图像或纯色。", + "Keyboard shortcuts" : "键盘快捷键", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "某些情况下,键盘快捷键会干扰无障碍浏览工具。该设置可禁用所有键盘快捷键,以便你控制这些工具的焦点。启用该设置将同时禁用所有应用中的快捷键。", + "Disable all keyboard shortcuts" : "禁用所有键盘快捷键", + "Current selected app: {app}, position {position} of {total}" : "目前选中的应用程序:{app}、位置在 {position},共 {total}个", + "Move up" : "上移", + "Move down" : "下移", + "Select a background from your files" : "从文件中选择背景", + "Select background" : "选择背景", + "No background has been selected" : "未选择背景", + "Custom background" : "自定义背景", + "Plain background" : "纯色背景", + "Default background" : "默认背景", + "Theme selection is enforced" : "主题由管理员指定", + "Could not set the app order" : "无法设置应用顺序", + "Could not reset the app order" : "无法重置应用顺序", + "Navigation bar settings" : "导航栏设置", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以配置用于导航栏的应用顺序。第一个条目将是默认应用,在登录后或单击徽标时打开。", + "The default app can not be changed because it was configured by the administrator." : "无法更改默认应用,因为它是由管理员配置的。", + "The app order was changed, to see it in action you have to reload the page." : "应用顺序已更改,要查看其操作情况,您必须重新加载页面。", + "Reset default app order" : "重置默认应用顺序", + "Could not set primary color" : "无法设置主要颜色", + "Reset primary color" : "重置主要颜色", + "Could not set global default apps" : "无法设置全局默认应用", + "Default app" : "默认应用", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "默认应用是在登录后或单击菜单中的徽标时打开的应用。", + "Use custom default app" : "使用默认应用", + "Global default app" : "全局默认应用", + "Global default apps" : "全局默认应用", + "Default app priority" : "默认应用优先级", + "If an app is not enabled for a user, the next app with lower priority is used." : "如果某个应用未为用户启用,则使用优先级较低的下一个应用。", + "Select a custom color" : "自定义颜色", + "Reset to default" : "重置为默认设置", + "Upload" : "上传", + "Remove background image" : "删除背景图片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。我们的目标是达到 {guidelines}Web 内容可访问性指南 {linkend} 2.1 中的 AA 级别,并另外通过高对比度主题达到 AAA 级别。", + ". Unable to apply the setting." : "。无法应用此设置。" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/zh_CN.json b/apps/theming/l10n/zh_CN.json new file mode 100644 index 00000000000..051f16217d7 --- /dev/null +++ b/apps/theming/l10n/zh_CN.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "输入的名称过长", + "The given web address is too long" : "输入的地址过长", + "The given web address is not a valid URL" : "提供的 web 地址不是一个合法的 URL", + "The given legal notice address is too long" : "提供的法律通告地址太长", + "The given legal notice address is not a valid URL" : "提供的法律通告地址不是一个合法的 URL", + "The given privacy policy address is too long" : "提供的隐私政策地址太长", + "The given privacy policy address is not a valid URL" : "提供的隐私政策地址不是一个合法的 URL", + "The given slogan is too long" : "输入的标语过长", + "The given color is invalid" : "提供的颜色无效", + "Disable-user-theming should be true or false" : "Disable-user-theming 应该是 true 或者 false", + "Saved" : "已保存", + "Invalid app given" : "指定了无效的应用程序", + "Invalid type for setting \"defaultApp\" given" : "设置“defaultApp”指定了无效类型", + "Invalid setting key" : "无效的设定键", + "The file was uploaded" : "文件已上传", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上传的文件超出了 php.ini 中的 upload_max_filesize 的值", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上传的文件超过了 HTML 表单中指定的 MAX_FILE_SIZE 指令", + "The file was only partially uploaded" : "该文件只有部分被上传", + "No file was uploaded" : "没有文件被上传", + "Missing a temporary folder" : "缺少临时文件夹", + "Could not write file to disk" : "无法写入文件到磁盘", + "A PHP extension stopped the file upload" : "PHP 扩展停止了文件上传。", + "No file uploaded" : "文件没有上传", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "你已经在使用一个自定义的主题。主题应用的设置可能会被其覆盖。", + "Theming" : "主题", + "Appearance and accessibility" : "外观和辅助功能", + "PHP Imagick module" : "PHP Imagick 模块", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "PHP 模块“imagick”没有被启用,尽管已启用了主题程序。为了使收藏图标正常生成,您需要安装并启用这个模块。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此实例中的 PHP 模块 \"imagick\" 不支持 SVG。为了更好的兼容性,简易安装此模块。", + "Dark theme with high contrast mode" : "高对比度深色主题", + "Enable dark high contrast mode" : "使用高对比度深色模式", + "Similar to the high contrast mode, but with dark colours." : "类似高对比度模式,但是使用深色色调。", + "Dark theme" : "深色主题", + "Enable dark theme" : "启用深色主题", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "降低整体亮度以缓解视疲劳的深色主题。", + "System default theme" : "系统默认主题", + "Enable the system default" : "使用系统默认主题", + "Using the default system appearance." : "使用系统默认外观。", + "Dyslexia font" : "阅读障碍字体", + "Enable dyslexia font" : "启用阅读障碍字体", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一款免费的字样/字体,这款字体的设计目的是缓解由阅读障碍引起的一些常见阅读错误。", + "High contrast mode" : "高对比度模式", + "Enable high contrast mode" : "启用高对比度模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降,但清晰度会提升。", + "Light theme" : "浅色主题", + "Enable the default light theme" : "使用默认浅色主题", + "The default light appearance." : "默认浅色外观", + "Legal notice" : "法律声明", + "Privacy policy" : "隐私政策", + "Adjust the Nextcloud theme" : "调整 Nextcloud 主题", + "Name" : "名字", + "Web link" : "网站链接", + "a safe home for all your data" : "给您所有的数据一个安全的家", + "Slogan" : "标语", + "Primary color" : "主要颜色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "主要颜色用于突出显示重要按钮等元素。根据当前颜色方案,它可能会有轻微调整。", + "Legal notice link" : "法律声明链接", + "Privacy policy link" : "隐私政策链接", + "Header logo" : "顶栏图标", + "Upload new header logo" : "上传新的顶栏图标", + "Favicon" : "网站图标", + "Upload new favicon" : "上传新图标", + "User settings" : "用户设置", + "Disable user theming" : "禁用用户自定义主题", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "虽然你可以选择和自定义实例,但其他用户仍然可以更改其背景和颜色。如果你想强制应用你的自定义,你可以打开它。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "主题使得方便地定制您的实例的外观和体验成为可能。所有用户都可以使用。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "您也可以配置纯色背景,而不是背景图像。如果您使用背景图像,更改此颜色将影响应用程序菜单图标的颜色。", + "Background color" : "背景颜色", + "Upload new logo" : "上传新的图标", + "Logo" : "图标", + "Upload new background and login image" : "上传新的登录界面与背景图片", + "Background and login image" : "登录界面与背景图片", + "Advanced options" : "高级选项", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安装支持 SVG 图像的 PHP 扩展 ImageMagick,以根据上传的 logo 和颜色自动生成图标。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。我们的目标是达到 {linkstart}Web 内容可访问性指南 {linkend} 2.1 中的 AA 级别,并另外通过高对比度主题达到 AAA 级别。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果你发现任何问题,请随时在{issuetracker}我们的问题跟踪器{linkend}上报告。 如果你想参与其中,请加入{designteam}我们的设计团队{linkend}!", + "Unable to apply the setting." : "无法应用设置。", + "Appearance and accessibility settings" : "外观和辅助功能设置", + "Misc accessibility options" : "其他辅助功能选项", + "Enable blur background filter (may increase GPU load)" : "启用模糊背景滤镜(可能会增加 GPU 负载)", + "Customization has been disabled by your administrator" : "管理员已禁用自定义功能", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "设置主要颜色以突出显示重要元素。用于主要按钮等元素的颜色可能会有所不同,因为它会被调整以满足无障碍要求。", + "Background and color" : "背景与颜色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以设置为默认设置中的图像、自定义上传的图像或纯色。", + "Keyboard shortcuts" : "键盘快捷键", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "某些情况下,键盘快捷键会干扰无障碍浏览工具。该设置可禁用所有键盘快捷键,以便你控制这些工具的焦点。启用该设置将同时禁用所有应用中的快捷键。", + "Disable all keyboard shortcuts" : "禁用所有键盘快捷键", + "Current selected app: {app}, position {position} of {total}" : "目前选中的应用程序:{app}、位置在 {position},共 {total}个", + "Move up" : "上移", + "Move down" : "下移", + "Select a background from your files" : "从文件中选择背景", + "Select background" : "选择背景", + "No background has been selected" : "未选择背景", + "Custom background" : "自定义背景", + "Plain background" : "纯色背景", + "Default background" : "默认背景", + "Theme selection is enforced" : "主题由管理员指定", + "Could not set the app order" : "无法设置应用顺序", + "Could not reset the app order" : "无法重置应用顺序", + "Navigation bar settings" : "导航栏设置", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以配置用于导航栏的应用顺序。第一个条目将是默认应用,在登录后或单击徽标时打开。", + "The default app can not be changed because it was configured by the administrator." : "无法更改默认应用,因为它是由管理员配置的。", + "The app order was changed, to see it in action you have to reload the page." : "应用顺序已更改,要查看其操作情况,您必须重新加载页面。", + "Reset default app order" : "重置默认应用顺序", + "Could not set primary color" : "无法设置主要颜色", + "Reset primary color" : "重置主要颜色", + "Could not set global default apps" : "无法设置全局默认应用", + "Default app" : "默认应用", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "默认应用是在登录后或单击菜单中的徽标时打开的应用。", + "Use custom default app" : "使用默认应用", + "Global default app" : "全局默认应用", + "Global default apps" : "全局默认应用", + "Default app priority" : "默认应用优先级", + "If an app is not enabled for a user, the next app with lower priority is used." : "如果某个应用未为用户启用,则使用优先级较低的下一个应用。", + "Select a custom color" : "自定义颜色", + "Reset to default" : "重置为默认设置", + "Upload" : "上传", + "Remove background image" : "删除背景图片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "通用访问对我们非常重要。我们遵循网络标准,并进行检查以确保所有内容都可以在没有鼠标或辅助软件(例如屏幕阅读器)的情况下使用。我们的目标是达到 {guidelines}Web 内容可访问性指南 {linkend} 2.1 中的 AA 级别,并另外通过高对比度主题达到 AAA 级别。", + ". Unable to apply the setting." : "。无法应用此设置。" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/zh_HK.js b/apps/theming/l10n/zh_HK.js new file mode 100644 index 00000000000..df062a8b2c7 --- /dev/null +++ b/apps/theming/l10n/zh_HK.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "指定的名稱太長", + "The given web address is too long" : "提供的網址太長", + "The given web address is not a valid URL" : "提供的網址不是有效的 URL", + "The given legal notice address is too long" : "指定的法律聲明網址太長", + "The given legal notice address is not a valid URL" : "指定的法律聲明網址不是有效的 URL", + "The given privacy policy address is too long" : "指定的隱私權政策網址太長", + "The given privacy policy address is not a valid URL" : "指定的隱私權政策網址不是有效的 URL", + "The given slogan is too long" : "指定的標語太長", + "The given color is invalid" : "指定的顏色無效", + "Disable-user-theming should be true or false" : "Disable-user-theming 應該是 true 或 false", + "Saved" : "已儲存", + "Invalid app given" : "指定了無效的應用程式", + "Invalid type for setting \"defaultApp\" given" : "設定「defaultApp」指定了無效的類型", + "Invalid setting key" : "無效的設定密鑰", + "The file was uploaded" : "檔案已上傳", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上傳的檔案大小超過 php.ini 當中 upload_max_filesize 選項的限制", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上傳的檔案大小超過 HTML 表單中 MAX_FILE_SIZE 的限制", + "The file was only partially uploaded" : "檔案僅部份上傳", + "No file was uploaded" : "沒有檔案被上傳", + "Missing a temporary folder" : "找不到暫存資料夾", + "Could not write file to disk" : "無法將檔案寫入磁碟", + "A PHP extension stopped the file upload" : "一個 PHP 擴充功能終止檔案的上傳", + "No file uploaded" : "未上傳檔案", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "您已經在使用自訂佈景主題。佈景主題應用程式設定可能會被覆寫。", + "Theming" : "佈景主題", + "Appearance and accessibility" : "外觀和可及性", + "PHP Imagick module" : "PHP Imagick 模組", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "雖然已啟用佈景主題應用程式,但並未啟用 PHP 模組「imagick」。為了讓 favicon 產生流程正常運作,您必須安裝並啟用此模組。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此實例中的 PHP 模組 \"imagick\" 不支援SVG。為了更好的相容性,建議安裝它。", + "Dark theme with high contrast mode" : "具有高對比度模式的深色主題", + "Enable dark high contrast mode" : "啟用深色高對比度模式", + "Similar to the high contrast mode, but with dark colours." : "類似於高對比度模式,但顏色較深。", + "Dark theme" : "深色主題", + "Enable dark theme" : "啟用深色主題", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "通過降低整體亮度和亮度來舒緩您的眼睛的黑暗主題。", + "System default theme" : "系統默認主題", + "Enable the system default" : "啟用系統默認值", + "Using the default system appearance." : "使用默認系統外觀。", + "Dyslexia font" : "閱讀困難症字體", + "Enable dyslexia font" : "啟用閱讀困難症字體", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種免費的字體,目的在降低因拼音文字閱讀困難引起的一些常見閱讀錯誤。", + "High contrast mode" : "高對比模式", + "Enable high contrast mode" : "啟用高對比模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比模式能使您的瀏覽更容易。視覺品質將被降低,但清晰度將被提高。", + "Light theme" : "淺色主題", + "Enable the default light theme" : "啟用默認淺色主題", + "The default light appearance." : "默認的淺色外觀。", + "Legal notice" : "法律聲明", + "Privacy policy" : "隱私權政策", + "Adjust the Nextcloud theme" : "調整 Nextcloud 佈景主題", + "Name" : "名稱", + "Web link" : "網路連結", + "a safe home for all your data" : "您資料的安全屋", + "Slogan" : "標語", + "Primary color" : "基本顏色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本顏色用來突顯如重要的按鈕等元素。根據目前的配色方案,其可能會稍做調整。", + "Legal notice link" : "法律聲明連結", + "Privacy policy link" : "私隱政策連結", + "Header logo" : "頁首圖示", + "Upload new header logo" : "上傳新的頁首圖示", + "Favicon" : "Favicon", + "Upload new favicon" : "上傳新 favicon", + "User settings" : "用戶設定", + "Disable user theming" : "停用用戶佈景主題", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "雖然您可以選取並自訂您的實例,但用戶仍可以變更他們自己的背景與顏色。若您想要強制執行您的自訂,您可以將其開啟。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "使用佈景主題來客製化網頁界面和客戶端程式的外觀(並非所有客戶端程式都支援佈景主題),外觀將會套用至所有用戶。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "除了背景影像以外,您也可以設定純色的背景顏色。若您使用背景影像,變更此顏色將會影像應用程式選單圖示的顏色。", + "Background color" : "背景顏色", + "Upload new logo" : "上傳新的 Logo", + "Logo" : "Logo", + "Upload new background and login image" : "上傳新的背景與登入圖像", + "Background and login image" : "背景與登入圖像", + "Advanced options" : "進階選項", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安裝支援 SVG 圖片的 PHP ImageMagick 擴充元件,以上傳的圖示與顏色為基礎生成 favicons。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙使用。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {linkstart} 網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何問題,請在 {issuetracker}我們的問題追蹤系統{linkend} 舉報。而如果您想參與,歡迎加入 {designteam}我們的設計團隊{linkend}!", + "Unable to apply the setting." : "無法套用該設定。", + "Appearance and accessibility settings" : "外觀和無障礙設置", + "Misc accessibility options" : "其他輔助使用選項", + "Enable blur background filter (may increase GPU load)" : "啟用模糊背景過濾(可能會增加 GPU 負載)", + "Customization has been disabled by your administrator" : "您的管理員已停用自訂", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "設定基本顏色以突顯重要元素。主要按鈕等元素使用的顏色可能會有所不同,因為其會進行調整以滿足無障礙要求。", + "Background and color" : "背景與顏色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以設定為來自預設集合中的影像、自訂上傳影像或純色。", + "Keyboard shortcuts" : "鍵盤快捷鍵", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "在某些情況下,鍵盤快捷鍵可能會干擾無障礙工具。為了可以正確地將焦點置於您的工具,您可以在此處停用所有鍵盤快捷鍵。這也會停用應用程式中的所有可用的快捷鍵。", + "Disable all keyboard shortcuts" : "停用所有鍵盤快捷鍵", + "Current selected app: {app}, position {position} of {total}" : "目前選取的應用程式:{app}、位置為 {position},共 {total}", + "Move up" : "向上移動", + "Move down" : "向下移動", + "Select a background from your files" : "從您的檔案中選擇背景", + "Select background" : "選擇背景", + "No background has been selected" : "未選取背景", + "Custom background" : "自訂背景", + "Plain background" : "簡單背景", + "Default background" : "默認背景", + "Theme selection is enforced" : "主題選擇已實施", + "Could not set the app order" : "無法設定應用程式順序", + "Could not reset the app order" : "無法重設應用程式順序", + "Navigation bar settings" : "導航列設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以設定用於導覽列的應用程式順序。第一個條目將會是預設的應用程式,會在登入後或點擊標誌時開啟。", + "The default app can not be changed because it was configured by the administrator." : "預設的應用程式無法變更,因為其由管理員設定。", + "The app order was changed, to see it in action you have to reload the page." : "應用程式順序已變更,要檢視其實際狀況,您必須重新載入頁面。", + "Reset default app order" : "重設默認的應用程式順序", + "Could not set primary color" : "無法設定基本顏色", + "Reset primary color" : "重設基本顏色", + "Could not set global default apps" : "無法設定全域默認應用程式", + "Default app" : "默認應用程式", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "預設應用程式是,例如登入後或點擊選單中的標誌時開啟的應用程式。", + "Use custom default app" : "使用自訂的預設應用程式", + "Global default app" : "全域默認應用程式", + "Global default apps" : "全域默認應用程式", + "Default app priority" : "默認應用程式優先程度", + "If an app is not enabled for a user, the next app with lower priority is used." : "若未對某個用戶啟用某個應用程式,則使用下一個優先程度較低的應用程式。", + "Select a custom color" : "選擇自訂色彩", + "Reset to default" : "恢復預設值", + "Upload" : "上傳", + "Remove background image" : "移除背景圖片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙使用。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines} 網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。", + ". Unable to apply the setting." : "。無法套用該設定。" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/zh_HK.json b/apps/theming/l10n/zh_HK.json new file mode 100644 index 00000000000..d58924476c2 --- /dev/null +++ b/apps/theming/l10n/zh_HK.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "指定的名稱太長", + "The given web address is too long" : "提供的網址太長", + "The given web address is not a valid URL" : "提供的網址不是有效的 URL", + "The given legal notice address is too long" : "指定的法律聲明網址太長", + "The given legal notice address is not a valid URL" : "指定的法律聲明網址不是有效的 URL", + "The given privacy policy address is too long" : "指定的隱私權政策網址太長", + "The given privacy policy address is not a valid URL" : "指定的隱私權政策網址不是有效的 URL", + "The given slogan is too long" : "指定的標語太長", + "The given color is invalid" : "指定的顏色無效", + "Disable-user-theming should be true or false" : "Disable-user-theming 應該是 true 或 false", + "Saved" : "已儲存", + "Invalid app given" : "指定了無效的應用程式", + "Invalid type for setting \"defaultApp\" given" : "設定「defaultApp」指定了無效的類型", + "Invalid setting key" : "無效的設定密鑰", + "The file was uploaded" : "檔案已上傳", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上傳的檔案大小超過 php.ini 當中 upload_max_filesize 選項的限制", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上傳的檔案大小超過 HTML 表單中 MAX_FILE_SIZE 的限制", + "The file was only partially uploaded" : "檔案僅部份上傳", + "No file was uploaded" : "沒有檔案被上傳", + "Missing a temporary folder" : "找不到暫存資料夾", + "Could not write file to disk" : "無法將檔案寫入磁碟", + "A PHP extension stopped the file upload" : "一個 PHP 擴充功能終止檔案的上傳", + "No file uploaded" : "未上傳檔案", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "您已經在使用自訂佈景主題。佈景主題應用程式設定可能會被覆寫。", + "Theming" : "佈景主題", + "Appearance and accessibility" : "外觀和可及性", + "PHP Imagick module" : "PHP Imagick 模組", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "雖然已啟用佈景主題應用程式,但並未啟用 PHP 模組「imagick」。為了讓 favicon 產生流程正常運作,您必須安裝並啟用此模組。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此實例中的 PHP 模組 \"imagick\" 不支援SVG。為了更好的相容性,建議安裝它。", + "Dark theme with high contrast mode" : "具有高對比度模式的深色主題", + "Enable dark high contrast mode" : "啟用深色高對比度模式", + "Similar to the high contrast mode, but with dark colours." : "類似於高對比度模式,但顏色較深。", + "Dark theme" : "深色主題", + "Enable dark theme" : "啟用深色主題", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "通過降低整體亮度和亮度來舒緩您的眼睛的黑暗主題。", + "System default theme" : "系統默認主題", + "Enable the system default" : "啟用系統默認值", + "Using the default system appearance." : "使用默認系統外觀。", + "Dyslexia font" : "閱讀困難症字體", + "Enable dyslexia font" : "啟用閱讀困難症字體", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種免費的字體,目的在降低因拼音文字閱讀困難引起的一些常見閱讀錯誤。", + "High contrast mode" : "高對比模式", + "Enable high contrast mode" : "啟用高對比模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比模式能使您的瀏覽更容易。視覺品質將被降低,但清晰度將被提高。", + "Light theme" : "淺色主題", + "Enable the default light theme" : "啟用默認淺色主題", + "The default light appearance." : "默認的淺色外觀。", + "Legal notice" : "法律聲明", + "Privacy policy" : "隱私權政策", + "Adjust the Nextcloud theme" : "調整 Nextcloud 佈景主題", + "Name" : "名稱", + "Web link" : "網路連結", + "a safe home for all your data" : "您資料的安全屋", + "Slogan" : "標語", + "Primary color" : "基本顏色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本顏色用來突顯如重要的按鈕等元素。根據目前的配色方案,其可能會稍做調整。", + "Legal notice link" : "法律聲明連結", + "Privacy policy link" : "私隱政策連結", + "Header logo" : "頁首圖示", + "Upload new header logo" : "上傳新的頁首圖示", + "Favicon" : "Favicon", + "Upload new favicon" : "上傳新 favicon", + "User settings" : "用戶設定", + "Disable user theming" : "停用用戶佈景主題", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "雖然您可以選取並自訂您的實例,但用戶仍可以變更他們自己的背景與顏色。若您想要強制執行您的自訂,您可以將其開啟。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "使用佈景主題來客製化網頁界面和客戶端程式的外觀(並非所有客戶端程式都支援佈景主題),外觀將會套用至所有用戶。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "除了背景影像以外,您也可以設定純色的背景顏色。若您使用背景影像,變更此顏色將會影像應用程式選單圖示的顏色。", + "Background color" : "背景顏色", + "Upload new logo" : "上傳新的 Logo", + "Logo" : "Logo", + "Upload new background and login image" : "上傳新的背景與登入圖像", + "Background and login image" : "背景與登入圖像", + "Advanced options" : "進階選項", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安裝支援 SVG 圖片的 PHP ImageMagick 擴充元件,以上傳的圖示與顏色為基礎生成 favicons。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙使用。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {linkstart} 網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何問題,請在 {issuetracker}我們的問題追蹤系統{linkend} 舉報。而如果您想參與,歡迎加入 {designteam}我們的設計團隊{linkend}!", + "Unable to apply the setting." : "無法套用該設定。", + "Appearance and accessibility settings" : "外觀和無障礙設置", + "Misc accessibility options" : "其他輔助使用選項", + "Enable blur background filter (may increase GPU load)" : "啟用模糊背景過濾(可能會增加 GPU 負載)", + "Customization has been disabled by your administrator" : "您的管理員已停用自訂", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "設定基本顏色以突顯重要元素。主要按鈕等元素使用的顏色可能會有所不同,因為其會進行調整以滿足無障礙要求。", + "Background and color" : "背景與顏色", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以設定為來自預設集合中的影像、自訂上傳影像或純色。", + "Keyboard shortcuts" : "鍵盤快捷鍵", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "在某些情況下,鍵盤快捷鍵可能會干擾無障礙工具。為了可以正確地將焦點置於您的工具,您可以在此處停用所有鍵盤快捷鍵。這也會停用應用程式中的所有可用的快捷鍵。", + "Disable all keyboard shortcuts" : "停用所有鍵盤快捷鍵", + "Current selected app: {app}, position {position} of {total}" : "目前選取的應用程式:{app}、位置為 {position},共 {total}", + "Move up" : "向上移動", + "Move down" : "向下移動", + "Select a background from your files" : "從您的檔案中選擇背景", + "Select background" : "選擇背景", + "No background has been selected" : "未選取背景", + "Custom background" : "自訂背景", + "Plain background" : "簡單背景", + "Default background" : "默認背景", + "Theme selection is enforced" : "主題選擇已實施", + "Could not set the app order" : "無法設定應用程式順序", + "Could not reset the app order" : "無法重設應用程式順序", + "Navigation bar settings" : "導航列設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以設定用於導覽列的應用程式順序。第一個條目將會是預設的應用程式,會在登入後或點擊標誌時開啟。", + "The default app can not be changed because it was configured by the administrator." : "預設的應用程式無法變更,因為其由管理員設定。", + "The app order was changed, to see it in action you have to reload the page." : "應用程式順序已變更,要檢視其實際狀況,您必須重新載入頁面。", + "Reset default app order" : "重設默認的應用程式順序", + "Could not set primary color" : "無法設定基本顏色", + "Reset primary color" : "重設基本顏色", + "Could not set global default apps" : "無法設定全域默認應用程式", + "Default app" : "默認應用程式", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "預設應用程式是,例如登入後或點擊選單中的標誌時開啟的應用程式。", + "Use custom default app" : "使用自訂的預設應用程式", + "Global default app" : "全域默認應用程式", + "Global default apps" : "全域默認應用程式", + "Default app priority" : "默認應用程式優先程度", + "If an app is not enabled for a user, the next app with lower priority is used." : "若未對某個用戶啟用某個應用程式,則使用下一個優先程度較低的應用程式。", + "Select a custom color" : "選擇自訂色彩", + "Reset to default" : "恢復預設值", + "Upload" : "上傳", + "Remove background image" : "移除背景圖片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙使用。我們遵循網路標準,並透過檢查來確保所有內容皆可在沒有滑鼠或輔助軟體(例如螢幕閱讀器)的情況下使用。我們目標是能達到 {guidelines} 網頁內容可及性指引{linkend} 2.1 版的 AA 等級,加上高對比度主題甚至還能到 AAA 等級。", + ". Unable to apply the setting." : "。無法套用該設定。" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/zh_TW.js b/apps/theming/l10n/zh_TW.js new file mode 100644 index 00000000000..af17fe6bea8 --- /dev/null +++ b/apps/theming/l10n/zh_TW.js @@ -0,0 +1,125 @@ +OC.L10N.register( + "theming", + { + "The given name is too long" : "給予的名稱太長", + "The given web address is too long" : "給予的網址太長", + "The given web address is not a valid URL" : "給予的網址不是有效的 URL", + "The given legal notice address is too long" : "給予的法律聲明網址太長", + "The given legal notice address is not a valid URL" : "給予的法律聲明網址不是有效的 URL", + "The given privacy policy address is too long" : "給予的隱私權政策網址太長", + "The given privacy policy address is not a valid URL" : "給予的隱私權政策網址不是有效的 URL", + "The given slogan is too long" : "給予的標語太長", + "The given color is invalid" : "給予的顏色無效", + "Disable-user-theming should be true or false" : "Disable-user-theming 應該是 true 或 false", + "Saved" : "已儲存", + "Invalid app given" : "給予了無效的應用程式", + "Invalid type for setting \"defaultApp\" given" : "設定「defaultApp」時給予了無效的類型", + "Invalid setting key" : "無效的設定鍵", + "The file was uploaded" : "檔案已上傳", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上傳的檔案大小超過 php.ini 中 upload_max_filesize 條目設定的限制", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上傳的檔案大小超過 HTML 表單中 MAX_FILE_SIZE 條目指定的限制", + "The file was only partially uploaded" : "檔案僅部份上傳", + "No file was uploaded" : "沒有檔案上傳", + "Missing a temporary folder" : "找不到暫存資料夾", + "Could not write file to disk" : "無法將檔案寫入磁碟", + "A PHP extension stopped the file upload" : "有個 PHP 擴充功能停止檔案的上傳", + "No file uploaded" : "未上傳檔案", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "您已在使用自訂佈景主題。佈景主題應用程式設定可能會被覆寫。", + "Theming" : "佈景主題", + "Appearance and accessibility" : "外觀與無障礙存取", + "PHP Imagick module" : "PHP Imagick 模組", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "雖然已啟用佈景主題應用程式,但並未啟用 PHP 模組「imagick」。為了讓 favicon 產生流程正常運作,您必須安裝並啟用此模組。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此站台的 PHP 模組「imagick」不支援 SVG。為了更好的相容性,建議安裝它。", + "Dark theme with high contrast mode" : "有高對比模式的深色主題", + "Enable dark high contrast mode" : "啟用深色高對比模式", + "Similar to the high contrast mode, but with dark colours." : "類似於高對比模式,但顏色較深。", + "Dark theme" : "深色主題", + "Enable dark theme" : "啟用深色主題", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "透過降低整體光度與亮度,來舒緩您眼睛的深色主題。", + "System default theme" : "系統預設佈景主題", + "Enable the system default" : "啟用系統預設值", + "Using the default system appearance." : "使用預設的系統外觀。", + "Dyslexia font" : "閱讀障礙字型", + "Enable dyslexia font" : "啟用閱讀障礙字型", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種自由的字體/字型,設計目的在於降低因拼音文字閱讀障礙引起的一些常見閱讀錯誤。", + "High contrast mode" : "高對比度模式", + "Enable high contrast mode" : "開啟高對比度模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低視覺質感,但會提高清晰度,有助您在畫面中瀏覽。", + "Light theme" : "淺色佈景主題", + "Enable the default light theme" : "啟用預設的淺色佈景主題", + "The default light appearance." : "預設的淺色外觀。", + "Legal notice" : "法律聲明", + "Privacy policy" : "隱私權政策", + "Adjust the Nextcloud theme" : "調整 Nextcloud 佈景主題", + "Name" : "名稱", + "Web link" : "網頁連結", + "a safe home for all your data" : "您所有資料的安全屋", + "Slogan" : "標語", + "Primary color" : "基本顏色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本顏色用來突顯如重要的按鈕等元素。根據目前的配色方案,其可能會稍做調整。", + "Legal notice link" : "法律聲明連結", + "Privacy policy link" : "隱私權政策連結", + "Header logo" : "頁首標誌", + "Upload new header logo" : "上傳新的頁首 Logo 標誌", + "Favicon" : "Favicon", + "Upload new favicon" : "上傳新的 Favicon", + "User settings" : "使用者設定", + "Disable user theming" : "停用使用者佈景主題", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "雖然您可以選取並自訂您的站台,但使用者仍可以變更他們自己的背景與顏色。若您想要強制執行您的自訂,您可以將其開啟。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "佈景主題讓您可以輕鬆自訂站台與支援客戶端的外觀與感覺。這對所有使用者都可以看見。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "除了背景影像以外,您也可以設定純色的背景顏色。若您使用背景影像,變更此顏色將會影像應用程式選單圖示的顏色。", + "Background color" : "背景顏色", + "Upload new logo" : "上傳新的 Logo 標誌", + "Logo" : "標誌", + "Upload new background and login image" : "上傳新的背景與登入圖片", + "Background and login image" : "背景與登入圖片", + "Advanced options" : "進階選項", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安裝支援 SVG 圖片的 PHP ImageMagick 擴充功能,可以根據上傳的標誌與顏色,自動生成 favicon。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網頁標準,並透過檢查來確保所有內容皆可在沒有滑鼠,或是在輔助軟體,例如螢幕閱讀器的情況下使用。我們目標是能達到《{linkstart}網頁內容無障礙指引{linkend}》2.1 版的 AA 等級,加上高對比度主題後,甚至還能達到 AAA 等級。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何一個問題,請不要猶豫並請在{issuetracker}我們的問題追蹤系統{linkend}中回報。而如果您想參與專案,歡迎加入{designteam}我們的設計團隊{linkend}!", + "Unable to apply the setting." : "無法套用設定。", + "Appearance and accessibility settings" : "外觀與無障礙存取設定", + "Misc accessibility options" : "其他無障礙選項", + "Enable blur background filter (may increase GPU load)" : "啟用模糊背景過濾(可能會增加 GPU 負載)", + "Customization has been disabled by your administrator" : "您的管理員已停用自訂", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "設定基本顏色以突顯重要元素。主要按鈕等元素使用的顏色可能會有所不同,因為其會進行調整以滿足無障礙要求。", + "Background and color" : "背景與色彩", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以設定為來自預設集合中的影像、自訂上傳影像或純色。", + "Keyboard shortcuts" : "鍵盤快捷鍵", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "在某些情況下,鍵盤快捷鍵可能會干擾無障礙工具。為了可以正確地將焦點置於您的工具,您可以在此處停用所有鍵盤快捷鍵。這也會停用應用程式中的所有可用的快捷鍵。", + "Disable all keyboard shortcuts" : "停用所有鍵盤快捷鍵", + "Current selected app: {app}, position {position} of {total}" : "目前選取的應用程式:{app},位置為 {position},共 {total}", + "Move up" : "向上移動", + "Move down" : "向下移動", + "Select a background from your files" : "從您的檔案中選取背景", + "Select background" : "選取背景", + "No background has been selected" : "未選取背景", + "Custom background" : "自訂背景", + "Plain background" : "簡單背景", + "Default background" : "預設背景", + "Theme selection is enforced" : "強制佈景主題選取", + "Could not set the app order" : "無法設定應用程式順序", + "Could not reset the app order" : "無法重設應用程式順序", + "Navigation bar settings" : "導覽列設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以設定導覽列使用的應用程式順序。第一個條目將會是預設應用程式,會在登入後或點擊標誌時開啟。", + "The default app can not be changed because it was configured by the administrator." : "預設的應用程式無法變更,因為是由管理員設定。", + "The app order was changed, to see it in action you have to reload the page." : "應用程式順序已變更,要檢視其實際狀況,您必須重新載入頁面。", + "Reset default app order" : "重設預設的應用程式順序", + "Could not set primary color" : "無法設定基本顏色", + "Reset primary color" : "重設基本顏色", + "Could not set global default apps" : "無法設定全域預設應用程式", + "Default app" : "預設應用程式", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "預設應用程式是指,會在登入後開啟,或是點擊選單中的標誌時開啟的應用程式。", + "Use custom default app" : "使用自訂的預設應用程式", + "Global default app" : "全域預設應用程式", + "Global default apps" : "全域預設應用程式", + "Default app priority" : "預設應用程式順序", + "If an app is not enabled for a user, the next app with lower priority is used." : "若某個應用程式未對使用者啟用,則會為他使用下一個順序的應用程式。", + "Select a custom color" : "選取自訂色彩", + "Reset to default" : "重設為預設值", + "Upload" : "上傳", + "Remove background image" : "移除背景圖片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網頁標準,並透過檢查來確保所有內容皆可在沒有滑鼠,或是在輔助軟體,例如螢幕閱讀器的情況下使用。我們目標是能達到《{guidelines}網頁內容無障礙指引{linkend}》2.1 版的 AA 等級,加上高對比度主題後,甚至還能達到 AAA 等級。", + ". Unable to apply the setting." : "無法套用設定。" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/zh_TW.json b/apps/theming/l10n/zh_TW.json new file mode 100644 index 00000000000..34d79acb58f --- /dev/null +++ b/apps/theming/l10n/zh_TW.json @@ -0,0 +1,123 @@ +{ "translations": { + "The given name is too long" : "給予的名稱太長", + "The given web address is too long" : "給予的網址太長", + "The given web address is not a valid URL" : "給予的網址不是有效的 URL", + "The given legal notice address is too long" : "給予的法律聲明網址太長", + "The given legal notice address is not a valid URL" : "給予的法律聲明網址不是有效的 URL", + "The given privacy policy address is too long" : "給予的隱私權政策網址太長", + "The given privacy policy address is not a valid URL" : "給予的隱私權政策網址不是有效的 URL", + "The given slogan is too long" : "給予的標語太長", + "The given color is invalid" : "給予的顏色無效", + "Disable-user-theming should be true or false" : "Disable-user-theming 應該是 true 或 false", + "Saved" : "已儲存", + "Invalid app given" : "給予了無效的應用程式", + "Invalid type for setting \"defaultApp\" given" : "設定「defaultApp」時給予了無效的類型", + "Invalid setting key" : "無效的設定鍵", + "The file was uploaded" : "檔案已上傳", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "上傳的檔案大小超過 php.ini 中 upload_max_filesize 條目設定的限制", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "上傳的檔案大小超過 HTML 表單中 MAX_FILE_SIZE 條目指定的限制", + "The file was only partially uploaded" : "檔案僅部份上傳", + "No file was uploaded" : "沒有檔案上傳", + "Missing a temporary folder" : "找不到暫存資料夾", + "Could not write file to disk" : "無法將檔案寫入磁碟", + "A PHP extension stopped the file upload" : "有個 PHP 擴充功能停止檔案的上傳", + "No file uploaded" : "未上傳檔案", + "You are already using a custom theme. Theming app settings might be overwritten by that." : "您已在使用自訂佈景主題。佈景主題應用程式設定可能會被覆寫。", + "Theming" : "佈景主題", + "Appearance and accessibility" : "外觀與無障礙存取", + "PHP Imagick module" : "PHP Imagick 模組", + "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "雖然已啟用佈景主題應用程式,但並未啟用 PHP 模組「imagick」。為了讓 favicon 產生流程正常運作,您必須安裝並啟用此模組。", + "The PHP module \"imagick\" in this instance has no SVG support. For better compatibility it is recommended to install it." : "此站台的 PHP 模組「imagick」不支援 SVG。為了更好的相容性,建議安裝它。", + "Dark theme with high contrast mode" : "有高對比模式的深色主題", + "Enable dark high contrast mode" : "啟用深色高對比模式", + "Similar to the high contrast mode, but with dark colours." : "類似於高對比模式,但顏色較深。", + "Dark theme" : "深色主題", + "Enable dark theme" : "啟用深色主題", + "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "透過降低整體光度與亮度,來舒緩您眼睛的深色主題。", + "System default theme" : "系統預設佈景主題", + "Enable the system default" : "啟用系統預設值", + "Using the default system appearance." : "使用預設的系統外觀。", + "Dyslexia font" : "閱讀障礙字型", + "Enable dyslexia font" : "啟用閱讀障礙字型", + "OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic 是一種自由的字體/字型,設計目的在於降低因拼音文字閱讀障礙引起的一些常見閱讀錯誤。", + "High contrast mode" : "高對比度模式", + "Enable high contrast mode" : "開啟高對比度模式", + "A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "高對比度模式會降低視覺質感,但會提高清晰度,有助您在畫面中瀏覽。", + "Light theme" : "淺色佈景主題", + "Enable the default light theme" : "啟用預設的淺色佈景主題", + "The default light appearance." : "預設的淺色外觀。", + "Legal notice" : "法律聲明", + "Privacy policy" : "隱私權政策", + "Adjust the Nextcloud theme" : "調整 Nextcloud 佈景主題", + "Name" : "名稱", + "Web link" : "網頁連結", + "a safe home for all your data" : "您所有資料的安全屋", + "Slogan" : "標語", + "Primary color" : "基本顏色", + "The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema." : "基本顏色用來突顯如重要的按鈕等元素。根據目前的配色方案,其可能會稍做調整。", + "Legal notice link" : "法律聲明連結", + "Privacy policy link" : "隱私權政策連結", + "Header logo" : "頁首標誌", + "Upload new header logo" : "上傳新的頁首 Logo 標誌", + "Favicon" : "Favicon", + "Upload new favicon" : "上傳新的 Favicon", + "User settings" : "使用者設定", + "Disable user theming" : "停用使用者佈景主題", + "Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on." : "雖然您可以選取並自訂您的站台,但使用者仍可以變更他們自己的背景與顏色。若您想要強制執行您的自訂,您可以將其開啟。", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "佈景主題讓您可以輕鬆自訂站台與支援客戶端的外觀與感覺。這對所有使用者都可以看見。", + "Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons." : "除了背景影像以外,您也可以設定純色的背景顏色。若您使用背景影像,變更此顏色將會影像應用程式選單圖示的顏色。", + "Background color" : "背景顏色", + "Upload new logo" : "上傳新的 Logo 標誌", + "Logo" : "標誌", + "Upload new background and login image" : "上傳新的背景與登入圖片", + "Background and login image" : "背景與登入圖片", + "Advanced options" : "進階選項", + "Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "安裝支援 SVG 圖片的 PHP ImageMagick 擴充功能,可以根據上傳的標誌與顏色,自動生成 favicon。", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網頁標準,並透過檢查來確保所有內容皆可在沒有滑鼠,或是在輔助軟體,例如螢幕閱讀器的情況下使用。我們目標是能達到《{linkstart}網頁內容無障礙指引{linkend}》2.1 版的 AA 等級,加上高對比度主題後,甚至還能達到 AAA 等級。", + "If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "如果您發現任何一個問題,請不要猶豫並請在{issuetracker}我們的問題追蹤系統{linkend}中回報。而如果您想參與專案,歡迎加入{designteam}我們的設計團隊{linkend}!", + "Unable to apply the setting." : "無法套用設定。", + "Appearance and accessibility settings" : "外觀與無障礙存取設定", + "Misc accessibility options" : "其他無障礙選項", + "Enable blur background filter (may increase GPU load)" : "啟用模糊背景過濾(可能會增加 GPU 負載)", + "Customization has been disabled by your administrator" : "您的管理員已停用自訂", + "Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements." : "設定基本顏色以突顯重要元素。主要按鈕等元素使用的顏色可能會有所不同,因為其會進行調整以滿足無障礙要求。", + "Background and color" : "背景與色彩", + "The background can be set to an image from the default set, a custom uploaded image, or a plain color." : "背景可以設定為來自預設集合中的影像、自訂上傳影像或純色。", + "Keyboard shortcuts" : "鍵盤快捷鍵", + "In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "在某些情況下,鍵盤快捷鍵可能會干擾無障礙工具。為了可以正確地將焦點置於您的工具,您可以在此處停用所有鍵盤快捷鍵。這也會停用應用程式中的所有可用的快捷鍵。", + "Disable all keyboard shortcuts" : "停用所有鍵盤快捷鍵", + "Current selected app: {app}, position {position} of {total}" : "目前選取的應用程式:{app},位置為 {position},共 {total}", + "Move up" : "向上移動", + "Move down" : "向下移動", + "Select a background from your files" : "從您的檔案中選取背景", + "Select background" : "選取背景", + "No background has been selected" : "未選取背景", + "Custom background" : "自訂背景", + "Plain background" : "簡單背景", + "Default background" : "預設背景", + "Theme selection is enforced" : "強制佈景主題選取", + "Could not set the app order" : "無法設定應用程式順序", + "Could not reset the app order" : "無法重設應用程式順序", + "Navigation bar settings" : "導覽列設定", + "You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo." : "您可以設定導覽列使用的應用程式順序。第一個條目將會是預設應用程式,會在登入後或點擊標誌時開啟。", + "The default app can not be changed because it was configured by the administrator." : "預設的應用程式無法變更,因為是由管理員設定。", + "The app order was changed, to see it in action you have to reload the page." : "應用程式順序已變更,要檢視其實際狀況,您必須重新載入頁面。", + "Reset default app order" : "重設預設的應用程式順序", + "Could not set primary color" : "無法設定基本顏色", + "Reset primary color" : "重設基本顏色", + "Could not set global default apps" : "無法設定全域預設應用程式", + "Default app" : "預設應用程式", + "The default app is the app that is e.g. opened after login or when the logo in the menu is clicked." : "預設應用程式是指,會在登入後開啟,或是點擊選單中的標誌時開啟的應用程式。", + "Use custom default app" : "使用自訂的預設應用程式", + "Global default app" : "全域預設應用程式", + "Global default apps" : "全域預設應用程式", + "Default app priority" : "預設應用程式順序", + "If an app is not enabled for a user, the next app with lower priority is used." : "若某個應用程式未對使用者啟用,則會為他使用下一個順序的應用程式。", + "Select a custom color" : "選取自訂色彩", + "Reset to default" : "重設為預設值", + "Upload" : "上傳", + "Remove background image" : "移除背景圖片", + "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "我們非常重視無障礙存取。我們遵循網頁標準,並透過檢查來確保所有內容皆可在沒有滑鼠,或是在輔助軟體,例如螢幕閱讀器的情況下使用。我們目標是能達到《{guidelines}網頁內容無障礙指引{linkend}》2.1 版的 AA 等級,加上高對比度主題後,甚至還能達到 AAA 等級。", + ". Unable to apply the setting." : "無法套用設定。" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/lib/AppInfo/Application.php b/apps/theming/lib/AppInfo/Application.php new file mode 100644 index 00000000000..d08a1903265 --- /dev/null +++ b/apps/theming/lib/AppInfo/Application.php @@ -0,0 +1,40 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\AppInfo; + +use OCA\Theming\Capabilities; +use OCA\Theming\Listener\BeforePreferenceListener; +use OCA\Theming\Listener\BeforeTemplateRenderedListener; +use OCA\Theming\SetupChecks\PhpImagickModule; +use OCP\AppFramework\App; +use OCP\AppFramework\Bootstrap\IBootContext; +use OCP\AppFramework\Bootstrap\IBootstrap; +use OCP\AppFramework\Bootstrap\IRegistrationContext; +use OCP\AppFramework\Http\Events\BeforeLoginTemplateRenderedEvent; +use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; +use OCP\Config\BeforePreferenceDeletedEvent; +use OCP\Config\BeforePreferenceSetEvent; + +class Application extends App implements IBootstrap { + public const APP_ID = 'theming'; + + public function __construct() { + parent::__construct(self::APP_ID); + } + + public function register(IRegistrationContext $context): void { + $context->registerCapability(Capabilities::class); + $context->registerEventListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class); + $context->registerEventListener(BeforeLoginTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class); + $context->registerEventListener(BeforePreferenceSetEvent::class, BeforePreferenceListener::class); + $context->registerEventListener(BeforePreferenceDeletedEvent::class, BeforePreferenceListener::class); + $context->registerSetupCheck(PhpImagickModule::class); + } + + public function boot(IBootContext $context): void { + } +} diff --git a/apps/theming/lib/Capabilities.php b/apps/theming/lib/Capabilities.php new file mode 100644 index 00000000000..d5d6e415e75 --- /dev/null +++ b/apps/theming/lib/Capabilities.php @@ -0,0 +1,117 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Service\BackgroundService; +use OCP\Capabilities\IPublicCapability; +use OCP\IConfig; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserSession; + +/** + * Class Capabilities + * + * @package OCA\Theming + */ +class Capabilities implements IPublicCapability { + + /** + * @param ThemingDefaults $theming + * @param Util $util + * @param IURLGenerator $url + * @param IConfig $config + */ + public function __construct( + protected ThemingDefaults $theming, + protected Util $util, + protected IURLGenerator $url, + protected IConfig $config, + protected IUserSession $userSession, + ) { + } + + /** + * Return this classes capabilities + * + * @return array{ + * theming: array{ + * name: string, + * productName: string, + * url: string, + * slogan: string, + * color: string, + * color-text: string, + * color-element: string, + * color-element-bright: string, + * color-element-dark: string, + * logo: string, + * background: string, + * background-text: string, + * background-plain: bool, + * background-default: bool, + * logoheader: string, + * favicon: string, + * }, + * } + */ + public function getCapabilities() { + $color = $this->theming->getDefaultColorPrimary(); + $colorText = $this->util->invertTextColor($color) ? '#000000' : '#ffffff'; + + $backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime', ''); + $backgroundColor = $this->theming->getColorBackground(); + $backgroundText = $this->theming->getTextColorBackground(); + $backgroundPlain = $backgroundLogo === 'backgroundColor' || ($backgroundLogo === '' && $backgroundColor !== BackgroundService::DEFAULT_COLOR); + $background = $backgroundPlain ? $backgroundColor : $this->url->getAbsoluteURL($this->theming->getBackground()); + + $user = $this->userSession->getUser(); + if ($user instanceof IUser) { + /** + * Mimics the logic of generateUserBackgroundVariables() that generates the CSS variables. + * Also needs to be updated if the logic changes. + * @see \OCA\Theming\Themes\CommonThemeTrait::generateUserBackgroundVariables() + */ + $color = $this->theming->getColorPrimary(); + $colorText = $this->theming->getTextColorPrimary(); + + $backgroundImage = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_image', BackgroundService::BACKGROUND_DEFAULT); + if ($backgroundImage === BackgroundService::BACKGROUND_CUSTOM) { + $backgroundPlain = false; + $background = $this->url->linkToRouteAbsolute('theming.userTheme.getBackground'); + } elseif (isset(BackgroundService::SHIPPED_BACKGROUNDS[$backgroundImage])) { + $backgroundPlain = false; + $background = $this->url->linkTo(Application::APP_ID, "img/background/$backgroundImage"); + } elseif ($backgroundImage !== BackgroundService::BACKGROUND_DEFAULT) { + $backgroundPlain = true; + $background = $backgroundColor; + } + } + + return [ + 'theming' => [ + 'name' => $this->theming->getName(), + 'productName' => $this->theming->getProductName(), + 'url' => $this->theming->getBaseUrl(), + 'slogan' => $this->theming->getSlogan(), + 'color' => $color, + 'color-text' => $colorText, + 'color-element' => $this->util->elementColor($color), + 'color-element-bright' => $this->util->elementColor($color), + 'color-element-dark' => $this->util->elementColor($color, false), + 'logo' => $this->url->getAbsoluteURL($this->theming->getLogo()), + 'background' => $background, + 'background-text' => $backgroundText, + 'background-plain' => $backgroundPlain, + 'background-default' => !$this->util->isBackgroundThemed(), + 'logoheader' => $this->url->getAbsoluteURL($this->theming->getLogo()), + 'favicon' => $this->url->getAbsoluteURL($this->theming->getLogo()), + ], + ]; + } +} diff --git a/apps/theming/lib/Command/UpdateConfig.php b/apps/theming/lib/Command/UpdateConfig.php new file mode 100644 index 00000000000..6236f866445 --- /dev/null +++ b/apps/theming/lib/Command/UpdateConfig.php @@ -0,0 +1,127 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Command; + +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCP\IConfig; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +class UpdateConfig extends Command { + public const SUPPORTED_KEYS = [ + 'name', 'url', 'imprintUrl', 'privacyUrl', 'slogan', 'color', 'primary_color', 'background_color', 'disable-user-theming' + ]; + + public function __construct( + private ThemingDefaults $themingDefaults, + private ImageManager $imageManager, + private IConfig $config, + ) { + parent::__construct(); + } + + protected function configure() { + $this + ->setName('theming:config') + ->setDescription('Set theming app config values') + ->addArgument( + 'key', + InputArgument::OPTIONAL, + 'Key to update the theming app configuration (leave empty to get a list of all configured values)' . PHP_EOL + . 'One of: ' . implode(', ', self::SUPPORTED_KEYS) + ) + ->addArgument( + 'value', + InputArgument::OPTIONAL, + 'Value to set (leave empty to obtain the current value)' + ) + ->addOption( + 'reset', + 'r', + InputOption::VALUE_NONE, + 'Reset the given config key to default' + ); + } + + + protected function execute(InputInterface $input, OutputInterface $output): int { + $key = $input->getArgument('key'); + $value = $input->getArgument('value'); + assert(is_string($value) || $value === null, 'At most one value should be provided.'); + + if ($key === null) { + $output->writeln('Current theming config:'); + foreach (self::SUPPORTED_KEYS as $key) { + $value = $this->config->getAppValue('theming', $key, ''); + $output->writeln('- ' . $key . ': ' . $value . ''); + } + foreach (ImageManager::SUPPORTED_IMAGE_KEYS as $key) { + $value = $this->config->getAppValue('theming', $key . 'Mime', ''); + $output->writeln('- ' . $key . ': ' . $value . ''); + } + return 0; + } + + if (!in_array($key, self::SUPPORTED_KEYS, true) && !in_array($key, ImageManager::SUPPORTED_IMAGE_KEYS, true)) { + $output->writeln('<error>Invalid config key provided</error>'); + return 1; + } + + if ($input->getOption('reset')) { + $defaultValue = $this->themingDefaults->undo($key); + $output->writeln('<info>Reset ' . $key . ' to ' . $defaultValue . '</info>'); + return 0; + } + + if ($value === null) { + $value = $this->config->getAppValue('theming', $key, ''); + if ($value !== '') { + $output->writeln('<info>' . $key . ' is currently set to ' . $value . '</info>'); + } else { + $output->writeln('<info>' . $key . ' is currently not set</info>'); + } + return 0; + } + + if ($key === 'background' && $value === 'backgroundColor') { + $this->themingDefaults->undo($key); + $key = $key . 'Mime'; + } + + if (in_array($key, ImageManager::SUPPORTED_IMAGE_KEYS, true)) { + if (!str_starts_with($value, '/')) { + $output->writeln('<error>The image file needs to be provided as an absolute path: ' . $value . '.</error>'); + return 1; + } + if (!file_exists($value)) { + $output->writeln('<error>File could not be found: ' . $value . '.</error>'); + return 1; + } + $value = $this->imageManager->updateImage($key, $value); + $key = $key . 'Mime'; + } + + if ($key === 'color') { + $output->writeln('<comment>Using "color" is deprecated, use "primary_color" instead</comment>'); + $key = 'primary_color'; + } + + if ($key === 'primary_color' && !preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $value)) { + $output->writeln('<error>The given color is invalid: ' . $value . '</error>'); + return 1; + } + + $this->themingDefaults->set($key, $value); + $output->writeln('<info>Updated ' . $key . ' to ' . $value . '</info>'); + + return 0; + } +} diff --git a/apps/theming/lib/Controller/IconController.php b/apps/theming/lib/Controller/IconController.php new file mode 100644 index 00000000000..e82faf78a79 --- /dev/null +++ b/apps/theming/lib/Controller/IconController.php @@ -0,0 +1,168 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Controller; + +use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCA\Theming\IconBuilder; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\OpenAPI; +use OCP\AppFramework\Http\Attribute\PublicPage; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Http\Response; +use OCP\Files\NotFoundException; +use OCP\IRequest; + +class IconController extends Controller { + /** @var FileAccessHelper */ + private $fileAccessHelper; + + public function __construct( + $appName, + IRequest $request, + private ThemingDefaults $themingDefaults, + private IconBuilder $iconBuilder, + private ImageManager $imageManager, + FileAccessHelper $fileAccessHelper, + private IAppManager $appManager, + ) { + parent::__construct($appName, $request); + $this->fileAccessHelper = $fileAccessHelper; + } + + /** + * Get a themed icon + * + * @param string $app ID of the app + * @param string $image image file name (svg required) + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: 'image/svg+xml'}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * @throws \Exception + * + * 200: Themed icon returned + * 404: Themed icon not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getThemedIcon(string $app, string $image): Response { + if ($app !== 'core' && !$this->appManager->isEnabledForUser($app)) { + $app = 'core'; + $image = 'favicon.png'; + } + + $color = $this->themingDefaults->getColorPrimary(); + try { + $iconFileName = $this->imageManager->getCachedImage('icon-' . $app . '-' . $color . str_replace('/', '_', $image)); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->colorSvg($app, $image); + if ($icon === false || $icon === '') { + return new NotFoundResponse(); + } + $iconFileName = $this->imageManager->setCachedImage('icon-' . $app . '-' . $color . str_replace('/', '_', $image), $icon); + } + $response = new FileDisplayResponse($iconFileName, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); + $response->cacheFor(86400, false, true); + return $response; + } + + /** + * Return a 32x32 favicon as png + * + * @param string $app ID of the app + * @return DataDisplayResponse<Http::STATUS_OK, array{Content-Type: 'image/x-icon'}>|FileDisplayResponse<Http::STATUS_OK, array{Content-Type: 'image/x-icon'}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * @throws \Exception + * + * 200: Favicon returned + * 404: Favicon not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getFavicon(string $app = 'core'): Response { + if ($app !== 'core' && !$this->appManager->isEnabledForUser($app)) { + $app = 'core'; + } + + $response = null; + $iconFile = null; + try { + $iconFile = $this->imageManager->getImage('favicon', false); + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + } catch (NotFoundException $e) { + } + if ($iconFile === null && $this->imageManager->shouldReplaceIcons()) { + $color = $this->themingDefaults->getColorPrimary(); + try { + $iconFile = $this->imageManager->getCachedImage('favIcon-' . $app . $color); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->getFavicon($app); + if ($icon === false || $icon === '') { + return new NotFoundResponse(); + } + $iconFile = $this->imageManager->setCachedImage('favIcon-' . $app . $color, $icon); + } + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + } + if ($response === null) { + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon.png'; + $response = new DataDisplayResponse($this->fileAccessHelper->file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + } + $response->cacheFor(86400); + return $response; + } + + /** + * Return a 512x512 icon for touch devices + * + * @param string $app ID of the app + * @return DataDisplayResponse<Http::STATUS_OK, array{Content-Type: 'image/png'}>|FileDisplayResponse<Http::STATUS_OK, array{Content-Type: 'image/x-icon'|'image/png'}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * @throws \Exception + * + * 200: Touch icon returned + * 404: Touch icon not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getTouchIcon(string $app = 'core'): Response { + if ($app !== 'core' && !$this->appManager->isEnabledForUser($app)) { + $app = 'core'; + } + + $response = null; + try { + $iconFile = $this->imageManager->getImage('favicon'); + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + } catch (NotFoundException $e) { + } + if ($this->imageManager->shouldReplaceIcons()) { + $color = $this->themingDefaults->getColorPrimary(); + try { + $iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app . $color); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->getTouchIcon($app); + if ($icon === false || $icon === '') { + return new NotFoundResponse(); + } + $iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app . $color, $icon); + } + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']); + } + if ($response === null) { + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon-touch.png'; + $response = new DataDisplayResponse($this->fileAccessHelper->file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/png']); + } + $response->cacheFor(86400); + return $response; + } +} diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php new file mode 100644 index 00000000000..e5cee254fe8 --- /dev/null +++ b/apps/theming/lib/Controller/ThemingController.php @@ -0,0 +1,498 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Controller; + +use InvalidArgumentException; +use OCA\Theming\ImageManager; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\Settings\Admin; +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; +use OCP\AppFramework\Http\Attribute\BruteForceProtection; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\OpenAPI; +use OCP\AppFramework\Http\Attribute\PublicPage; +use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Services\IAppConfig; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IRequest; +use OCP\IURLGenerator; + +/** + * Class ThemingController + * + * handle ajax requests to update the theme + * + * @package OCA\Theming\Controller + */ +class ThemingController extends Controller { + public const VALID_UPLOAD_KEYS = ['header', 'logo', 'logoheader', 'background', 'favicon']; + + public function __construct( + string $appName, + IRequest $request, + private IConfig $config, + private IAppConfig $appConfig, + private ThemingDefaults $themingDefaults, + private IL10N $l10n, + private IURLGenerator $urlGenerator, + private IAppManager $appManager, + private ImageManager $imageManager, + private ThemesService $themesService, + private INavigationManager $navigationManager, + ) { + parent::__construct($appName, $request); + } + + /** + * @param string $setting + * @param string $value + * @return DataResponse + * @throws NotPermittedException + */ + #[AuthorizedAdminSetting(settings: Admin::class)] + public function updateStylesheet($setting, $value) { + $value = trim($value); + $error = null; + $saved = false; + switch ($setting) { + case 'name': + if (strlen($value) > 250) { + $error = $this->l10n->t('The given name is too long'); + } + break; + case 'url': + if (strlen($value) > 500) { + $error = $this->l10n->t('The given web address is too long'); + } + if (!$this->isValidUrl($value)) { + $error = $this->l10n->t('The given web address is not a valid URL'); + } + break; + case 'imprintUrl': + if (strlen($value) > 500) { + $error = $this->l10n->t('The given legal notice address is too long'); + } + if (!$this->isValidUrl($value)) { + $error = $this->l10n->t('The given legal notice address is not a valid URL'); + } + break; + case 'privacyUrl': + if (strlen($value) > 500) { + $error = $this->l10n->t('The given privacy policy address is too long'); + } + if (!$this->isValidUrl($value)) { + $error = $this->l10n->t('The given privacy policy address is not a valid URL'); + } + break; + case 'slogan': + if (strlen($value) > 500) { + $error = $this->l10n->t('The given slogan is too long'); + } + break; + case 'primary_color': + if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $value)) { + $error = $this->l10n->t('The given color is invalid'); + } else { + $this->appConfig->setAppValueString('primary_color', $value); + $saved = true; + } + break; + case 'background_color': + if (!preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $value)) { + $error = $this->l10n->t('The given color is invalid'); + } else { + $this->appConfig->setAppValueString('background_color', $value); + $saved = true; + } + break; + case 'disable-user-theming': + if (!in_array($value, ['yes', 'true', 'no', 'false'])) { + $error = $this->l10n->t('Disable-user-theming should be true or false'); + } else { + $this->appConfig->setAppValueBool('disable-user-theming', $value === 'yes' || $value === 'true'); + $saved = true; + } + break; + } + if ($error !== null) { + return new DataResponse([ + 'data' => [ + 'message' => $error, + ], + 'status' => 'error' + ], Http::STATUS_BAD_REQUEST); + } + + if (!$saved) { + $this->themingDefaults->set($setting, $value); + } + + return new DataResponse([ + 'data' => [ + 'message' => $this->l10n->t('Saved'), + ], + 'status' => 'success' + ]); + } + + /** + * @param string $setting + * @param mixed $value + * @return DataResponse + * @throws NotPermittedException + */ + #[AuthorizedAdminSetting(settings: Admin::class)] + public function updateAppMenu($setting, $value) { + $error = null; + switch ($setting) { + case 'defaultApps': + if (is_array($value)) { + try { + $this->navigationManager->setDefaultEntryIds($value); + } catch (InvalidArgumentException $e) { + $error = $this->l10n->t('Invalid app given'); + } + } else { + $error = $this->l10n->t('Invalid type for setting "defaultApp" given'); + } + break; + default: + $error = $this->l10n->t('Invalid setting key'); + } + if ($error !== null) { + return new DataResponse([ + 'data' => [ + 'message' => $error, + ], + 'status' => 'error' + ], Http::STATUS_BAD_REQUEST); + } + + return new DataResponse([ + 'data' => [ + 'message' => $this->l10n->t('Saved'), + ], + 'status' => 'success' + ]); + } + + /** + * Check that a string is a valid http/https url. + * Also validates that there is no way for XSS through HTML + */ + private function isValidUrl(string $url): bool { + return ((str_starts_with($url, 'http://') || str_starts_with($url, 'https://')) + && filter_var($url, FILTER_VALIDATE_URL) !== false) + && !str_contains($url, '"'); + } + + /** + * @return DataResponse + * @throws NotPermittedException + */ + #[AuthorizedAdminSetting(settings: Admin::class)] + public function uploadImage(): DataResponse { + $key = $this->request->getParam('key'); + if (!in_array($key, self::VALID_UPLOAD_KEYS, true)) { + return new DataResponse( + [ + 'data' => [ + 'message' => 'Invalid key' + ], + 'status' => 'failure', + ], + Http::STATUS_BAD_REQUEST + ); + } + $image = $this->request->getUploadedFile('image'); + $error = null; + $phpFileUploadErrors = [ + UPLOAD_ERR_OK => $this->l10n->t('The file was uploaded'), + UPLOAD_ERR_INI_SIZE => $this->l10n->t('The uploaded file exceeds the upload_max_filesize directive in php.ini'), + UPLOAD_ERR_FORM_SIZE => $this->l10n->t('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'), + UPLOAD_ERR_PARTIAL => $this->l10n->t('The file was only partially uploaded'), + UPLOAD_ERR_NO_FILE => $this->l10n->t('No file was uploaded'), + UPLOAD_ERR_NO_TMP_DIR => $this->l10n->t('Missing a temporary folder'), + UPLOAD_ERR_CANT_WRITE => $this->l10n->t('Could not write file to disk'), + UPLOAD_ERR_EXTENSION => $this->l10n->t('A PHP extension stopped the file upload'), + ]; + if (empty($image)) { + $error = $this->l10n->t('No file uploaded'); + } + if (!empty($image) && array_key_exists('error', $image) && $image['error'] !== UPLOAD_ERR_OK) { + $error = $phpFileUploadErrors[$image['error']]; + } + + if ($error !== null) { + return new DataResponse( + [ + 'data' => [ + 'message' => $error + ], + 'status' => 'failure', + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + } + + try { + $mime = $this->imageManager->updateImage($key, $image['tmp_name']); + $this->themingDefaults->set($key . 'Mime', $mime); + } catch (\Exception $e) { + return new DataResponse( + [ + 'data' => [ + 'message' => $e->getMessage() + ], + 'status' => 'failure', + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + } + + $name = $image['name']; + + return new DataResponse( + [ + 'data' + => [ + 'name' => $name, + 'url' => $this->imageManager->getImageUrl($key), + 'message' => $this->l10n->t('Saved'), + ], + 'status' => 'success' + ] + ); + } + + /** + * Revert setting to default value + * + * @param string $setting setting which should be reverted + * @return DataResponse + * @throws NotPermittedException + */ + #[AuthorizedAdminSetting(settings: Admin::class)] + public function undo(string $setting): DataResponse { + $value = $this->themingDefaults->undo($setting); + + return new DataResponse( + [ + 'data' + => [ + 'value' => $value, + 'message' => $this->l10n->t('Saved'), + ], + 'status' => 'success' + ] + ); + } + + /** + * Revert all theming settings to their default values + * + * @return DataResponse + * @throws NotPermittedException + */ + #[AuthorizedAdminSetting(settings: Admin::class)] + public function undoAll(): DataResponse { + $this->themingDefaults->undoAll(); + $this->navigationManager->setDefaultEntryIds([]); + + return new DataResponse( + [ + 'data' + => [ + 'message' => $this->l10n->t('Saved'), + ], + 'status' => 'success' + ] + ); + } + + /** + * @NoSameSiteCookieRequired + * + * Get an image + * + * @param string $key Key of the image + * @param bool $useSvg Return image as SVG + * @return FileDisplayResponse<Http::STATUS_OK, array{}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * @throws NotPermittedException + * + * 200: Image returned + * 404: Image not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getImage(string $key, bool $useSvg = true) { + try { + $file = $this->imageManager->getImage($key, $useSvg); + } catch (NotFoundException $e) { + return new NotFoundResponse(); + } + + $response = new FileDisplayResponse($file); + $csp = new ContentSecurityPolicy(); + $csp->allowInlineStyle(); + $response->setContentSecurityPolicy($csp); + $response->cacheFor(3600); + $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, $key . 'Mime', '')); + $response->addHeader('Content-Disposition', 'attachment; filename="' . $key . '"'); + if (!$useSvg) { + $response->addHeader('Content-Type', 'image/png'); + } else { + $response->addHeader('Content-Type', $this->config->getAppValue($this->appName, $key . 'Mime', '')); + } + return $response; + } + + /** + * @NoSameSiteCookieRequired + * @NoTwoFactorRequired + * + * Get the CSS stylesheet for a theme + * + * @param string $themeId ID of the theme + * @param bool $plain Let the browser decide the CSS priority + * @param bool $withCustomCss Include custom CSS + * @return DataDisplayResponse<Http::STATUS_OK, array{Content-Type: 'text/css'}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * + * 200: Stylesheet returned + * 404: Theme not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getThemeStylesheet(string $themeId, bool $plain = false, bool $withCustomCss = false) { + $themes = $this->themesService->getThemes(); + if (!in_array($themeId, array_keys($themes))) { + return new NotFoundResponse(); + } + + $theme = $themes[$themeId]; + $customCss = $theme->getCustomCss(); + + // Generate variables + $variables = ''; + foreach ($theme->getCSSVariables() as $variable => $value) { + $variables .= "$variable:$value; "; + }; + + // If plain is set, the browser decides of the css priority + if ($plain) { + $css = ":root { $variables } " . $customCss; + } else { + // If not set, we'll rely on the body class + // We need to separate @-rules from normal selectors, as they can't be nested + // This is a replacement for the SCSS compiler that did this automatically before f1448fcf0777db7d4254cb0a3ef94d63be9f7a24 + // We need a better way to handle this, but for now we just remove comments and split the at-rules + // from the rest of the CSS. + $customCssWithoutComments = preg_replace('!/\*.*?\*/!s', '', $customCss); + $customCssWithoutComments = preg_replace('!//.*!', '', $customCssWithoutComments); + preg_match_all('/(@[^{]+{(?:[^{}]*|(?R))*})/', $customCssWithoutComments, $atRules); + $atRulesCss = implode('', $atRules[0]); + $scopedCss = preg_replace('/(@[^{]+{(?:[^{}]*|(?R))*})/', '', $customCssWithoutComments); + + $css = "$atRulesCss [data-theme-$themeId] { $variables $scopedCss }"; + } + + try { + $response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']); + $response->cacheFor(86400); + return $response; + } catch (NotFoundException $e) { + return new NotFoundResponse(); + } + } + + /** + * Get the manifest for an app + * + * @param string $app ID of the app + * @psalm-suppress LessSpecificReturnStatement The content of the Manifest doesn't need to be described in the return type + * @return JSONResponse<Http::STATUS_OK, array{name: string, short_name: string, start_url: string, theme_color: string, background_color: string, description: string, icons: list<array{src: non-empty-string, type: string, sizes: string}>, display_override: list<string>, display: string}, array{}>|JSONResponse<Http::STATUS_NOT_FOUND, array{}, array{}> + * + * 200: Manifest returned + * 404: App not found + */ + #[PublicPage] + #[NoCSRFRequired] + #[BruteForceProtection(action: 'manifest')] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getManifest(string $app): JSONResponse { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + if ($app === 'core' || $app === 'settings') { + $name = $this->themingDefaults->getName(); + $shortName = $this->themingDefaults->getName(); + $startUrl = $this->urlGenerator->getBaseUrl(); + $description = $this->themingDefaults->getSlogan(); + } else { + if (!$this->appManager->isEnabledForUser($app)) { + $response = new JSONResponse([], Http::STATUS_NOT_FOUND); + $response->throttle(['action' => 'manifest', 'app' => $app]); + return $response; + } + + $info = $this->appManager->getAppInfo($app, false, $this->l10n->getLanguageCode()); + $name = $info['name'] . ' - ' . $this->themingDefaults->getName(); + $shortName = $info['name']; + if (str_contains($this->request->getRequestUri(), '/index.php/')) { + $startUrl = $this->urlGenerator->getBaseUrl() . '/index.php/apps/' . $app . '/'; + } else { + $startUrl = $this->urlGenerator->getBaseUrl() . '/apps/' . $app . '/'; + } + $description = $info['summary'] ?? ''; + } + /** + * @var string $description + * @var string $shortName + */ + $responseJS = [ + 'name' => $name, + 'short_name' => $shortName, + 'start_url' => $startUrl, + 'theme_color' => $this->themingDefaults->getColorPrimary(), + 'background_color' => $this->themingDefaults->getColorPrimary(), + 'description' => $description, + 'icons' + => [ + [ + 'src' => $this->urlGenerator->linkToRoute('theming.Icon.getTouchIcon', + ['app' => $app]) . '?v=' . $cacheBusterValue, + 'type' => 'image/png', + 'sizes' => '512x512' + ], + [ + 'src' => $this->urlGenerator->linkToRoute('theming.Icon.getFavicon', + ['app' => $app]) . '?v=' . $cacheBusterValue, + 'type' => 'image/svg+xml', + 'sizes' => '16x16' + ] + ], + 'display_override' => [$this->config->getSystemValueBool('theming.standalone_window.enabled', true) ? 'minimal-ui' : ''], + 'display' => $this->config->getSystemValueBool('theming.standalone_window.enabled', true) ? 'standalone' : 'browser' + ]; + $response = new JSONResponse($responseJS); + $response->cacheFor(3600); + return $response; + } +} diff --git a/apps/theming/lib/Controller/UserThemeController.php b/apps/theming/lib/Controller/UserThemeController.php new file mode 100644 index 00000000000..770f2ca922f --- /dev/null +++ b/apps/theming/lib/Controller/UserThemeController.php @@ -0,0 +1,218 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Controller; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ITheme; +use OCA\Theming\ResponseDefinitions; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\OpenAPI; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Http\Response; +use OCP\AppFramework\OCS\OCSBadRequestException; +use OCP\AppFramework\OCS\OCSForbiddenException; +use OCP\AppFramework\OCSController; +use OCP\IConfig; +use OCP\IRequest; +use OCP\IUserSession; +use OCP\PreConditionNotMetException; + +/** + * @psalm-import-type ThemingBackground from ResponseDefinitions + */ +class UserThemeController extends OCSController { + + protected ?string $userId = null; + + public function __construct( + string $appName, + IRequest $request, + private IConfig $config, + IUserSession $userSession, + private ThemesService $themesService, + private ThemingDefaults $themingDefaults, + private BackgroundService $backgroundService, + ) { + parent::__construct($appName, $request); + + $user = $userSession->getUser(); + if ($user !== null) { + $this->userId = $user->getUID(); + } + } + + /** + * Enable theme + * + * @param string $themeId the theme ID + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> + * @throws OCSBadRequestException Enabling theme is not possible + * @throws PreConditionNotMetException + * + * 200: Theme enabled successfully + */ + #[NoAdminRequired] + public function enableTheme(string $themeId): DataResponse { + $theme = $this->validateTheme($themeId); + + // Enable selected theme + $this->themesService->enableTheme($theme); + return new DataResponse(); + } + + /** + * Disable theme + * + * @param string $themeId the theme ID + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> + * @throws OCSBadRequestException Disabling theme is not possible + * @throws PreConditionNotMetException + * + * 200: Theme disabled successfully + */ + #[NoAdminRequired] + public function disableTheme(string $themeId): DataResponse { + $theme = $this->validateTheme($themeId); + + // Enable selected theme + $this->themesService->disableTheme($theme); + return new DataResponse(); + } + + /** + * Validate and return the matching ITheme + * + * Disable theme + * + * @param string $themeId the theme ID + * @return ITheme + * @throws OCSBadRequestException + * @throws PreConditionNotMetException + */ + private function validateTheme(string $themeId): ITheme { + if ($themeId === '' || !$themeId) { + throw new OCSBadRequestException('Invalid theme id: ' . $themeId); + } + + $themes = $this->themesService->getThemes(); + if (!isset($themes[$themeId])) { + throw new OCSBadRequestException('Invalid theme id: ' . $themeId); + } + + // If trying to toggle another theme but this is enforced + if ($this->config->getSystemValueString('enforce_theme', '') !== '' + && $themes[$themeId]->getType() === ITheme::TYPE_THEME) { + throw new OCSForbiddenException('Theme switching is disabled'); + } + + return $themes[$themeId]; + } + + /** + * Get the background image + * @return FileDisplayResponse<Http::STATUS_OK, array{Content-Type: string}>|NotFoundResponse<Http::STATUS_NOT_FOUND, array{}> + * + * 200: Background image returned + * 404: Background image not found + */ + #[NoAdminRequired] + #[NoCSRFRequired] + #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] + public function getBackground(): Response { + $file = $this->backgroundService->getBackground(); + if ($file !== null) { + $response = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $file->getMimeType()]); + $response->cacheFor(24 * 60 * 60, false, true); + return $response; + } + return new NotFoundResponse(); + } + + /** + * Delete the background + * + * @return JSONResponse<Http::STATUS_OK, ThemingBackground, array{}> + * + * 200: Background deleted successfully + */ + #[NoAdminRequired] + public function deleteBackground(): JSONResponse { + $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0'); + $this->backgroundService->deleteBackgroundImage(); + return new JSONResponse([ + 'backgroundImage' => null, + 'backgroundColor' => $this->themingDefaults->getColorBackground(), + 'primaryColor' => $this->themingDefaults->getColorPrimary(), + 'version' => $currentVersion, + ]); + } + + /** + * Set the background + * + * @param string $type Type of background + * @param string $value Path of the background image + * @param string|null $color Color for the background + * @return JSONResponse<Http::STATUS_OK, ThemingBackground, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST|Http::STATUS_INTERNAL_SERVER_ERROR, array{error: string}, array{}> + * + * 200: Background set successfully + * 400: Setting background is not possible + */ + #[NoAdminRequired] + public function setBackground(string $type = BackgroundService::BACKGROUND_DEFAULT, string $value = '', ?string $color = null): JSONResponse { + $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0'); + + // Set color if provided + if ($color) { + $this->backgroundService->setColorBackground($color); + } + + // Set background image if provided + try { + switch ($type) { + case BackgroundService::BACKGROUND_SHIPPED: + $this->backgroundService->setShippedBackground($value); + break; + case BackgroundService::BACKGROUND_CUSTOM: + $this->backgroundService->setFileBackground($value); + break; + case BackgroundService::BACKGROUND_DEFAULT: + // Delete both background and color keys + $this->backgroundService->setDefaultBackground(); + break; + default: + if (!$color) { + return new JSONResponse(['error' => 'Invalid type provided'], Http::STATUS_BAD_REQUEST); + } + } + } catch (\InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } catch (\Throwable $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + $currentVersion++; + $this->config->setUserValue($this->userId, Application::APP_ID, 'userCacheBuster', (string)$currentVersion); + + return new JSONResponse([ + 'backgroundImage' => $this->config->getUserValue($this->userId, Application::APP_ID, 'background_image', BackgroundService::BACKGROUND_DEFAULT), + 'backgroundColor' => $this->themingDefaults->getColorBackground(), + 'primaryColor' => $this->themingDefaults->getColorPrimary(), + 'version' => $currentVersion, + ]); + } +} diff --git a/apps/theming/lib/ITheme.php b/apps/theming/lib/ITheme.php new file mode 100644 index 00000000000..2e40e8e489b --- /dev/null +++ b/apps/theming/lib/ITheme.php @@ -0,0 +1,92 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming; + +/** + * Interface ITheme + * + * @since 25.0.0 + */ +interface ITheme { + + public const TYPE_THEME = 1; + public const TYPE_FONT = 2; + + /** + * Unique theme id + * Will be used to search for ID.png in the img folder + * + * @since 25.0.0 + */ + public function getId(): string; + + /** + * Theme type + * TYPE_THEME or TYPE_FONT + * + * @since 25.0.0 + */ + public function getType(): int; + + /** + * The theme translated title + * + * @since 25.0.0 + */ + public function getTitle(): string; + + /** + * The theme enable checkbox translated label + * + * @since 25.0.0 + */ + public function getEnableLabel(): string; + + /** + * The theme translated description + * + * @since 25.0.0 + */ + public function getDescription(): string; + + /** + * Get the meta attribute matching the theme + * e.g. https://html.spec.whatwg.org/multipage/semantics.html#meta-color-scheme + * @return array{name?: string, content?: string}[] + * @since 29.0.0 + */ + public function getMeta(): array; + + /** + * Get the media query triggering this theme + * Optional, ignored if falsy + * + * @return string + * @since 25.0.0 + */ + public function getMediaQuery(): string; + + /** + * Return the list of changed css variables + * + * @return array + * @since 25.0.0 + */ + public function getCSSVariables(): array; + + /** + * Return the custom css necessary for that app + * ⚠️ Warning, should be used slightly. + * Theoretically, editing the variables should be enough. + * + * @return string + * @since 25.0.0 + */ + public function getCustomCss(): string; +} diff --git a/apps/theming/lib/IconBuilder.php b/apps/theming/lib/IconBuilder.php new file mode 100644 index 00000000000..63f4559970d --- /dev/null +++ b/apps/theming/lib/IconBuilder.php @@ -0,0 +1,208 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming; + +use Imagick; +use ImagickPixel; +use OCP\Files\SimpleFS\ISimpleFile; + +class IconBuilder { + /** + * IconBuilder constructor. + * + * @param ThemingDefaults $themingDefaults + * @param Util $util + * @param ImageManager $imageManager + */ + public function __construct( + private ThemingDefaults $themingDefaults, + private Util $util, + private ImageManager $imageManager, + ) { + } + + /** + * @param $app string app name + * @return string|false image blob + */ + public function getFavicon($app) { + if (!$this->imageManager->shouldReplaceIcons()) { + return false; + } + try { + $favicon = new Imagick(); + $favicon->setFormat('ico'); + $icon = $this->renderAppIcon($app, 128); + if ($icon === false) { + return false; + } + $icon->setImageFormat('png32'); + + $clone = clone $icon; + $clone->scaleImage(16, 0); + $favicon->addImage($clone); + + $clone = clone $icon; + $clone->scaleImage(32, 0); + $favicon->addImage($clone); + + $clone = clone $icon; + $clone->scaleImage(64, 0); + $favicon->addImage($clone); + + $clone = clone $icon; + $clone->scaleImage(128, 0); + $favicon->addImage($clone); + + $data = $favicon->getImagesBlob(); + $favicon->destroy(); + $icon->destroy(); + $clone->destroy(); + return $data; + } catch (\ImagickException $e) { + return false; + } + } + + /** + * @param $app string app name + * @return string|false image blob + */ + public function getTouchIcon($app) { + try { + $icon = $this->renderAppIcon($app, 512); + if ($icon === false) { + return false; + } + $icon->setImageFormat('png32'); + $data = $icon->getImageBlob(); + $icon->destroy(); + return $data; + } catch (\ImagickException $e) { + return false; + } + } + + /** + * Render app icon on themed background color + * fallback to logo + * + * @param string $app app name + * @param int $size size of the icon in px + * @return Imagick|false + */ + public function renderAppIcon($app, $size) { + $appIcon = $this->util->getAppIcon($app); + if ($appIcon instanceof ISimpleFile) { + $appIconContent = $appIcon->getContent(); + $mime = $appIcon->getMimeType(); + } elseif (!file_exists($appIcon)) { + return false; + } else { + $appIconContent = file_get_contents($appIcon); + $mime = mime_content_type($appIcon); + } + + if ($appIconContent === false || $appIconContent === '') { + return false; + } + + $color = $this->themingDefaults->getColorPrimary(); + + // generate background image with rounded corners + $cornerRadius = 0.2 * $size; + $background = '<?xml version="1.0" encoding="UTF-8"?>' + . '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" width="' . $size . '" height="' . $size . '" xmlns:xlink="http://www.w3.org/1999/xlink">' + . '<rect x="0" y="0" rx="' . $cornerRadius . '" ry="' . $cornerRadius . '" width="' . $size . '" height="' . $size . '" style="fill:' . $color . ';" />' + . '</svg>'; + // resize svg magic as this seems broken in Imagemagick + if ($mime === 'image/svg+xml' || substr($appIconContent, 0, 4) === '<svg') { + if (substr($appIconContent, 0, 5) !== '<?xml') { + $svg = '<?xml version="1.0"?>' . $appIconContent; + } else { + $svg = $appIconContent; + } + $tmp = new Imagick(); + $tmp->setBackgroundColor(new ImagickPixel('transparent')); + $tmp->setResolution(72, 72); + $tmp->readImageBlob($svg); + $x = $tmp->getImageWidth(); + $y = $tmp->getImageHeight(); + $tmp->destroy(); + + // convert svg to resized image + $appIconFile = new Imagick(); + $resX = (int)(72 * $size / $x); + $resY = (int)(72 * $size / $y); + $appIconFile->setResolution($resX, $resY); + $appIconFile->setBackgroundColor(new ImagickPixel('transparent')); + $appIconFile->readImageBlob($svg); + + /** + * invert app icons for bright primary colors + * the default nextcloud logo will not be inverted to black + */ + if ($this->util->isBrightColor($color) + && !$appIcon instanceof ISimpleFile + && $app !== 'core' + ) { + $appIconFile->negateImage(false); + } + } else { + $appIconFile = new Imagick(); + $appIconFile->setBackgroundColor(new ImagickPixel('transparent')); + $appIconFile->readImageBlob($appIconContent); + } + // offset for icon positioning + $padding = 0.15; + $border_w = (int)($appIconFile->getImageWidth() * $padding); + $border_h = (int)($appIconFile->getImageHeight() * $padding); + $innerWidth = ($appIconFile->getImageWidth() - $border_w * 2); + $innerHeight = ($appIconFile->getImageHeight() - $border_h * 2); + $appIconFile->adaptiveResizeImage($innerWidth, $innerHeight); + // center icon + $offset_w = (int)($size / 2 - $innerWidth / 2); + $offset_h = (int)($size / 2 - $innerHeight / 2); + + $finalIconFile = new Imagick(); + $finalIconFile->setBackgroundColor(new ImagickPixel('transparent')); + $finalIconFile->readImageBlob($background); + $finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT); + $finalIconFile->setImageArtifact('compose:args', '1,0,-0.5,0.5'); + $finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h); + $finalIconFile->setImageFormat('png24'); + if (defined('Imagick::INTERPOLATE_BICUBIC') === true) { + $filter = Imagick::INTERPOLATE_BICUBIC; + } else { + $filter = Imagick::FILTER_LANCZOS; + } + $finalIconFile->resizeImage($size, $size, $filter, 1, false); + + $appIconFile->destroy(); + return $finalIconFile; + } + + /** + * @param string $app app name + * @param string $image relative path to svg file in app directory + * @return string|false content of a colorized svg file + */ + public function colorSvg($app, $image) { + $imageFile = $this->util->getAppImage($app, $image); + if ($imageFile === false || $imageFile === '' || !file_exists($imageFile)) { + return false; + } + $svg = file_get_contents($imageFile); + if ($svg !== false && $svg !== '') { + $color = $this->util->elementColor($this->themingDefaults->getColorPrimary()); + $svg = $this->util->colorizeSvg($svg, $color); + return $svg; + } else { + return false; + } + } +} diff --git a/apps/theming/lib/ImageManager.php b/apps/theming/lib/ImageManager.php new file mode 100644 index 00000000000..309bf192bc3 --- /dev/null +++ b/apps/theming/lib/ImageManager.php @@ -0,0 +1,388 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Service\BackgroundService; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\ITempManager; +use OCP\IURLGenerator; +use Psr\Log\LoggerInterface; + +class ImageManager { + public const SUPPORTED_IMAGE_KEYS = ['background', 'logo', 'logoheader', 'favicon']; + + public function __construct( + private IConfig $config, + private IAppData $appData, + private IURLGenerator $urlGenerator, + private ICacheFactory $cacheFactory, + private LoggerInterface $logger, + private ITempManager $tempManager, + private BackgroundService $backgroundService, + ) { + } + + /** + * Get a globally defined image (admin theming settings) + * + * @param string $key the image key + * @return string the image url + */ + public function getImageUrl(string $key): string { + $cacheBusterCounter = $this->config->getAppValue(Application::APP_ID, 'cachebuster', '0'); + if ($this->hasImage($key)) { + return $this->urlGenerator->linkToRoute('theming.Theming.getImage', [ 'key' => $key ]) . '?v=' . $cacheBusterCounter; + } elseif ($key === 'backgroundDark' && $this->hasImage('background')) { + // Fall back to light variant + return $this->urlGenerator->linkToRoute('theming.Theming.getImage', [ 'key' => 'background' ]) . '?v=' . $cacheBusterCounter; + } + + switch ($key) { + case 'logo': + case 'logoheader': + case 'favicon': + return $this->urlGenerator->imagePath('core', 'logo/logo.png') . '?v=' . $cacheBusterCounter; + case 'backgroundDark': + case 'background': + // Removing the background defines its mime as 'backgroundColor' + $mimeSetting = $this->config->getAppValue('theming', 'backgroundMime', ''); + if ($mimeSetting !== 'backgroundColor') { + $image = BackgroundService::DEFAULT_BACKGROUND_IMAGE; + if ($key === 'backgroundDark') { + $image = BackgroundService::SHIPPED_BACKGROUNDS[$image]['dark_variant'] ?? $image; + } + return $this->urlGenerator->linkTo(Application::APP_ID, "img/background/$image"); + } + } + return ''; + } + + /** + * Get the absolute url. See getImageUrl + */ + public function getImageUrlAbsolute(string $key): string { + return $this->urlGenerator->getAbsoluteURL($this->getImageUrl($key)); + } + + /** + * @param string $key + * @param bool $useSvg + * @return ISimpleFile + * @throws NotFoundException + * @throws NotPermittedException + */ + public function getImage(string $key, bool $useSvg = true): ISimpleFile { + $mime = $this->config->getAppValue('theming', $key . 'Mime', ''); + $folder = $this->getRootFolder()->getFolder('images'); + + if ($mime === '' || !$folder->fileExists($key)) { + throw new NotFoundException(); + } + + if (!$useSvg && $this->shouldReplaceIcons()) { + if (!$folder->fileExists($key . '.png')) { + try { + $finalIconFile = new \Imagick(); + $finalIconFile->setBackgroundColor('none'); + $finalIconFile->readImageBlob($folder->getFile($key)->getContent()); + $finalIconFile->setImageFormat('png32'); + $pngFile = $folder->newFile($key . '.png'); + $pngFile->putContent($finalIconFile->getImageBlob()); + return $pngFile; + } catch (\ImagickException $e) { + $this->logger->info('The image was requested to be no SVG file, but converting it to PNG failed: ' . $e->getMessage()); + } + } else { + return $folder->getFile($key . '.png'); + } + } + + return $folder->getFile($key); + } + + public function hasImage(string $key): bool { + $mimeSetting = $this->config->getAppValue('theming', $key . 'Mime', ''); + // Removing the background defines its mime as 'backgroundColor' + return $mimeSetting !== '' && $mimeSetting !== 'backgroundColor'; + } + + /** + * @return array<string, array{mime: string, url: string}> + */ + public function getCustomImages(): array { + $images = []; + foreach (self::SUPPORTED_IMAGE_KEYS as $key) { + $images[$key] = [ + 'mime' => $this->config->getAppValue('theming', $key . 'Mime', ''), + 'url' => $this->getImageUrl($key), + ]; + } + return $images; + } + + /** + * Get folder for current theming files + * + * @return ISimpleFolder + * @throws NotPermittedException + */ + public function getCacheFolder(): ISimpleFolder { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + try { + $folder = $this->getRootFolder()->getFolder($cacheBusterValue); + } catch (NotFoundException $e) { + $folder = $this->getRootFolder()->newFolder($cacheBusterValue); + $this->cleanup(); + } + return $folder; + } + + /** + * Get a file from AppData + * + * @param string $filename + * @throws NotFoundException + * @return ISimpleFile + * @throws NotPermittedException + */ + public function getCachedImage(string $filename): ISimpleFile { + $currentFolder = $this->getCacheFolder(); + return $currentFolder->getFile($filename); + } + + /** + * Store a file for theming in AppData + * + * @param string $filename + * @param string $data + * @return ISimpleFile + * @throws NotFoundException + * @throws NotPermittedException + */ + public function setCachedImage(string $filename, string $data): ISimpleFile { + $currentFolder = $this->getCacheFolder(); + if ($currentFolder->fileExists($filename)) { + $file = $currentFolder->getFile($filename); + } else { + $file = $currentFolder->newFile($filename); + } + $file->putContent($data); + return $file; + } + + public function delete(string $key): void { + /* ignore exceptions, since we don't want to fail hard if something goes wrong during cleanup */ + try { + $file = $this->getRootFolder()->getFolder('images')->getFile($key); + $file->delete(); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + } + try { + $file = $this->getRootFolder()->getFolder('images')->getFile($key . '.png'); + $file->delete(); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + } + + if ($key === 'logo') { + $this->config->deleteAppValue('theming', 'logoDimensions'); + } + } + + public function updateImage(string $key, string $tmpFile): string { + $this->delete($key); + + try { + $folder = $this->getRootFolder()->getFolder('images'); + } catch (NotFoundException $e) { + $folder = $this->getRootFolder()->newFolder('images'); + } + + $target = $folder->newFile($key); + $supportedFormats = $this->getSupportedUploadImageFormats($key); + $detectedMimeType = mime_content_type($tmpFile); + if (!in_array($detectedMimeType, $supportedFormats, true)) { + throw new \Exception('Unsupported image type: ' . $detectedMimeType); + } + + if ($key === 'background') { + if ($this->shouldOptimizeBackgroundImage($detectedMimeType, filesize($tmpFile))) { + try { + // Optimize the image since some people may upload images that will be + // either to big or are not progressive rendering. + $newImage = @imagecreatefromstring(file_get_contents($tmpFile)); + if ($newImage === false) { + throw new \Exception('Could not read background image, possibly corrupted.'); + } + + // Preserve transparency + imagesavealpha($newImage, true); + imagealphablending($newImage, true); + + $imageWidth = imagesx($newImage); + $imageHeight = imagesy($newImage); + + /** @var int */ + $newWidth = min(4096, $imageWidth); + $newHeight = intval($imageHeight / ($imageWidth / $newWidth)); + $outputImage = imagescale($newImage, $newWidth, $newHeight); + if ($outputImage === false) { + throw new \Exception('Could not scale uploaded background image.'); + } + + $newTmpFile = $this->tempManager->getTemporaryFile(); + imageinterlace($outputImage, true); + // Keep jpeg images encoded as jpeg + if (str_contains($detectedMimeType, 'image/jpeg')) { + if (!imagejpeg($outputImage, $newTmpFile, 90)) { + throw new \Exception('Could not recompress background image as JPEG'); + } + } else { + if (!imagepng($outputImage, $newTmpFile, 8)) { + throw new \Exception('Could not recompress background image as PNG'); + } + } + $tmpFile = $newTmpFile; + imagedestroy($outputImage); + } catch (\Exception $e) { + if (isset($outputImage) && is_resource($outputImage) || $outputImage instanceof \GdImage) { + imagedestroy($outputImage); + } + + $this->logger->debug($e->getMessage()); + } + } + + // For background images we need to announce it + $this->backgroundService->setGlobalBackground($tmpFile); + } + + $target->putContent(file_get_contents($tmpFile)); + + if ($key === 'logo') { + $content = file_get_contents($tmpFile); + $newImage = @imagecreatefromstring($content); + if ($newImage !== false) { + $this->config->setAppValue('theming', 'logoDimensions', imagesx($newImage) . 'x' . imagesy($newImage)); + } elseif (str_starts_with($detectedMimeType, 'image/svg')) { + $matched = preg_match('/viewbox=["\']\d* \d* (\d*\.?\d*) (\d*\.?\d*)["\']/i', $content, $matches); + if ($matched) { + $this->config->setAppValue('theming', 'logoDimensions', $matches[1] . 'x' . $matches[2]); + } else { + $this->logger->warning('Could not read logo image dimensions to optimize for mail header'); + $this->config->deleteAppValue('theming', 'logoDimensions'); + } + } else { + $this->logger->warning('Could not read logo image dimensions to optimize for mail header'); + $this->config->deleteAppValue('theming', 'logoDimensions'); + } + } + + return $detectedMimeType; + } + + /** + * Decide whether an image benefits from shrinking and reconverting + * + * @param string $mimeType the mime type of the image + * @param int $contentSize size of the image file + * @return bool + */ + private function shouldOptimizeBackgroundImage(string $mimeType, int $contentSize): bool { + // Do not touch SVGs + if (str_contains($mimeType, 'image/svg')) { + return false; + } + // GIF does not benefit from converting + if (str_contains($mimeType, 'image/gif')) { + return false; + } + // WebP also does not benefit from converting + // We could possibly try to convert to progressive image, but normally webP images are quite small + if (str_contains($mimeType, 'image/webp')) { + return false; + } + // As a rule of thumb background images should be max. 150-300 KiB, small images do not benefit from converting + return $contentSize > 150000; + } + + /** + * Returns a list of supported mime types for image uploads. + * "favicon" images are only allowed to be SVG when imagemagick with SVG support is available. + * + * @param string $key The image key, e.g. "favicon" + * @return string[] + */ + public function getSupportedUploadImageFormats(string $key): array { + $supportedFormats = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; + + if ($key !== 'favicon' || $this->shouldReplaceIcons() === true) { + $supportedFormats[] = 'image/svg+xml'; + $supportedFormats[] = 'image/svg'; + } + + if ($key === 'favicon') { + $supportedFormats[] = 'image/x-icon'; + $supportedFormats[] = 'image/vnd.microsoft.icon'; + } + + return $supportedFormats; + } + + /** + * remove cached files that are not required any longer + * + * @throws NotPermittedException + * @throws NotFoundException + */ + public function cleanup() { + $currentFolder = $this->getCacheFolder(); + $folders = $this->getRootFolder()->getDirectoryListing(); + foreach ($folders as $folder) { + if ($folder->getName() !== 'images' && $folder->getName() !== $currentFolder->getName()) { + $folder->delete(); + } + } + } + + /** + * Check if Imagemagick is enabled and if SVG is supported + * otherwise we can't render custom icons + * + * @return bool + */ + public function shouldReplaceIcons() { + $cache = $this->cacheFactory->createDistributed('theming-' . $this->urlGenerator->getBaseUrl()); + if ($value = $cache->get('shouldReplaceIcons')) { + return (bool)$value; + } + $value = false; + if (extension_loaded('imagick')) { + if (count(\Imagick::queryFormats('SVG')) >= 1) { + $value = true; + } + } + $cache->set('shouldReplaceIcons', $value); + return $value; + } + + private function getRootFolder(): ISimpleFolder { + try { + return $this->appData->getFolder('global'); + } catch (NotFoundException $e) { + return $this->appData->newFolder('global'); + } + } +} diff --git a/apps/theming/lib/Jobs/MigrateBackgroundImages.php b/apps/theming/lib/Jobs/MigrateBackgroundImages.php new file mode 100644 index 00000000000..62e58f5e722 --- /dev/null +++ b/apps/theming/lib/Jobs/MigrateBackgroundImages.php @@ -0,0 +1,199 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming\Jobs; + +use OCA\Theming\AppInfo\Application; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; +use OCP\BackgroundJob\QueuedJob; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\Files\AppData\IAppDataFactory; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IDBConnection; +use Psr\Log\LoggerInterface; + +class MigrateBackgroundImages extends QueuedJob { + public const TIME_SENSITIVE = 0; + + public const STAGE_PREPARE = 'prepare'; + public const STAGE_EXECUTE = 'execute'; + // will be saved in appdata/theming/global/ + protected const STATE_FILE_NAME = '25_dashboard_to_theming_migration_users.json'; + + public function __construct( + ITimeFactory $time, + private IAppDataFactory $appDataFactory, + private IJobList $jobList, + private IDBConnection $dbc, + private IAppData $appData, + private LoggerInterface $logger, + ) { + parent::__construct($time); + } + + protected function run(mixed $argument): void { + if (!is_array($argument) || !isset($argument['stage'])) { + throw new \Exception('Job ' . self::class . ' called with wrong argument'); + } + + switch ($argument['stage']) { + case self::STAGE_PREPARE: + $this->runPreparation(); + break; + case self::STAGE_EXECUTE: + $this->runMigration(); + break; + default: + break; + } + } + + protected function runPreparation(): void { + try { + $selector = $this->dbc->getQueryBuilder(); + $result = $selector->select('userid') + ->from('preferences') + ->where($selector->expr()->eq('appid', $selector->createNamedParameter('theming'))) + ->andWhere($selector->expr()->eq('configkey', $selector->createNamedParameter('background'))) + ->andWhere($selector->expr()->eq('configvalue', $selector->createNamedParameter('custom', IQueryBuilder::PARAM_STR), IQueryBuilder::PARAM_STR)) + ->executeQuery(); + + $userIds = $result->fetchAll(\PDO::FETCH_COLUMN); + $this->storeUserIdsToProcess($userIds); + } catch (\Throwable $t) { + $this->jobList->add(self::class, ['stage' => self::STAGE_PREPARE]); + throw $t; + } + $this->jobList->add(self::class, ['stage' => self::STAGE_EXECUTE]); + } + + /** + * @throws NotPermittedException + * @throws NotFoundException + */ + protected function runMigration(): void { + $allUserIds = $this->readUserIdsToProcess(); + $notSoFastMode = count($allUserIds) > 5000; + $dashboardData = $this->appDataFactory->get('dashboard'); + + $userIds = $notSoFastMode ? array_slice($allUserIds, 0, 5000) : $allUserIds; + foreach ($userIds as $userId) { + try { + // migration + $file = $dashboardData->getFolder($userId)->getFile('background.jpg'); + $targetDir = $this->getUserFolder($userId); + + if (!$targetDir->fileExists('background.jpg')) { + $targetDir->newFile('background.jpg', $file->getContent()); + } + $file->delete(); + } catch (NotFoundException|NotPermittedException $e) { + } + } + + if ($notSoFastMode) { + $remainingUserIds = array_slice($allUserIds, 5000); + $this->storeUserIdsToProcess($remainingUserIds); + $this->jobList->add(self::class, ['stage' => self::STAGE_EXECUTE]); + } else { + $this->deleteStateFile(); + } + } + + /** + * @throws NotPermittedException + * @throws NotFoundException + */ + protected function readUserIdsToProcess(): array { + $globalFolder = $this->appData->getFolder('global'); + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + try { + $userIds = \json_decode($file->getContent(), true); + } catch (NotFoundException $e) { + $userIds = []; + } + if ($userIds === null) { + $userIds = []; + } + } else { + $userIds = []; + } + return $userIds; + } + + /** + * @throws NotFoundException + */ + protected function storeUserIdsToProcess(array $userIds): void { + $storableUserIds = \json_encode($userIds); + $globalFolder = $this->appData->getFolder('global'); + try { + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + } else { + $file = $globalFolder->newFile(self::STATE_FILE_NAME); + } + $file->putContent($storableUserIds); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + $this->logger->warning('Lacking permissions to create {file}', + [ + 'app' => 'theming', + 'file' => self::STATE_FILE_NAME, + 'exception' => $e, + ] + ); + } + } + + /** + * @throws NotFoundException + */ + protected function deleteStateFile(): void { + $globalFolder = $this->appData->getFolder('global'); + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + try { + $file->delete(); + } catch (NotPermittedException $e) { + $this->logger->info('Could not delete {file} due to permissions. It is safe to delete manually inside data -> appdata -> theming -> global.', + [ + 'app' => 'theming', + 'file' => $file->getName(), + 'exception' => $e, + ] + ); + } + } + } + + /** + * Get the root location for users theming data + */ + protected function getUserFolder(string $userId): ISimpleFolder { + $themingData = $this->appDataFactory->get(Application::APP_ID); + + try { + $rootFolder = $themingData->getFolder('users'); + } catch (NotFoundException $e) { + $rootFolder = $themingData->newFolder('users'); + } + + try { + return $rootFolder->getFolder($userId); + } catch (NotFoundException $e) { + return $rootFolder->newFolder($userId); + } + } +} diff --git a/apps/theming/lib/Jobs/RestoreBackgroundImageColor.php b/apps/theming/lib/Jobs/RestoreBackgroundImageColor.php new file mode 100644 index 00000000000..42662dacef2 --- /dev/null +++ b/apps/theming/lib/Jobs/RestoreBackgroundImageColor.php @@ -0,0 +1,205 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming\Jobs; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Service\BackgroundService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; +use OCP\BackgroundJob\QueuedJob; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\IConfig; +use OCP\IDBConnection; +use Psr\Log\LoggerInterface; + +class RestoreBackgroundImageColor extends QueuedJob { + + public const STAGE_PREPARE = 'prepare'; + public const STAGE_EXECUTE = 'execute'; + // will be saved in appdata/theming/global/ + protected const STATE_FILE_NAME = '30_background_image_color_restoration.json'; + + public function __construct( + ITimeFactory $time, + private IConfig $config, + private IAppData $appData, + private IJobList $jobList, + private IDBConnection $dbc, + private LoggerInterface $logger, + private BackgroundService $service, + ) { + parent::__construct($time); + } + + protected function run(mixed $argument): void { + if (!is_array($argument) || !isset($argument['stage'])) { + throw new \Exception('Job ' . self::class . ' called with wrong argument'); + } + + switch ($argument['stage']) { + case self::STAGE_PREPARE: + $this->runPreparation(); + break; + case self::STAGE_EXECUTE: + $this->runMigration(); + break; + default: + break; + } + } + + protected function runPreparation(): void { + try { + $qb = $this->dbc->getQueryBuilder(); + $qb2 = $this->dbc->getQueryBuilder(); + + $innerSQL = $qb2->select('userid') + ->from('preferences') + ->where($qb2->expr()->eq('configkey', $qb->createNamedParameter('background_color'))); + + // Get those users, that have a background_image set - not the default, but no background_color. + $result = $qb->selectDistinct('a.userid') + ->from('preferences', 'a') + ->leftJoin('a', $qb->createFunction('(' . $innerSQL->getSQL() . ')'), 'b', 'a.userid = b.userid') + ->where($qb2->expr()->eq('a.configkey', $qb->createNamedParameter('background_image'))) + ->andWhere($qb2->expr()->neq('a.configvalue', $qb->createNamedParameter(BackgroundService::BACKGROUND_DEFAULT))) + ->andWhere($qb2->expr()->isNull('b.userid')) + ->executeQuery(); + + $userIds = $result->fetchAll(\PDO::FETCH_COLUMN); + $this->logger->info('Prepare to restore background information for {users} users', ['users' => count($userIds)]); + $this->storeUserIdsToProcess($userIds); + } catch (\Throwable $t) { + $this->jobList->add(self::class, ['stage' => self::STAGE_PREPARE]); + throw $t; + } + $this->jobList->add(self::class, ['stage' => self::STAGE_EXECUTE]); + } + + /** + * @throws NotPermittedException + * @throws NotFoundException + */ + protected function runMigration(): void { + $allUserIds = $this->readUserIdsToProcess(); + $notSoFastMode = count($allUserIds) > 1000; + + $userIds = array_slice($allUserIds, 0, 1000); + foreach ($userIds as $userId) { + $backgroundColor = $this->config->getUserValue($userId, Application::APP_ID, 'background_color'); + if ($backgroundColor !== '') { + continue; + } + + $background = $this->config->getUserValue($userId, Application::APP_ID, 'background_image'); + switch ($background) { + case BackgroundService::BACKGROUND_DEFAULT: + $this->service->setDefaultBackground($userId); + break; + case BackgroundService::BACKGROUND_COLOR: + break; + case BackgroundService::BACKGROUND_CUSTOM: + $this->service->recalculateMeanColor($userId); + break; + default: + // shipped backgrounds + // do not alter primary color + $primary = $this->config->getUserValue($userId, Application::APP_ID, 'primary_color'); + if (isset(BackgroundService::SHIPPED_BACKGROUNDS[$background])) { + $this->service->setShippedBackground($background, $userId); + } else { + $this->service->setDefaultBackground($userId); + } + // Restore primary + if ($primary !== '') { + $this->config->setUserValue($userId, Application::APP_ID, 'primary_color', $primary); + } + } + } + + if ($notSoFastMode) { + $remainingUserIds = array_slice($allUserIds, 1000); + $this->storeUserIdsToProcess($remainingUserIds); + $this->jobList->add(self::class, ['stage' => self::STAGE_EXECUTE]); + } else { + $this->deleteStateFile(); + } + } + + /** + * @throws NotPermittedException + * @throws NotFoundException + */ + protected function readUserIdsToProcess(): array { + $globalFolder = $this->appData->getFolder('global'); + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + try { + $userIds = \json_decode($file->getContent(), true); + } catch (NotFoundException $e) { + $userIds = []; + } + if ($userIds === null) { + $userIds = []; + } + } else { + $userIds = []; + } + return $userIds; + } + + /** + * @throws NotFoundException + */ + protected function storeUserIdsToProcess(array $userIds): void { + $storableUserIds = \json_encode($userIds); + $globalFolder = $this->appData->getFolder('global'); + try { + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + } else { + $file = $globalFolder->newFile(self::STATE_FILE_NAME); + } + $file->putContent($storableUserIds); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + $this->logger->warning('Lacking permissions to create {file}', + [ + 'app' => 'theming', + 'file' => self::STATE_FILE_NAME, + 'exception' => $e, + ] + ); + } + } + + /** + * @throws NotFoundException + */ + protected function deleteStateFile(): void { + $globalFolder = $this->appData->getFolder('global'); + if ($globalFolder->fileExists(self::STATE_FILE_NAME)) { + $file = $globalFolder->getFile(self::STATE_FILE_NAME); + try { + $file->delete(); + } catch (NotPermittedException $e) { + $this->logger->info('Could not delete {file} due to permissions. It is safe to delete manually inside data -> appdata -> theming -> global.', + [ + 'app' => 'theming', + 'file' => $file->getName(), + 'exception' => $e, + ] + ); + } + } + } +} diff --git a/apps/theming/lib/Listener/BeforePreferenceListener.php b/apps/theming/lib/Listener/BeforePreferenceListener.php new file mode 100644 index 00000000000..048deae50ce --- /dev/null +++ b/apps/theming/lib/Listener/BeforePreferenceListener.php @@ -0,0 +1,98 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Listener; + +use OCA\Theming\AppInfo\Application; +use OCP\App\IAppManager; +use OCP\Config\BeforePreferenceDeletedEvent; +use OCP\Config\BeforePreferenceSetEvent; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; + +/** @template-implements IEventListener<BeforePreferenceDeletedEvent|BeforePreferenceSetEvent> */ +class BeforePreferenceListener implements IEventListener { + + /** + * @var string[] + */ + private const ALLOWED_KEYS = ['force_enable_blur_filter', 'shortcuts_disabled', 'primary_color']; + + public function __construct( + private IAppManager $appManager, + ) { + } + + public function handle(Event $event): void { + if (!$event instanceof BeforePreferenceSetEvent + && !$event instanceof BeforePreferenceDeletedEvent) { + // Invalid event type + return; + } + + switch ($event->getAppId()) { + case Application::APP_ID: $this->handleThemingValues($event); + break; + case 'core': $this->handleCoreValues($event); + break; + } + } + + private function handleThemingValues(BeforePreferenceSetEvent|BeforePreferenceDeletedEvent $event): void { + if (!in_array($event->getConfigKey(), self::ALLOWED_KEYS)) { + // Not allowed config key + return; + } + + if ($event instanceof BeforePreferenceSetEvent) { + switch ($event->getConfigKey()) { + case 'force_enable_blur_filter': + $event->setValid($event->getConfigValue() === 'yes' || $event->getConfigValue() === 'no'); + break; + case 'shortcuts_disabled': + $event->setValid($event->getConfigValue() === 'yes'); + break; + case 'primary_color': + $event->setValid(preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $event->getConfigValue()) === 1); + break; + default: + $event->setValid(false); + } + return; + } + + $event->setValid(true); + } + + private function handleCoreValues(BeforePreferenceSetEvent|BeforePreferenceDeletedEvent $event): void { + if ($event->getConfigKey() !== 'apporder') { + // Not allowed config key + return; + } + + if ($event instanceof BeforePreferenceDeletedEvent) { + $event->setValid(true); + return; + } + + $value = json_decode($event->getConfigValue(), true, flags:JSON_THROW_ON_ERROR); + if (!is_array(($value))) { + // Must be an array + return; + } + + foreach ($value as $id => $info) { + // required format: [ navigation_id: string => [ order: int, app?: string ] ] + if (!is_string($id) || !is_array($info) || empty($info) || !isset($info['order']) || !is_numeric($info['order']) || (isset($info['app']) && !$this->appManager->isEnabledForUser($info['app']))) { + // Invalid config value, refuse the change + return; + } + } + $event->setValid(true); + } +} diff --git a/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php b/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php new file mode 100644 index 00000000000..18ab9392b97 --- /dev/null +++ b/apps/theming/lib/Listener/BeforeTemplateRenderedListener.php @@ -0,0 +1,59 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Listener; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Service\JSDataService; +use OCA\Theming\Service\ThemeInjectionService; +use OCP\AppFramework\Http\Events\BeforeLoginTemplateRenderedEvent; +use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IConfig; +use OCP\IUserSession; +use OCP\Util; +use Psr\Container\ContainerInterface; + +/** @template-implements IEventListener<BeforeTemplateRenderedEvent|BeforeLoginTemplateRenderedEvent> */ +class BeforeTemplateRenderedListener implements IEventListener { + + public function __construct( + private IInitialState $initialState, + private ContainerInterface $container, + private ThemeInjectionService $themeInjectionService, + private IUserSession $userSession, + private IConfig $config, + ) { + } + + public function handle(Event $event): void { + $this->initialState->provideLazyInitialState( + 'data', + fn () => $this->container->get(JSDataService::class), + ); + + /** @var BeforeTemplateRenderedEvent|BeforeLoginTemplateRenderedEvent $event */ + if ($event->getResponse()->getRenderAs() === TemplateResponse::RENDER_AS_USER) { + $this->initialState->provideLazyInitialState('shortcutsDisabled', function () { + if ($this->userSession->getUser()) { + $uid = $this->userSession->getUser()->getUID(); + return $this->config->getUserValue($uid, Application::APP_ID, 'shortcuts_disabled', 'no') === 'yes'; + } + return false; + }); + } + + $this->themeInjectionService->injectHeaders(); + + // Making sure to inject just after core + Util::addScript('theming', 'theming', 'core'); + } +} diff --git a/apps/theming/lib/Migration/InitBackgroundImagesMigration.php b/apps/theming/lib/Migration/InitBackgroundImagesMigration.php new file mode 100644 index 00000000000..dea1bb3aa83 --- /dev/null +++ b/apps/theming/lib/Migration/InitBackgroundImagesMigration.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming\Migration; + +use OCA\Theming\Jobs\MigrateBackgroundImages; +use OCP\BackgroundJob\IJobList; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class InitBackgroundImagesMigration implements IRepairStep { + + public function __construct( + private IJobList $jobList, + ) { + } + + public function getName() { + return 'Initialize migration of background images from dashboard to theming app'; + } + + public function run(IOutput $output) { + $this->jobList->add(MigrateBackgroundImages::class, ['stage' => MigrateBackgroundImages::STAGE_PREPARE]); + } +} diff --git a/apps/theming/lib/Migration/Version2006Date20240905111627.php b/apps/theming/lib/Migration/Version2006Date20240905111627.php new file mode 100644 index 00000000000..8f4130cba46 --- /dev/null +++ b/apps/theming/lib/Migration/Version2006Date20240905111627.php @@ -0,0 +1,127 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming\Migration; + +use Closure; +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Jobs\RestoreBackgroundImageColor; +use OCP\BackgroundJob\IJobList; +use OCP\IAppConfig; +use OCP\IDBConnection; +use OCP\Migration\IMigrationStep; +use OCP\Migration\IOutput; + +// This can only be executed once because `background_color` is again used with Nextcloud 30, +// so this part only works when updating -> Nextcloud 29 -> 30 +class Version2006Date20240905111627 implements IMigrationStep { + + public function __construct( + private IJobList $jobList, + private IAppConfig $appConfig, + private IDBConnection $connection, + ) { + } + + public function name(): string { + return 'Restore custom primary color'; + } + + public function description(): string { + return 'Restore custom primary color after separating primary color from background color'; + } + + public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + // nop + } + + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) { + $this->restoreSystemColors($output); + + $userThemingEnabled = $this->appConfig->getValueBool('theming', 'disable-user-theming') === false; + if ($userThemingEnabled) { + $this->restoreUserColors($output); + } + + return null; + } + + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + $output->info('Initialize restoring of background colors for custom background images'); + // This is done in a background job as this can take a lot of time for large instances + $this->jobList->add(RestoreBackgroundImageColor::class, ['stage' => RestoreBackgroundImageColor::STAGE_PREPARE]); + } + + private function restoreSystemColors(IOutput $output): void { + $defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'color', ''); + if ($defaultColor === '') { + $output->info('No custom system color configured - skipping'); + } else { + // Restore legacy value into new field + $this->appConfig->setValueString(Application::APP_ID, 'background_color', $defaultColor); + $this->appConfig->setValueString(Application::APP_ID, 'primary_color', $defaultColor); + // Delete legacy field + $this->appConfig->deleteKey(Application::APP_ID, 'color'); + // give some feedback + $output->info('Global primary color restored'); + } + } + + private function restoreUserColors(IOutput $output): void { + $output->info('Restoring user primary color'); + // For performance let the DB handle this + $qb = $this->connection->getQueryBuilder(); + // Rename the `background_color` config to `primary_color` as this was the behavior on Nextcloud 29 and older + // with Nextcloud 30 `background_color` is a new option to define the background color independent of the primary color. + $qb->update('preferences') + ->set('configkey', $qb->createNamedParameter('primary_color')) + ->where($qb->expr()->eq('appid', $qb->createNamedParameter(Application::APP_ID))) + ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('background_color'))); + + try { + $qb->executeStatement(); + } catch (\Exception) { + $output->debug('Some users already configured the background color'); + $this->restoreUserColorsFallback($output); + } + + $output->info('Primary color of users restored'); + } + + /** + * Similar to restoreUserColors but also works if some users already setup a new value. + * This is only called if the first approach fails as this takes much longer on the DB. + */ + private function restoreUserColorsFallback(IOutput $output): void { + $qb = $this->connection->getQueryBuilder(); + $qb2 = $this->connection->getQueryBuilder(); + + $qb2->select('userid') + ->from('preferences') + ->where($qb->expr()->eq('appid', $qb->createNamedParameter(Application::APP_ID))) + ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('primary_color'))); + + // MySQL does not update on select of the same table, so this is a workaround: + if ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_MYSQL) { + $subquery = 'SELECT * from ( ' . $qb2->getSQL() . ' ) preferences_alias'; + } else { + $subquery = $qb2->getSQL(); + } + + $qb->update('preferences') + ->set('configkey', $qb->createNamedParameter('primary_color')) + ->where($qb->expr()->eq('appid', $qb->createNamedParameter(Application::APP_ID))) + ->andWhere( + $qb->expr()->eq('configkey', $qb->createNamedParameter('background_color')), + $qb->expr()->notIn('userid', $qb->createFunction($subquery)), + ); + + $qb->executeStatement(); + } +} diff --git a/apps/theming/lib/ResponseDefinitions.php b/apps/theming/lib/ResponseDefinitions.php new file mode 100644 index 00000000000..948fc792133 --- /dev/null +++ b/apps/theming/lib/ResponseDefinitions.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming; + +/** + * @psalm-type ThemingBackground = array{ + * backgroundImage: ?string, + * backgroundColor: string, + * primaryColor: string, + * version: int, + * } + */ +class ResponseDefinitions { +} diff --git a/apps/theming/lib/Service/BackgroundService.php b/apps/theming/lib/Service/BackgroundService.php new file mode 100644 index 00000000000..ee9466c3a36 --- /dev/null +++ b/apps/theming/lib/Service/BackgroundService.php @@ -0,0 +1,414 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Service; + +use InvalidArgumentException; +use OC\User\NoUserException; +use OCA\Theming\AppInfo\Application; +use OCP\Files\File; +use OCP\Files\IAppData; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IAppConfig; +use OCP\IConfig; +use OCP\Image; +use OCP\Lock\LockedException; +use OCP\PreConditionNotMetException; +use RuntimeException; + +class BackgroundService { + public const DEFAULT_COLOR = '#00679e'; + public const DEFAULT_BACKGROUND_COLOR = '#00679e'; + + /** + * One of our shipped background images is used + */ + public const BACKGROUND_SHIPPED = 'shipped'; + /** + * A custom background image is used + */ + public const BACKGROUND_CUSTOM = 'custom'; + /** + * The default background image is used + */ + public const BACKGROUND_DEFAULT = 'default'; + /** + * Just a background color is used + */ + public const BACKGROUND_COLOR = 'color'; + + public const DEFAULT_BACKGROUND_IMAGE = 'jenna-kim-the-globe.webp'; + + /** + * 'attribution': Name, artist and license + * 'description': Alternative text + * 'attribution_url': URL for attribution + * 'background_color': Cached mean color of the top part to calculate app menu colors and use as fallback + * 'primary_color': Recommended primary color for this theme / image + */ + public const SHIPPED_BACKGROUNDS = [ + 'jenna-kim-the-globe.webp' => [ + 'attribution' => 'Globe (Jenna Kim - Nextcloud GmbH, CC-BY-SA-4.0)', + 'description' => 'Background picture of white clouds on in front of a blue sky', + 'attribution_url' => 'https://nextcloud.com/trademarks/', + 'dark_variant' => 'jenna-kim-the-globe-dark.webp', + 'background_color' => self::DEFAULT_BACKGROUND_COLOR, + 'primary_color' => self::DEFAULT_COLOR, + ], + 'kamil-porembinski-clouds.jpg' => [ + 'attribution' => 'Clouds (Kamil Porembiński, CC BY-SA)', + 'description' => 'Background picture of white clouds on in front of a blue sky', + 'attribution_url' => 'https://www.flickr.com/photos/paszczak000/8715851521/', + 'background_color' => self::DEFAULT_BACKGROUND_COLOR, + 'primary_color' => self::DEFAULT_COLOR, + ], + 'hannah-maclean-soft-floral.jpg' => [ + 'attribution' => 'Soft floral (Hannah MacLean, CC0)', + 'description' => 'Abstract background picture in yellow and white color whith a flower on it', + 'attribution_url' => 'https://stocksnap.io/photo/soft-floral-XOYWCCW5PA', + 'background_color' => '#e4d2c1', + 'primary_color' => '#9f652f', + ], + 'ted-moravec-morning-fog.jpg' => [ + 'attribution' => 'Morning fog (Ted Moravec, Public Domain)', + 'description' => 'Background picture of a forest shrouded in fog', + 'attribution_url' => 'https://flickr.com/photos/tmoravec/52392410261', + 'background_color' => '#f6f7f6', + 'primary_color' => '#114c3b', + ], + 'stefanus-martanto-setyo-husodo-underwater-ocean.jpg' => [ + 'attribution' => 'Underwater ocean (Stefanus Martanto Setyo Husodo, CC0)', + 'description' => 'Background picture of an underwater ocean', + 'attribution_url' => 'https://stocksnap.io/photo/underwater-ocean-TJA9LBH4WS', + 'background_color' => '#003351', + 'primary_color' => '#04577e', + ], + 'zoltan-voros-rhythm-and-blues.jpg' => [ + 'attribution' => 'Rhythm and blues (Zoltán Vörös, CC BY)', + 'description' => 'Abstract background picture of sand dunes during night', + 'attribution_url' => 'https://flickr.com/photos/v923z/51634409289/', + 'background_color' => '#1c2437', + 'primary_color' => '#1c243c', + ], + 'anatoly-mikhaltsov-butterfly-wing-scale.jpg' => [ + 'attribution' => 'Butterfly wing scale (Anatoly Mikhaltsov, CC BY-SA)', + 'description' => 'Background picture of a red-ish butterfly wing under microscope', + 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:%D0%A7%D0%B5%D1%88%D1%83%D0%B9%D0%BA%D0%B8_%D0%BA%D1%80%D1%8B%D0%BB%D0%B0_%D0%B1%D0%B0%D0%B1%D0%BE%D1%87%D0%BA%D0%B8.jpg', + 'background_color' => '#652e11', + 'primary_color' => '#a53c17', + ], + 'bernie-cetonia-aurata-take-off-composition.jpg' => [ + 'attribution' => 'Cetonia aurata take off composition (Bernie, Public Domain)', + 'description' => 'Montage of a cetonia aurata bug that takes off with white background', + 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:Cetonia_aurata_take_off_composition_05172009.jpg', + 'background_color' => '#dee0d3', + 'primary_color' => '#56633d', + ], + 'dejan-krsmanovic-ribbed-red-metal.jpg' => [ + 'attribution' => 'Ribbed red metal (Dejan Krsmanovic, CC BY)', + 'description' => 'Abstract background picture of red ribbed metal with two horizontal white elements on top of it', + 'attribution_url' => 'https://www.flickr.com/photos/dejankrsmanovic/42971456774/', + 'background_color' => '#9b171c', + 'primary_color' => '#9c4236', + ], + 'eduardo-neves-pedra-azul.jpg' => [ + 'attribution' => 'Pedra azul milky way (Eduardo Neves, CC BY-SA)', + 'description' => 'Background picture of the milky way during night with a mountain in front of it', + 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:Pedra_Azul_Milky_Way.jpg', + 'background_color' => '#1d242d', + 'primary_color' => '#4f6071', + ], + 'european-space-agency-barents-bloom.jpg' => [ + 'attribution' => 'Barents bloom (European Space Agency, CC BY-SA)', + 'description' => 'Abstract background picture of blooming barents in blue and green colors', + 'attribution_url' => 'https://www.esa.int/ESA_Multimedia/Images/2016/08/Barents_bloom', + 'background_color' => '#1c383d', + 'primary_color' => '#396475', + ], + 'hannes-fritz-flippity-floppity.jpg' => [ + 'attribution' => 'Flippity floppity (Hannes Fritz, CC BY-SA)', + 'description' => 'Abstract background picture of many pairs of flip flops hanging on a wall in multiple colors', + 'attribution_url' => 'http://hannes.photos/flippity-floppity', + 'background_color' => '#5b2d53', + 'primary_color' => '#98415a', + ], + 'hannes-fritz-roulette.jpg' => [ + 'attribution' => 'Roulette (Hannes Fritz, CC BY-SA)', + 'description' => 'Background picture of a rotating giant wheel during night', + 'attribution_url' => 'http://hannes.photos/roulette', + 'background_color' => '#000000', + 'primary_color' => '#845334', + ], + 'hannes-fritz-sea-spray.jpg' => [ + 'attribution' => 'Sea spray (Hannes Fritz, CC BY-SA)', + 'description' => 'Background picture of a stone coast with fog and sea behind it', + 'attribution_url' => 'http://hannes.photos/sea-spray', + 'background_color' => '#333f47', + 'primary_color' => '#4f6071', + ], + 'bernard-spragg-new-zealand-fern.jpg' => [ + 'attribution' => 'New zealand fern (Bernard Spragg, CC0)', + 'description' => 'Abstract background picture of fern leafes', + 'attribution_url' => 'https://commons.wikimedia.org/wiki/File:NZ_Fern.(Blechnum_chambersii)_(11263534936).jpg', + 'background_color' => '#0c3c03', + 'primary_color' => '#316b26', + ], + 'rawpixel-pink-tapioca-bubbles.jpg' => [ + 'attribution' => 'Pink tapioca bubbles (Rawpixel, CC BY)', + 'description' => 'Abstract background picture of pink tapioca bubbles', + 'attribution_url' => 'https://www.flickr.com/photos/byrawpixel/27665140298/in/photostream/', + 'background_color' => '#c56e95', + 'primary_color' => '#7b4e7e', + ], + 'nasa-waxing-crescent-moon.jpg' => [ + 'attribution' => 'Waxing crescent moon (NASA, Public Domain)', + 'description' => 'Background picture of glowing earth in foreground and moon in the background', + 'attribution_url' => 'https://www.nasa.gov/image-feature/a-waxing-crescent-moon', + 'background_color' => '#000002', + 'primary_color' => '#005ac1', + ], + 'tommy-chau-already.jpg' => [ + 'attribution' => 'Cityscape (Tommy Chau, CC BY)', + 'description' => 'Background picture of a skyscraper city during night', + 'attribution_url' => 'https://www.flickr.com/photos/90975693@N05/16910999368', + 'background_color' => '#35229f', + 'primary_color' => '#6a2af4', + ], + 'tommy-chau-lion-rock-hill.jpg' => [ + 'attribution' => 'Lion rock hill (Tommy Chau, CC BY)', + 'description' => 'Background picture of mountains during sunset or sunrise', + 'attribution_url' => 'https://www.flickr.com/photos/90975693@N05/17136440246', + 'background_color' => '#cb92b7', + 'primary_color' => '#7f4f70', + ], + 'lali-masriera-yellow-bricks.jpg' => [ + 'attribution' => 'Yellow bricks (Lali Masriera, CC BY)', + 'description' => 'Background picture of yellow bricks with some yellow tubes', + 'attribution_url' => 'https://www.flickr.com/photos/visualpanic/3982464447', + 'background_color' => '#c78a19', + 'primary_color' => '#7f5700', + ], + ]; + + public function __construct( + private IRootFolder $rootFolder, + private IAppData $appData, + private IAppConfig $appConfig, + private IConfig $config, + private ?string $userId, + ) { + } + + public function setDefaultBackground(?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + + $this->config->deleteUserValue($userId, Application::APP_ID, 'background_image'); + $this->config->deleteUserValue($userId, Application::APP_ID, 'background_color'); + $this->config->deleteUserValue($userId, Application::APP_ID, 'primary_color'); + } + + /** + * @param $path + * @throws NotFoundException + * @throws NotPermittedException + * @throws LockedException + * @throws PreConditionNotMetException + * @throws NoUserException + */ + public function setFileBackground(string $path, ?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + $userFolder = $this->rootFolder->getUserFolder($userId); + + /** @var File $file */ + $file = $userFolder->get($path); + $handle = $file->fopen('r'); + if ($handle === false) { + throw new InvalidArgumentException('Invalid image file'); + } + $this->getAppDataFolder()->newFile('background.jpg', $handle); + + $this->recalculateMeanColor(); + } + + public function recalculateMeanColor(?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + + $image = new Image(); + $handle = $this->getAppDataFolder($userId)->getFile('background.jpg')->read(); + if ($handle === false || $image->loadFromFileHandle($handle) === false) { + throw new InvalidArgumentException('Invalid image file'); + } + + $meanColor = $this->calculateMeanColor($image); + if ($meanColor !== false) { + $this->setColorBackground($meanColor); + } + $this->config->setUserValue($userId, Application::APP_ID, 'background_image', self::BACKGROUND_CUSTOM); + } + + /** + * Set background of user to a shipped background identified by the filename + * @param string $filename The shipped background filename + * @param null|string $userId The user to set - defaults to currently logged in user + * @throws RuntimeException If neither $userId is specified nor a user is logged in + * @throws InvalidArgumentException If the specified filename does not match any shipped background + */ + public function setShippedBackground(string $filename, ?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + + if (!array_key_exists($filename, self::SHIPPED_BACKGROUNDS)) { + throw new InvalidArgumentException('The given file name is invalid'); + } + $this->setColorBackground(self::SHIPPED_BACKGROUNDS[$filename]['background_color'], $userId); + $this->config->setUserValue($userId, Application::APP_ID, 'background_image', $filename); + $this->config->setUserValue($userId, Application::APP_ID, 'primary_color', self::SHIPPED_BACKGROUNDS[$filename]['primary_color']); + } + + /** + * Set the background to color only + * @param string|null $userId The user to set the color - default to current logged-in user + */ + public function setColorBackground(string $color, ?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + + if (!preg_match('/^#([0-9a-f]{3}|[0-9a-f]{6})$/i', $color)) { + throw new InvalidArgumentException('The given color is invalid'); + } + $this->config->setUserValue($userId, Application::APP_ID, 'background_color', $color); + $this->config->setUserValue($userId, Application::APP_ID, 'background_image', self::BACKGROUND_COLOR); + } + + public function deleteBackgroundImage(?string $userId = null): void { + $userId = $userId ?? $this->getUserId(); + $this->config->setUserValue($userId, Application::APP_ID, 'background_image', self::BACKGROUND_COLOR); + } + + public function getBackground(?string $userId = null): ?ISimpleFile { + $userId = $userId ?? $this->getUserId(); + $background = $this->config->getUserValue($userId, Application::APP_ID, 'background_image', self::BACKGROUND_DEFAULT); + if ($background === self::BACKGROUND_CUSTOM) { + try { + return $this->getAppDataFolder()->getFile('background.jpg'); + } catch (NotFoundException|NotPermittedException $e) { + return null; + } + } + return null; + } + + /** + * Called when a new global background (backgroundMime) is uploaded (admin setting) + * This sets all necessary app config values + * @param resource|string $path + * @return string|null The fallback background color - if any + */ + public function setGlobalBackground($path): ?string { + $image = new Image(); + $handle = is_resource($path) ? $path : fopen($path, 'rb'); + + if ($handle && $image->loadFromFileHandle($handle) !== false) { + $meanColor = $this->calculateMeanColor($image); + if ($meanColor !== false) { + $this->appConfig->setValueString(Application::APP_ID, 'background_color', $meanColor); + return $meanColor; + } + } + return null; + } + + /** + * Calculate mean color of an given image + * It only takes the upper part into account so that a matching text color can be derived for the app menu + */ + private function calculateMeanColor(Image $image): false|string { + /** + * Small helper to ensure one channel is returned as 8byte hex + */ + function toHex(int $channel): string { + $hex = dechex($channel); + return match (strlen($hex)) { + 0 => '00', + 1 => '0' . $hex, + 2 => $hex, + default => 'ff', + }; + } + + $tempImage = new Image(); + + // Crop to only analyze top bar + $resource = $image->cropNew(0, 0, $image->width(), min(max(50, (int)($image->height() * 0.125)), $image->height())); + if ($resource === false) { + return false; + } + + $tempImage->setResource($resource); + if (!$tempImage->preciseResize(100, 7)) { + return false; + } + + $resource = $tempImage->resource(); + if ($resource === false) { + return false; + } + + $reds = []; + $greens = []; + $blues = []; + for ($y = 0; $y < 7; $y++) { + for ($x = 0; $x < 100; $x++) { + $value = imagecolorat($resource, $x, $y); + if ($value === false) { + continue; + } + $reds[] = ($value >> 16) & 0xFF; + $greens[] = ($value >> 8) & 0xFF; + $blues[] = $value & 0xFF; + } + } + $meanColor = '#' . toHex((int)(array_sum($reds) / count($reds))); + $meanColor .= toHex((int)(array_sum($greens) / count($greens))); + $meanColor .= toHex((int)(array_sum($blues) / count($blues))); + return $meanColor; + } + + /** + * Storing the data in appdata/theming/users/USERID + * + * @param string|null $userId The user to get the folder - default to current user + * @throws NotPermittedException + */ + private function getAppDataFolder(?string $userId = null): ISimpleFolder { + $userId = $userId ?? $this->getUserId(); + + try { + $rootFolder = $this->appData->getFolder('users'); + } catch (NotFoundException) { + $rootFolder = $this->appData->newFolder('users'); + } + try { + return $rootFolder->getFolder($userId); + } catch (NotFoundException) { + return $rootFolder->newFolder($userId); + } + } + + /** + * @throws RuntimeException Thrown if a method that needs a user is called without any logged-in user + */ + private function getUserId(): string { + if ($this->userId === null) { + throw new RuntimeException('No currently logged-in user'); + } + return $this->userId; + } +} diff --git a/apps/theming/lib/Service/JSDataService.php b/apps/theming/lib/Service/JSDataService.php new file mode 100644 index 00000000000..81198f8b3f5 --- /dev/null +++ b/apps/theming/lib/Service/JSDataService.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Service; + +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; + +class JSDataService implements \JsonSerializable { + + public function __construct( + private ThemingDefaults $themingDefaults, + private Util $util, + private ThemesService $themesService, + ) { + $this->themingDefaults = $themingDefaults; + $this->util = $util; + $this->themesService = $themesService; + } + + public function jsonSerialize(): array { + return [ + 'name' => $this->themingDefaults->getName(), + 'slogan' => $this->themingDefaults->getSlogan(), + + 'url' => $this->themingDefaults->getBaseUrl(), + 'imprintUrl' => $this->themingDefaults->getImprintUrl(), + 'privacyUrl' => $this->themingDefaults->getPrivacyUrl(), + + 'primaryColor' => $this->themingDefaults->getColorPrimary(), + 'backgroundColor' => $this->themingDefaults->getColorBackground(), + 'defaultPrimaryColor' => $this->themingDefaults->getDefaultColorPrimary(), + 'defaultBackgroundColor' => $this->themingDefaults->getDefaultColorBackground(), + 'inverted' => $this->util->invertTextColor($this->themingDefaults->getColorPrimary()), + + 'cacheBuster' => $this->util->getCacheBuster(), + 'enabledThemes' => $this->themesService->getEnabledThemes(), + + // deprecated use primaryColor + 'color' => $this->themingDefaults->getColorPrimary(), + '' => 'color is deprecated since Nextcloud 29, use primaryColor instead' + ]; + } +} diff --git a/apps/theming/lib/Service/ThemeInjectionService.php b/apps/theming/lib/Service/ThemeInjectionService.php new file mode 100644 index 00000000000..873d388081c --- /dev/null +++ b/apps/theming/lib/Service/ThemeInjectionService.php @@ -0,0 +1,116 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Service; + +use OCA\Theming\ITheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Util; +use OCP\IConfig; +use OCP\IURLGenerator; +use OCP\IUserSession; + +class ThemeInjectionService { + + private ?string $userId; + + public function __construct( + private IURLGenerator $urlGenerator, + private ThemesService $themesService, + private DefaultTheme $defaultTheme, + private Util $util, + private IConfig $config, + IUserSession $userSession, + ) { + if ($userSession->getUser() !== null) { + $this->userId = $userSession->getUser()->getUID(); + } else { + $this->userId = null; + } + } + + public function injectHeaders(): void { + $themes = $this->themesService->getThemes(); + $defaultTheme = $themes[$this->defaultTheme->getId()]; + $mediaThemes = array_filter($themes, function ($theme) { + // Check if the theme provides a media query + return (bool)$theme->getMediaQuery(); + }); + + // Default theme fallback + $this->addThemeHeaders($defaultTheme); + + // Themes applied by media queries + foreach ($mediaThemes as $theme) { + $this->addThemeHeaders($theme, true, $theme->getMediaQuery()); + } + + // Themes + foreach ($this->themesService->getThemes() as $theme) { + // Ignore default theme as already processed first + if ($theme->getId() === $this->defaultTheme->getId()) { + continue; + } + $this->addThemeHeaders($theme, false); + } + + // Meta headers + $this->addThemeMetaHeaders($themes); + } + + /** + * Inject theme header into rendered page + * + * @param ITheme $theme the theme + * @param bool $plain request the :root syntax + * @param string $media media query to use in the <link> element + */ + private function addThemeHeaders(ITheme $theme, bool $plain = true, ?string $media = null): void { + $linkToCSS = $this->urlGenerator->linkToRoute('theming.Theming.getThemeStylesheet', [ + 'themeId' => $theme->getId(), + 'plain' => $plain, + 'v' => $this->util->getCacheBuster(), + ]); + \OCP\Util::addHeader('link', [ + 'rel' => 'stylesheet', + 'media' => $media, + 'href' => $linkToCSS, + 'class' => 'theme' + ]); + } + + /** + * Inject meta headers into rendered page + * + * @param ITheme[] $themes the theme + */ + private function addThemeMetaHeaders(array $themes): void { + $metaHeaders = []; + + // Meta headers + foreach ($this->themesService->getThemes() as $theme) { + if (!empty($theme->getMeta())) { + foreach ($theme->getMeta() as $meta) { + if (!isset($meta['name']) || !isset($meta['content'])) { + continue; + } + + if (!isset($metaHeaders[$meta['name']])) { + $metaHeaders[$meta['name']] = []; + } + $metaHeaders[$meta['name']][] = $meta['content']; + } + } + } + + foreach ($metaHeaders as $name => $content) { + \OCP\Util::addHeader('meta', [ + 'name' => $name, + 'content' => join(' ', array_unique($content)), + ]); + } + } +} diff --git a/apps/theming/lib/Service/ThemesService.php b/apps/theming/lib/Service/ThemesService.php new file mode 100644 index 00000000000..f49524cb62c --- /dev/null +++ b/apps/theming/lib/Service/ThemesService.php @@ -0,0 +1,188 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Service; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ITheme; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\Themes\LightTheme; +use OCP\IConfig; +use OCP\IUser; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +class ThemesService { + /** @var ITheme[] */ + private array $themesProviders; + + public function __construct( + private IUserSession $userSession, + private IConfig $config, + private LoggerInterface $logger, + private DefaultTheme $defaultTheme, + LightTheme $lightTheme, + private DarkTheme $darkTheme, + HighContrastTheme $highContrastTheme, + DarkHighContrastTheme $darkHighContrastTheme, + DyslexiaFont $dyslexiaFont, + ) { + + // Register themes + $this->themesProviders = [ + $defaultTheme->getId() => $defaultTheme, + $lightTheme->getId() => $lightTheme, + $darkTheme->getId() => $darkTheme, + $highContrastTheme->getId() => $highContrastTheme, + $darkHighContrastTheme->getId() => $darkHighContrastTheme, + $dyslexiaFont->getId() => $dyslexiaFont, + ]; + } + + /** + * Get the list of all registered themes + * + * @return ITheme[] + */ + public function getThemes(): array { + // Enforced theme if configured + $enforcedTheme = $this->config->getSystemValueString('enforce_theme', ''); + if ($enforcedTheme !== '') { + if (!isset($this->themesProviders[$enforcedTheme])) { + $this->logger->error('Enforced theme not found', ['theme' => $enforcedTheme]); + return $this->themesProviders; + } + + $defaultTheme = $this->themesProviders[$this->defaultTheme->getId()]; + $darkTheme = $this->themesProviders[$this->darkTheme->getId()]; + $theme = $this->themesProviders[$enforcedTheme]; + return [ + // Leave the default theme as a fallback + $defaultTheme->getId() => $defaultTheme, + // Make sure we also have the dark theme to allow apps + // to scope sections of their UI to the dark theme + $darkTheme->getId() => $darkTheme, + // Finally, the enforced theme + $theme->getId() => $theme, + ]; + } + + return $this->themesProviders; + } + + /** + * Enable a theme for the logged-in user + * + * @param ITheme $theme the theme to enable + * @return string[] the enabled themes + */ + public function enableTheme(ITheme $theme): array { + $themesIds = $this->getEnabledThemes(); + + // If already enabled, ignore + if (in_array($theme->getId(), $themesIds)) { + return $themesIds; + } + + /** @var ITheme[] */ + $themes = array_filter(array_map(function ($themeId) { + return $this->getThemes()[$themeId]; + }, $themesIds)); + + // Filtering all themes with the same type + $filteredThemes = array_filter($themes, function (ITheme $t) use ($theme) { + return $theme->getType() === $t->getType(); + }); + + // Retrieve IDs only + /** @var string[] */ + $filteredThemesIds = array_map(function (ITheme $t) { + return $t->getId(); + }, array_values($filteredThemes)); + + $enabledThemes = array_merge(array_diff($themesIds, $filteredThemesIds), [$theme->getId()]); + $this->setEnabledThemes($enabledThemes); + + return $enabledThemes; + } + + /** + * Disable a theme for the logged-in user + * + * @param ITheme $theme the theme to disable + * @return string[] the enabled themes + */ + public function disableTheme(ITheme $theme): array { + $themesIds = $this->getEnabledThemes(); + + // If enabled, removing it + if (in_array($theme->getId(), $themesIds)) { + $enabledThemes = array_diff($themesIds, [$theme->getId()]); + $this->setEnabledThemes($enabledThemes); + return $enabledThemes; + } + + return $themesIds; + } + + /** + * Check whether a theme is enabled or not + * for the logged-in user + * + * @return bool + */ + public function isEnabled(ITheme $theme): bool { + $user = $this->userSession->getUser(); + if ($user instanceof IUser) { + // Using keys as it's faster + $themes = $this->getEnabledThemes(); + return in_array($theme->getId(), $themes); + } + return false; + } + + /** + * Get the list of all enabled themes IDs for the current user. + * + * @return string[] + */ + public function getEnabledThemes(): array { + $enforcedTheme = $this->config->getSystemValueString('enforce_theme', ''); + $user = $this->userSession->getUser(); + if ($user === null) { + if ($enforcedTheme !== '') { + return [$enforcedTheme]; + } + return []; + } + + $enabledThemes = json_decode($this->config->getUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', '["default"]')); + if ($enforcedTheme !== '') { + return array_merge([$enforcedTheme], $enabledThemes); + } + + try { + return $enabledThemes; + } catch (\Exception $e) { + return []; + } + } + + /** + * Set the list of enabled themes + * for the logged-in user + * + * @param string[] $themes the list of enabled themes IDs + */ + private function setEnabledThemes(array $themes): void { + $user = $this->userSession->getUser(); + $this->config->setUserValue($user->getUID(), Application::APP_ID, 'enabled-themes', json_encode(array_values(array_unique($themes)))); + } +} diff --git a/apps/theming/lib/Settings/Admin.php b/apps/theming/lib/Settings/Admin.php new file mode 100644 index 00000000000..9fa0f2bb0e7 --- /dev/null +++ b/apps/theming/lib/Settings/Admin.php @@ -0,0 +1,111 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Settings; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Controller\ThemingController; +use OCA\Theming\ImageManager; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use OCP\Settings\IDelegatedSettings; +use OCP\Util; + +class Admin implements IDelegatedSettings { + + public function __construct( + private string $appName, + private IConfig $config, + private IL10N $l, + private ThemingDefaults $themingDefaults, + private IInitialState $initialState, + private IURLGenerator $urlGenerator, + private ImageManager $imageManager, + private INavigationManager $navigationManager, + ) { + } + + /** + * @return TemplateResponse + */ + public function getForm(): TemplateResponse { + $themable = true; + $errorMessage = ''; + $theme = $this->config->getSystemValue('theme', ''); + if ($theme !== '') { + $themable = false; + $errorMessage = $this->l->t('You are already using a custom theme. Theming app settings might be overwritten by that.'); + } + + $allowedMimeTypes = array_reduce(ThemingController::VALID_UPLOAD_KEYS, function ($carry, $key) { + $carry[$key] = $this->imageManager->getSupportedUploadImageFormats($key); + return $carry; + }, []); + + $this->initialState->provideInitialState('adminThemingParameters', [ + 'isThemable' => $themable, + 'notThemableErrorMessage' => $errorMessage, + 'name' => $this->themingDefaults->getEntity(), + 'url' => $this->themingDefaults->getBaseUrl(), + 'slogan' => $this->themingDefaults->getSlogan(), + 'primaryColor' => $this->themingDefaults->getDefaultColorPrimary(), + 'backgroundColor' => $this->themingDefaults->getDefaultColorBackground(), + 'logoMime' => $this->config->getAppValue(Application::APP_ID, 'logoMime', ''), + 'allowedMimeTypes' => $allowedMimeTypes, + 'backgroundURL' => $this->imageManager->getImageUrl('background'), + 'defaultBackgroundURL' => $this->urlGenerator->linkTo(Application::APP_ID, 'img/background/' . BackgroundService::DEFAULT_BACKGROUND_IMAGE), + 'defaultBackgroundColor' => BackgroundService::DEFAULT_BACKGROUND_COLOR, + 'backgroundMime' => $this->config->getAppValue(Application::APP_ID, 'backgroundMime', ''), + 'logoheaderMime' => $this->config->getAppValue(Application::APP_ID, 'logoheaderMime', ''), + 'faviconMime' => $this->config->getAppValue(Application::APP_ID, 'faviconMime', ''), + 'legalNoticeUrl' => $this->themingDefaults->getImprintUrl(), + 'privacyPolicyUrl' => $this->themingDefaults->getPrivacyUrl(), + 'docUrl' => $this->urlGenerator->linkToDocs('admin-theming'), + 'docUrlIcons' => $this->urlGenerator->linkToDocs('admin-theming-icons'), + 'canThemeIcons' => $this->imageManager->shouldReplaceIcons(), + 'userThemingDisabled' => $this->themingDefaults->isUserThemingDisabled(), + 'defaultApps' => $this->navigationManager->getDefaultEntryIds(), + ]); + + Util::addScript($this->appName, 'admin-theming'); + + return new TemplateResponse($this->appName, 'settings-admin'); + } + + /** + * @return string the section ID, e.g. 'sharing' + */ + public function getSection(): string { + return $this->appName; + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * + * E.g.: 70 + */ + public function getPriority(): int { + return 5; + } + + public function getName(): ?string { + return null; // Only one setting in this section + } + + public function getAuthorizedAppConfig(): array { + return [ + $this->appName => '/.*/', + ]; + } +} diff --git a/apps/theming/lib/Settings/AdminSection.php b/apps/theming/lib/Settings/AdminSection.php new file mode 100644 index 00000000000..a1ea568d9f2 --- /dev/null +++ b/apps/theming/lib/Settings/AdminSection.php @@ -0,0 +1,58 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Settings; + +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\Settings\IIconSection; + +class AdminSection implements IIconSection { + public function __construct( + private string $appName, + private IURLGenerator $url, + private IL10N $l, + ) { + } + + /** + * returns the ID of the section. It is supposed to be a lower case string, + * e.g. 'ldap' + * + * @returns string + */ + public function getID() { + return $this->appName; + } + + /** + * returns the translated name as it should be displayed, e.g. 'LDAP / AD + * integration'. Use the L10N service to translate it. + * + * @return string + */ + public function getName() { + return $this->l->t('Theming'); + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the settings navigation. The sections are arranged in ascending order of + * the priority values. It is required to return a value between 0 and 99. + * + * E.g.: 70 + */ + public function getPriority() { + return 30; + } + + /** + * {@inheritdoc} + */ + public function getIcon() { + return $this->url->imagePath($this->appName, 'app-dark.svg'); + } +} diff --git a/apps/theming/lib/Settings/Personal.php b/apps/theming/lib/Settings/Personal.php new file mode 100644 index 00000000000..f14deeb35f0 --- /dev/null +++ b/apps/theming/lib/Settings/Personal.php @@ -0,0 +1,109 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Settings; + +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\IConfig; +use OCP\INavigationManager; +use OCP\Settings\ISettings; +use OCP\Util; + +class Personal implements ISettings { + + public function __construct( + protected string $appName, + private string $userId, + private IConfig $config, + private ThemesService $themesService, + private IInitialState $initialStateService, + private ThemingDefaults $themingDefaults, + private INavigationManager $navigationManager, + ) { + } + + public function getForm(): TemplateResponse { + $enforcedTheme = $this->config->getSystemValueString('enforce_theme', ''); + + $themes = array_map(function ($theme) { + return [ + 'id' => $theme->getId(), + 'type' => $theme->getType(), + 'title' => $theme->getTitle(), + 'enableLabel' => $theme->getEnableLabel(), + 'description' => $theme->getDescription(), + 'enabled' => $this->themesService->isEnabled($theme), + ]; + }, $this->themesService->getThemes()); + + if ($enforcedTheme !== '') { + $themes = array_filter($themes, function ($theme) use ($enforcedTheme) { + return $theme['type'] !== ITheme::TYPE_THEME || $theme['id'] === $enforcedTheme; + }); + } + + // Get the default entry enforced by admin + $forcedDefaultEntry = $this->navigationManager->getDefaultEntryIdForUser(null, false); + + /** List of all shipped backgrounds */ + $this->initialStateService->provideInitialState('shippedBackgrounds', BackgroundService::SHIPPED_BACKGROUNDS); + + /** + * Admin theming + */ + $this->initialStateService->provideInitialState('themingDefaults', [ + /** URL of admin configured background image */ + 'backgroundImage' => $this->themingDefaults->getBackground(), + /** `backgroundColor` if disabled, mime type if defined and empty by default */ + 'backgroundMime' => $this->config->getAppValue('theming', 'backgroundMime', ''), + /** Admin configured background color */ + 'backgroundColor' => $this->themingDefaults->getDefaultColorBackground(), + /** Admin configured primary color */ + 'primaryColor' => $this->themingDefaults->getDefaultColorPrimary(), + /** Nextcloud default background image */ + 'defaultShippedBackground' => BackgroundService::DEFAULT_BACKGROUND_IMAGE, + ]); + + $this->initialStateService->provideInitialState('userBackgroundImage', $this->config->getUserValue($this->userId, 'theming', 'background_image', BackgroundService::BACKGROUND_DEFAULT)); + $this->initialStateService->provideInitialState('themes', array_values($themes)); + $this->initialStateService->provideInitialState('enforceTheme', $enforcedTheme); + $this->initialStateService->provideInitialState('isUserThemingDisabled', $this->themingDefaults->isUserThemingDisabled()); + $this->initialStateService->provideInitialState('enableBlurFilter', $this->config->getUserValue($this->userId, 'theming', 'force_enable_blur_filter', '')); + $this->initialStateService->provideInitialState('navigationBar', [ + 'userAppOrder' => json_decode($this->config->getUserValue($this->userId, 'core', 'apporder', '[]'), true, flags:JSON_THROW_ON_ERROR), + 'enforcedDefaultApp' => $forcedDefaultEntry + ]); + + Util::addScript($this->appName, 'personal-theming'); + + return new TemplateResponse($this->appName, 'settings-personal'); + } + + /** + * @return string the section ID, e.g. 'sharing' + * @since 9.1 + */ + public function getSection(): string { + return $this->appName; + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * + * E.g.: 70 + * @since 9.1 + */ + public function getPriority(): int { + return 40; + } +} diff --git a/apps/theming/lib/Settings/PersonalSection.php b/apps/theming/lib/Settings/PersonalSection.php new file mode 100644 index 00000000000..0a9361d5533 --- /dev/null +++ b/apps/theming/lib/Settings/PersonalSection.php @@ -0,0 +1,73 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Settings; + +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\Settings\IIconSection; + +class PersonalSection implements IIconSection { + + /** + * Personal Section constructor. + * + * @param string $appName + * @param IURLGenerator $urlGenerator + * @param IL10N $l + */ + public function __construct( + protected string $appName, + private IURLGenerator $urlGenerator, + private IL10N $l, + ) { + } + + /** + * returns the relative path to an 16*16 icon describing the section. + * e.g. '/core/img/places/files.svg' + * + * @returns string + * @since 13.0.0 + */ + public function getIcon() { + return $this->urlGenerator->imagePath($this->appName, 'accessibility-dark.svg'); + } + + /** + * returns the ID of the section. It is supposed to be a lower case string, + * e.g. 'ldap' + * + * @returns string + * @since 9.1 + */ + public function getID() { + return $this->appName; + } + + /** + * returns the translated name as it should be displayed, e.g. 'LDAP / AD + * integration'. Use the L10N service to translate it. + * + * @return string + * @since 9.1 + */ + public function getName() { + return $this->l->t('Appearance and accessibility'); + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the settings navigation. The sections are arranged in ascending order of + * the priority values. It is required to return a value between 0 and 99. + * + * E.g.: 70 + * @since 9.1 + */ + public function getPriority() { + return 15; + } +} diff --git a/apps/theming/lib/SetupChecks/PhpImagickModule.php b/apps/theming/lib/SetupChecks/PhpImagickModule.php new file mode 100644 index 00000000000..cf9e51eee33 --- /dev/null +++ b/apps/theming/lib/SetupChecks/PhpImagickModule.php @@ -0,0 +1,46 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\SetupChecks; + +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\SetupCheck\ISetupCheck; +use OCP\SetupCheck\SetupResult; + +class PhpImagickModule implements ISetupCheck { + public function __construct( + private IL10N $l10n, + private IURLGenerator $urlGenerator, + ) { + } + + public function getName(): string { + return $this->l10n->t('PHP Imagick module'); + } + + public function getCategory(): string { + return 'php'; + } + + public function run(): SetupResult { + if (!extension_loaded('imagick')) { + return SetupResult::info( + $this->l10n->t('The PHP module "imagick" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module.'), + $this->urlGenerator->linkToDocs('admin-php-modules') + ); + } elseif (count(\Imagick::queryFormats('SVG')) === 0) { + return SetupResult::info( + $this->l10n->t('The PHP module "imagick" in this instance has no SVG support. For better compatibility it is recommended to install it.'), + $this->urlGenerator->linkToDocs('admin-php-modules') + ); + } else { + return SetupResult::success(); + } + } +} diff --git a/apps/theming/lib/Themes/CommonThemeTrait.php b/apps/theming/lib/Themes/CommonThemeTrait.php new file mode 100644 index 00000000000..74979770b70 --- /dev/null +++ b/apps/theming/lib/Themes/CommonThemeTrait.php @@ -0,0 +1,156 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; + +trait CommonThemeTrait { + public Util $util; + public ThemingDefaults $themingDefaults; + + protected bool $isDarkVariant = false; + + /** + * Generate primary-related variables + * This is shared between multiple themes because colorMainBackground and colorMainText + * will change in between. + */ + protected function generatePrimaryVariables(string $colorMainBackground, string $colorMainText, bool $highContrast = false): array { + $isBrightColor = $this->util->isBrightColor($colorMainBackground); + $colorPrimaryElement = $this->util->elementColor($this->primaryColor, $isBrightColor, $colorMainBackground, $highContrast); + $colorPrimaryLight = $this->util->mix($colorPrimaryElement, $colorMainBackground, -80); + $colorPrimaryElementLight = $this->util->mix($colorPrimaryElement, $colorMainBackground, -80); + $invertPrimaryTextColor = $this->util->invertTextColor($colorPrimaryElement); + + // primary related colours + return [ + // invert filter if primary is too bright + // to be used for legacy reasons only. Use inline + // svg with proper css variable instead or material + // design icons. + // ⚠️ Using 'no' as a value to make sure we specify an + // invalid one with no fallback. 'unset' could here fallback to some + // other theme with media queries + '--primary-invert-if-bright' => $this->util->invertTextColor($colorPrimaryElement) ? 'invert(100%)' : 'no', + '--primary-invert-if-dark' => $this->util->invertTextColor($colorPrimaryElement) ? 'no' : 'invert(100%)', + + '--color-primary' => $this->primaryColor, + '--color-primary-text' => $this->util->invertTextColor($this->primaryColor) ? '#000000' : '#ffffff', + '--color-primary-hover' => $this->util->mix($this->primaryColor, $colorMainBackground, 60), + '--color-primary-light' => $colorPrimaryLight, + '--color-primary-light-text' => $this->util->mix($this->primaryColor, $this->util->invertTextColor($colorPrimaryLight) ? '#000000' : '#ffffff', -20), + '--color-primary-light-hover' => $this->util->mix($colorPrimaryLight, $colorMainText, 90), + + // used for buttons, inputs... + '--color-primary-element' => $colorPrimaryElement, + '--color-primary-element-hover' => $invertPrimaryTextColor ? $this->util->lighten($colorPrimaryElement, 4) : $this->util->darken($colorPrimaryElement, 4), + '--color-primary-element-text' => $invertPrimaryTextColor ? '#000000' : '#ffffff', + // mostly used for disabled states + '--color-primary-element-text-dark' => $invertPrimaryTextColor ? $this->util->lighten('#000000', 4) : $this->util->darken('#ffffff', 4), + + // used for hover/focus states + '--color-primary-element-light' => $colorPrimaryElementLight, + '--color-primary-element-light-hover' => $this->util->mix($colorPrimaryElementLight, $colorMainText, 90), + '--color-primary-element-light-text' => $this->util->mix($colorPrimaryElement, $this->util->invertTextColor($colorPrimaryElementLight) ? '#000000' : '#ffffff', -20), + + // to use like this: background-image: var(--gradient-primary-background); + '--gradient-primary-background' => 'linear-gradient(40deg, var(--color-primary) 0%, var(--color-primary-hover) 100%)', + ]; + } + + /** + * Generate admin theming background-related variables + */ + protected function generateGlobalBackgroundVariables(): array { + $backgroundDeleted = $this->config->getAppValue(Application::APP_ID, 'backgroundMime', '') === 'backgroundColor'; + $hasCustomLogoHeader = $this->util->isLogoThemed(); + $backgroundColor = $this->themingDefaults->getColorBackground(); + + // Default last fallback values + $variables = [ + '--color-background-plain' => $backgroundColor, + '--color-background-plain-text' => $this->util->invertTextColor($backgroundColor) ? '#000000' : '#ffffff', + '--background-image-invert-if-bright' => $this->util->invertTextColor($backgroundColor) ? 'invert(100%)' : 'no', + ]; + + // Register image variables only if custom-defined + foreach (ImageManager::SUPPORTED_IMAGE_KEYS as $image) { + if ($this->imageManager->hasImage($image)) { + $imageUrl = $this->imageManager->getImageUrl($image); + $variables["--image-$image"] = "url('" . $imageUrl . "')"; + } elseif ($image === 'background') { + // Apply default background if nothing is configured + $variables['--image-background'] = "url('" . $this->themingDefaults->getBackground($this->isDarkVariant) . "')"; + } + } + + // If a background has been requested let's not define the background image + if ($backgroundDeleted) { + $variables['--image-background'] = 'none'; + } + + if ($hasCustomLogoHeader) { + // prevent inverting the logo on bright colors if customized + $variables['--image-logoheader-custom'] = 'true'; + } + + return $variables; + } + + /** + * Generate user theming background-related variables + */ + protected function generateUserBackgroundVariables(): array { + $user = $this->userSession->getUser(); + if ($user !== null + && !$this->themingDefaults->isUserThemingDisabled() + && $this->appManager->isEnabledForUser(Application::APP_ID)) { + $backgroundImage = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_image', BackgroundService::BACKGROUND_DEFAULT); + $backgroundColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_color', $this->themingDefaults->getColorBackground()); + + $currentVersion = (int)$this->config->getUserValue($user->getUID(), Application::APP_ID, 'userCacheBuster', '0'); + $isBackgroundBright = $this->util->invertTextColor($backgroundColor); + $backgroundTextColor = $this->util->invertTextColor($backgroundColor) ? '#000000' : '#ffffff'; + + $variables = [ + '--color-background-plain' => $backgroundColor, + '--color-background-plain-text' => $backgroundTextColor, + '--background-image-invert-if-bright' => $isBackgroundBright ? 'invert(100%)' : 'no', + ]; + + // Only use a background color without an image + if ($backgroundImage === BackgroundService::BACKGROUND_COLOR) { + // Might be defined already by admin theming, needs to be overridden + $variables['--image-background'] = 'none'; + } + + // The user uploaded a custom background + if ($backgroundImage === BackgroundService::BACKGROUND_CUSTOM) { + $cacheBuster = substr(sha1($user->getUID() . '_' . $currentVersion), 0, 8); + $variables['--image-background'] = "url('" . $this->urlGenerator->linkToRouteAbsolute('theming.userTheme.getBackground') . "?v=$cacheBuster')"; + } + + // The user picked a shipped background + if (isset(BackgroundService::SHIPPED_BACKGROUNDS[$backgroundImage])) { + $shippedBackground = BackgroundService::SHIPPED_BACKGROUNDS[$backgroundImage]; + if ($this->isDarkVariant && isset($shippedBackground['dark_variant'])) { + $backgroundImage = $shippedBackground['dark_variant']; + } + $variables['--image-background'] = "url('" . $this->urlGenerator->linkTo(Application::APP_ID, "img/background/$backgroundImage") . "')"; + } + + return $variables; + } + + return []; + } +} diff --git a/apps/theming/lib/Themes/DarkHighContrastTheme.php b/apps/theming/lib/Themes/DarkHighContrastTheme.php new file mode 100644 index 00000000000..0c8b436d660 --- /dev/null +++ b/apps/theming/lib/Themes/DarkHighContrastTheme.php @@ -0,0 +1,124 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\ITheme; + +class DarkHighContrastTheme extends DarkTheme implements ITheme { + + public function getId(): string { + return 'dark-highcontrast'; + } + + public function getTitle(): string { + return $this->l->t('Dark theme with high contrast mode'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable dark high contrast mode'); + } + + public function getDescription(): string { + return $this->l->t('Similar to the high contrast mode, but with dark colours.'); + } + + public function getMediaQuery(): string { + return '(prefers-color-scheme: dark) and (prefers-contrast: more)'; + } + + /** + * Keep this consistent with other HighContrast Themes + */ + public function getCSSVariables(): array { + $defaultVariables = parent::getCSSVariables(); + + $colorMainText = '#ffffff'; + $colorMainBackground = '#000000'; + $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); + + $colorError = '#ff5252'; + $colorWarning = '#ffcc00'; + $colorSuccess = '#42a942'; + $colorInfo = '#38c0ff'; + + return array_merge( + $defaultVariables, + $this->generatePrimaryVariables($colorMainBackground, $colorMainText, true), + [ + '--color-main-background' => $colorMainBackground, + '--color-main-background-rgb' => $colorMainBackgroundRGB, + '--color-main-background-translucent' => 'rgba(var(--color-main-background-rgb), 1)', + '--color-main-text' => $colorMainText, + + '--color-background-dark' => $this->util->lighten($colorMainBackground, 25), + '--color-background-darker' => $this->util->lighten($colorMainBackground, 25), + + '--color-main-background-blur' => $colorMainBackground, + '--filter-background-blur' => 'none', + + '--color-placeholder-light' => $this->util->lighten($colorMainBackground, 30), + '--color-placeholder-dark' => $this->util->lighten($colorMainBackground, 45), + + '--color-text-maxcontrast' => $colorMainText, + '--color-text-maxcontrast-background-blur' => $colorMainText, + '--color-text-light' => $colorMainText, + '--color-text-lighter' => $colorMainText, + + '--color-error' => $colorError, + '--color-error-rgb' => join(',', $this->util->hexToRGB($colorError)), + '--color-error-hover' => $this->util->lighten($colorError, 10), + '--color-error-text' => $this->util->lighten($colorError, 25), + + '--color-warning' => $colorWarning, + '--color-warning-rgb' => join(',', $this->util->hexToRGB($colorWarning)), + '--color-warning-hover' => $this->util->lighten($colorWarning, 10), + '--color-warning-text' => $this->util->lighten($colorWarning, 10), + + '--color-success' => $colorSuccess, + '--color-success-rgb' => join(',', $this->util->hexToRGB($colorSuccess)), + '--color-success-hover' => $this->util->lighten($colorSuccess, 10), + '--color-success-text' => $this->util->lighten($colorSuccess, 35), + + '--color-info' => $colorInfo, + '--color-info-rgb' => join(',', $this->util->hexToRGB($colorInfo)), + '--color-info-hover' => $this->util->lighten($colorInfo, 10), + '--color-info-text' => $this->util->lighten($colorInfo, 20), + + '--color-scrollbar' => 'auto transparent', + + // used for the icon loading animation + '--color-loading-light' => '#000000', + '--color-loading-dark' => '#dddddd', + + '--color-box-shadow-rgb' => $colorMainText, + '--color-box-shadow' => $colorMainText, + + '--color-border' => $this->util->lighten($colorMainBackground, 50), + '--color-border-dark' => $this->util->lighten($colorMainBackground, 50), + '--color-border-maxcontrast' => $this->util->lighten($colorMainBackground, 55), + ] + ); + } + + public function getCustomCss(): string { + return " + [class^='icon-'], [class*=' icon-'], + .action, + #appmenu li a, + .menutoggle { + opacity: 1 !important; + } + #app-navigation { + border-right: 1px solid var(--color-border); + } + div.crumb { + filter: brightness(150%); + } + "; + } +} diff --git a/apps/theming/lib/Themes/DarkTheme.php b/apps/theming/lib/Themes/DarkTheme.php new file mode 100644 index 00000000000..fd273d4697d --- /dev/null +++ b/apps/theming/lib/Themes/DarkTheme.php @@ -0,0 +1,116 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\ITheme; + +class DarkTheme extends DefaultTheme implements ITheme { + + protected bool $isDarkVariant = true; + + public function getId(): string { + return 'dark'; + } + + public function getTitle(): string { + return $this->l->t('Dark theme'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable dark theme'); + } + + public function getDescription(): string { + return $this->l->t('A dark theme to ease your eyes by reducing the overall luminosity and brightness.'); + } + + public function getMediaQuery(): string { + return '(prefers-color-scheme: dark)'; + } + + public function getMeta(): array { + // https://html.spec.whatwg.org/multipage/semantics.html#meta-color-scheme + return [[ + 'name' => 'color-scheme', + 'content' => 'dark', + ]]; + } + + public function getCSSVariables(): array { + $defaultVariables = parent::getCSSVariables(); + + $colorMainText = '#EBEBEB'; + $colorMainBackground = '#171717'; + $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); + $colorTextMaxcontrast = $this->util->darken($colorMainText, 32); + + $colorBoxShadow = $this->util->darken($colorMainBackground, 70); + $colorBoxShadowRGB = join(',', $this->util->hexToRGB($colorBoxShadow)); + + $colorError = '#FF3333'; + $colorWarning = '#FFCC00'; + $colorSuccess = '#3B973B'; + $colorInfo = '#00AEFF'; + + return array_merge( + $defaultVariables, + $this->generatePrimaryVariables($colorMainBackground, $colorMainText), + [ + '--color-main-text' => $colorMainText, + '--color-main-background' => $colorMainBackground, + '--color-main-background-rgb' => $colorMainBackgroundRGB, + '--color-main-background-blur' => 'rgba(var(--color-main-background-rgb), .85)', + + '--color-background-hover' => $this->util->lighten($colorMainBackground, 4), + '--color-background-dark' => $this->util->lighten($colorMainBackground, 7), + '--color-background-darker' => $this->util->lighten($colorMainBackground, 14), + + '--color-placeholder-light' => $this->util->lighten($colorMainBackground, 10), + '--color-placeholder-dark' => $this->util->lighten($colorMainBackground, 20), + + '--color-text-maxcontrast' => $colorTextMaxcontrast, + '--color-text-maxcontrast-default' => $colorTextMaxcontrast, + '--color-text-maxcontrast-background-blur' => $this->util->lighten($colorTextMaxcontrast, 6), + '--color-text-light' => 'var(--color-main-text)', // deprecated + '--color-text-lighter' => 'var(--color-text-maxcontrast)', // deprecated + + '--color-error' => $colorError, + '--color-error-rgb' => join(',', $this->util->hexToRGB($colorError)), + '--color-error-hover' => $this->util->lighten($colorError, 10), + '--color-error-text' => $this->util->lighten($colorError, 15), + '--color-warning' => $colorWarning, + '--color-warning-rgb' => join(',', $this->util->hexToRGB($colorWarning)), + '--color-warning-hover' => $this->util->lighten($colorWarning, 10), + '--color-warning-text' => $colorWarning, + '--color-success' => $colorSuccess, + '--color-success-rgb' => join(',', $this->util->hexToRGB($colorSuccess)), + '--color-success-hover' => $this->util->lighten($colorSuccess, 10), + '--color-success-text' => $this->util->lighten($colorSuccess, 15), + '--color-info' => $colorInfo, + '--color-info-rgb' => join(',', $this->util->hexToRGB($colorInfo)), + '--color-info-hover' => $this->util->lighten($colorInfo, 10), + '--color-info-text' => $colorInfo, + '--color-favorite' => '#ffde00', + + // used for the icon loading animation + '--color-loading-light' => '#777', + '--color-loading-dark' => '#CCC', + + '--color-box-shadow' => $colorBoxShadow, + '--color-box-shadow-rgb' => $colorBoxShadowRGB, + + '--color-border' => $this->util->lighten($colorMainBackground, 7), + '--color-border-dark' => $this->util->lighten($colorMainBackground, 14), + '--color-border-maxcontrast' => $this->util->lighten($colorMainBackground, 40), + + '--background-invert-if-dark' => 'invert(100%)', + '--background-invert-if-bright' => 'no', + ] + ); + } +} diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php new file mode 100644 index 00000000000..bdd3048a498 --- /dev/null +++ b/apps/theming/lib/Themes/DefaultTheme.php @@ -0,0 +1,233 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OC\AppFramework\Http\Request; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; +use OCP\IURLGenerator; +use OCP\IUserSession; + +class DefaultTheme implements ITheme { + use CommonThemeTrait; + + public string $defaultPrimaryColor; + public string $primaryColor; + + public function __construct( + public Util $util, + public ThemingDefaults $themingDefaults, + public IUserSession $userSession, + public IURLGenerator $urlGenerator, + public ImageManager $imageManager, + public IConfig $config, + public IL10N $l, + public IAppManager $appManager, + private ?IRequest $request, + ) { + $this->defaultPrimaryColor = $this->themingDefaults->getDefaultColorPrimary(); + $this->primaryColor = $this->themingDefaults->getColorPrimary(); + } + + public function getId(): string { + return 'default'; + } + + public function getType(): int { + return ITheme::TYPE_THEME; + } + + public function getTitle(): string { + return $this->l->t('System default theme'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable the system default'); + } + + public function getDescription(): string { + return $this->l->t('Using the default system appearance.'); + } + + public function getMediaQuery(): string { + return ''; + } + + public function getMeta(): array { + return []; + } + + public function getCSSVariables(): array { + $colorMainText = '#222222'; + $colorMainTextRgb = join(',', $this->util->hexToRGB($colorMainText)); + // Color that still provides enough contrast for text, so we need a ratio of 4.5:1 on main background AND hover + $colorTextMaxcontrast = '#6b6b6b'; // 4.5 : 1 for hover background and background dark + $colorMainBackground = '#ffffff'; + $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); + $colorBoxShadow = $this->util->darken($colorMainBackground, 70); + $colorBoxShadowRGB = join(',', $this->util->hexToRGB($colorBoxShadow)); + + $colorError = '#DB0606'; + $colorWarning = '#A37200'; + $colorSuccess = '#2d7b41'; + $colorInfo = '#0071ad'; + + $user = $this->userSession->getUser(); + // Chromium based browsers currently (2024) have huge performance issues with blur filters + $isChromium = $this->request !== null && $this->request->isUserAgent([Request::USER_AGENT_CHROME, Request::USER_AGENT_MS_EDGE]); + // Ignore MacOS because they always have hardware accelartion + $isChromium = $isChromium && !$this->request->isUserAgent(['/Macintosh/']); + // Allow to force the blur filter + $forceEnableBlur = $user === null ? false : $this->config->getUserValue( + $user->getUID(), + 'theming', + 'force_enable_blur_filter', + ); + $workingBlur = match($forceEnableBlur) { + 'yes' => true, + 'no' => false, + default => !$isChromium + }; + + $variables = [ + '--color-main-background' => $colorMainBackground, + '--color-main-background-rgb' => $colorMainBackgroundRGB, + '--color-main-background-translucent' => 'rgba(var(--color-main-background-rgb), .97)', + '--color-main-background-blur' => 'rgba(var(--color-main-background-rgb), .8)', + '--filter-background-blur' => $workingBlur ? 'blur(25px)' : 'none', + + // to use like this: background-image: linear-gradient(0, var('--gradient-main-background)); + '--gradient-main-background' => 'var(--color-main-background) 0%, var(--color-main-background-translucent) 85%, transparent 100%', + + // used for different active/hover/focus/disabled states + '--color-background-hover' => $this->util->darken($colorMainBackground, 4), + '--color-background-dark' => $this->util->darken($colorMainBackground, 7), + '--color-background-darker' => $this->util->darken($colorMainBackground, 14), + + '--color-placeholder-light' => $this->util->darken($colorMainBackground, 10), + '--color-placeholder-dark' => $this->util->darken($colorMainBackground, 20), + + // max contrast for WCAG compliance + '--color-main-text' => $colorMainText, + '--color-text-maxcontrast' => $colorTextMaxcontrast, + '--color-text-maxcontrast-default' => $colorTextMaxcontrast, + '--color-text-maxcontrast-background-blur' => $this->util->darken($colorTextMaxcontrast, 7), + '--color-text-light' => 'var(--color-main-text)', // deprecated + '--color-text-lighter' => 'var(--color-text-maxcontrast)', // deprecated + + '--color-scrollbar' => 'var(--color-border-maxcontrast) transparent', + + // error/warning/success/info feedback colours + '--color-error' => $colorError, + '--color-error-rgb' => join(',', $this->util->hexToRGB($colorError)), + '--color-error-hover' => $this->util->mix($colorError, $colorMainBackground, 75), + '--color-error-text' => $this->util->darken($colorError, 5), + '--color-warning' => $colorWarning, + '--color-warning-rgb' => join(',', $this->util->hexToRGB($colorWarning)), + '--color-warning-hover' => $this->util->darken($colorWarning, 5), + '--color-warning-text' => $this->util->darken($colorWarning, 7), + '--color-success' => $colorSuccess, + '--color-success-rgb' => join(',', $this->util->hexToRGB($colorSuccess)), + '--color-success-hover' => $this->util->mix($colorSuccess, $colorMainBackground, 80), + '--color-success-text' => $this->util->darken($colorSuccess, 4), + '--color-info' => $colorInfo, + '--color-info-rgb' => join(',', $this->util->hexToRGB($colorInfo)), + '--color-info-hover' => $this->util->mix($colorInfo, $colorMainBackground, 80), + '--color-info-text' => $this->util->darken($colorInfo, 4), + '--color-favorite' => '#A37200', + + // used for the icon loading animation + '--color-loading-light' => '#cccccc', + '--color-loading-dark' => '#444444', + + '--color-box-shadow-rgb' => $colorBoxShadowRGB, + '--color-box-shadow' => 'rgba(var(--color-box-shadow-rgb), 0.5)', + + '--color-border' => $this->util->darken($colorMainBackground, 7), + '--color-border-dark' => $this->util->darken($colorMainBackground, 14), + '--color-border-maxcontrast' => $this->util->darken($colorMainBackground, 51), + + '--font-face' => "system-ui, -apple-system, 'Segoe UI', Roboto, Oxygen-Sans, Cantarell, Ubuntu, 'Helvetica Neue', 'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'", + '--default-font-size' => '15px', + '--font-size-small' => '13px', + // 1.5 * font-size for accessibility + '--default-line-height' => '1.5', + + // TODO: support "(prefers-reduced-motion)" + '--animation-quick' => '100ms', + '--animation-slow' => '300ms', + + // Default variables -------------------------------------------- + // Border width for input elements such as text fields and selects + '--border-width-input' => '1px', + '--border-width-input-focused' => '2px', + + // Border radii (new values) + '--border-radius-small' => '4px', // For smaller elements + '--border-radius-element' => '8px', // For interactive elements such as buttons, input, navigation and list items + '--border-radius-container' => '12px', // For smaller containers like action menus + '--border-radius-container-large' => '16px', // For bigger containers like body or modals + + // Border radii (deprecated) + '--border-radius' => 'var(--border-radius-small)', + '--border-radius-large' => 'var(--border-radius-element)', + '--border-radius-rounded' => '28px', + '--border-radius-pill' => '100px', + + '--default-clickable-area' => '34px', + '--clickable-area-large' => '48px', + '--clickable-area-small' => '24px', + + '--default-grid-baseline' => '4px', + + // header / navigation bar + '--header-height' => '50px', + '--header-menu-item-height' => '44px', + /* An alpha mask to be applied to all icons on the navigation bar (header menu). + * Icons are have a size of 20px but usually we use MDI which have a content of 16px so 2px padding top bottom, + * for better gradient we must at first begin at those 2px (10% of height) as start and stop positions. + */ + '--header-menu-icon-mask' => 'linear-gradient(var(--color-background-plain-text) 25%, color-mix(in srgb, var(--color-background-plain-text), 55% transparent) 90%) alpha', + + // various structure data + '--navigation-width' => '300px', + '--sidebar-min-width' => '300px', + '--sidebar-max-width' => '500px', + + // Border radius of the body container + '--body-container-radius' => 'var(--border-radius-container-large)', + // Margin of the body container + '--body-container-margin' => 'calc(var(--default-grid-baseline) * 2)', + // Height of the body container to fully fill the view port + '--body-height' => 'calc(100% - env(safe-area-inset-bottom) - var(--header-height) - var(--body-container-margin))', + + // mobile. Keep in sync with core/src/init.js + '--breakpoint-mobile' => '1024px', + '--background-invert-if-dark' => 'no', + '--background-invert-if-bright' => 'invert(100%)', + '--background-image-invert-if-bright' => 'no', + ]; + + // Primary variables + $variables = array_merge($variables, $this->generatePrimaryVariables($colorMainBackground, $colorMainText)); + $variables = array_merge($variables, $this->generateGlobalBackgroundVariables()); + $variables = array_merge($variables, $this->generateUserBackgroundVariables()); + + return $variables; + } + + public function getCustomCss(): string { + return ''; + } +} diff --git a/apps/theming/lib/Themes/DyslexiaFont.php b/apps/theming/lib/Themes/DyslexiaFont.php new file mode 100644 index 00000000000..2448de7b3c8 --- /dev/null +++ b/apps/theming/lib/Themes/DyslexiaFont.php @@ -0,0 +1,65 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\ITheme; + +class DyslexiaFont extends DefaultTheme implements ITheme { + + public function getId(): string { + return 'opendyslexic'; + } + + public function getType(): int { + return ITheme::TYPE_FONT; + } + + public function getTitle(): string { + return $this->l->t('Dyslexia font'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable dyslexia font'); + } + + public function getDescription(): string { + return $this->l->t('OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia.'); + } + + public function getCSSVariables(): array { + $variables = parent::getCSSVariables(); + $originalFontFace = $variables['--font-face']; + + $variables = [ + '--font-face' => 'OpenDyslexic, ' . $originalFontFace + ]; + + return $variables; + } + + public function getCustomCss(): string { + $fontPathOtf = $this->urlGenerator->linkTo('theming', 'fonts/OpenDyslexic-Regular.otf'); + $boldFontPathOtf = $this->urlGenerator->linkTo('theming', 'fonts/OpenDyslexic-Bold.otf'); + + return " + @font-face { + font-family: 'OpenDyslexic'; + font-style: normal; + font-weight: 400; + src: url('$fontPathOtf') format('opentype'); + } + + @font-face { + font-family: 'OpenDyslexic'; + font-style: normal; + font-weight: 700; + src: url('$boldFontPathOtf') format('opentype'); + } + "; + } +} diff --git a/apps/theming/lib/Themes/HighContrastTheme.php b/apps/theming/lib/Themes/HighContrastTheme.php new file mode 100644 index 00000000000..5b51114a32f --- /dev/null +++ b/apps/theming/lib/Themes/HighContrastTheme.php @@ -0,0 +1,129 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\ITheme; + +class HighContrastTheme extends DefaultTheme implements ITheme { + + public function getId(): string { + return 'light-highcontrast'; + } + + public function getTitle(): string { + return $this->l->t('High contrast mode'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable high contrast mode'); + } + + public function getDescription(): string { + return $this->l->t('A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.'); + } + + public function getMediaQuery(): string { + return '(prefers-contrast: more)'; + } + + /** + * Keep this consistent with other HighContrast Themes + */ + public function getCSSVariables(): array { + $defaultVariables = parent::getCSSVariables(); + + $colorMainText = '#000000'; + $colorMainBackground = '#ffffff'; + $colorMainBackgroundRGB = join(',', $this->util->hexToRGB($colorMainBackground)); + + $colorError = '#D10000'; + $colorWarning = '#995900'; + $colorSuccess = '#207830'; + $colorInfo = '#006DA8'; + + $primaryVariables = $this->generatePrimaryVariables($colorMainBackground, $colorMainText, true); + return array_merge( + $defaultVariables, + $primaryVariables, + [ + '--color-primary-element-text-dark' => $primaryVariables['--color-primary-element-text'], + + '--color-main-background' => $colorMainBackground, + '--color-main-background-rgb' => $colorMainBackgroundRGB, + '--color-main-background-translucent' => 'rgba(var(--color-main-background-rgb), 1)', + '--color-main-text' => $colorMainText, + + '--color-background-dark' => $this->util->darken($colorMainBackground, 20), + '--color-background-darker' => $this->util->darken($colorMainBackground, 20), + + '--color-main-background-blur' => $colorMainBackground, + '--filter-background-blur' => 'none', + + '--color-placeholder-light' => $this->util->darken($colorMainBackground, 30), + '--color-placeholder-dark' => $this->util->darken($colorMainBackground, 45), + + '--color-text-maxcontrast' => $colorMainText, + '--color-text-maxcontrast-background-blur' => $colorMainText, + '--color-text-light' => $colorMainText, + '--color-text-lighter' => $colorMainText, + + '--color-error' => $colorError, + '--color-error-rgb' => join(',', $this->util->hexToRGB($colorError)), + '--color-error-hover' => $this->util->darken($colorError, 8), + '--color-error-text' => $this->util->darken($colorError, 17), + + '--color-warning' => $colorWarning, + '--color-warning-rgb' => join(',', $this->util->hexToRGB($colorWarning)), + '--color-warning-hover' => $this->util->darken($colorWarning, 7), + '--color-warning-text' => $this->util->darken($colorWarning, 13), + + '--color-info' => $colorInfo, + '--color-info-rgb' => join(',', $this->util->hexToRGB($colorInfo)), + '--color-info-hover' => $this->util->darken($colorInfo, 7), + '--color-info-text' => $this->util->darken($colorInfo, 15), + + '--color-success' => $colorSuccess, + '--color-success-rgb' => join(',', $this->util->hexToRGB($colorSuccess)), + '--color-success-hover' => $this->util->darken($colorSuccess, 7), + '--color-success-text' => $this->util->darken($colorSuccess, 14), + + '--color-favorite' => '#936B06', + + '--color-scrollbar' => 'auto transparent', + + // used for the icon loading animation + '--color-loading-light' => '#dddddd', + '--color-loading-dark' => '#000000', + + '--color-box-shadow-rgb' => $colorMainText, + '--color-box-shadow' => $colorMainText, + + '--color-border' => $this->util->darken($colorMainBackground, 50), + '--color-border-dark' => $this->util->darken($colorMainBackground, 50), + '--color-border-maxcontrast' => $this->util->darken($colorMainBackground, 56), + + // remove the gradient from the app icons + '--header-menu-icon-mask' => 'none', + ] + ); + } + + public function getCustomCss(): string { + return " + [class^='icon-'], [class*=' icon-'], + .action, + #appmenu li a, + .menutoggle { + opacity: 1 !important; + } + #app-navigation { + border-right: 1px solid var(--color-border); + } + "; + } +} diff --git a/apps/theming/lib/Themes/LightTheme.php b/apps/theming/lib/Themes/LightTheme.php new file mode 100644 index 00000000000..714156d4721 --- /dev/null +++ b/apps/theming/lib/Themes/LightTheme.php @@ -0,0 +1,41 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Themes; + +use OCA\Theming\ITheme; + +class LightTheme extends DefaultTheme implements ITheme { + + public function getId(): string { + return 'light'; + } + + public function getTitle(): string { + return $this->l->t('Light theme'); + } + + public function getEnableLabel(): string { + return $this->l->t('Enable the default light theme'); + } + + public function getDescription(): string { + return $this->l->t('The default light appearance.'); + } + + public function getMediaQuery(): string { + return '(prefers-color-scheme: light)'; + } + + public function getMeta(): array { + // https://html.spec.whatwg.org/multipage/semantics.html#meta-color-scheme + return [[ + 'name' => 'color-scheme', + 'content' => 'light', + ]]; + } +} diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php new file mode 100644 index 00000000000..04f56895fa3 --- /dev/null +++ b/apps/theming/lib/ThemingDefaults.php @@ -0,0 +1,528 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Service\BackgroundService; +use OCP\App\AppPathNotFoundException; +use OCP\App\IAppManager; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\IAppConfig; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use OCP\IUserSession; + +class ThemingDefaults extends \OC_Defaults { + + private string $name; + private string $title; + private string $entity; + private string $productName; + private string $url; + private string $backgroundColor; + private string $primaryColor; + private string $docBaseUrl; + + private string $iTunesAppId; + private string $iOSClientUrl; + private string $AndroidClientUrl; + private string $FDroidClientUrl; + + /** + * ThemingDefaults constructor. + */ + public function __construct( + private IConfig $config, + private IAppConfig $appConfig, + private IL10N $l, + private IUserSession $userSession, + private IURLGenerator $urlGenerator, + private ICacheFactory $cacheFactory, + private Util $util, + private ImageManager $imageManager, + private IAppManager $appManager, + private INavigationManager $navigationManager, + private BackgroundService $backgroundService, + ) { + parent::__construct(); + + $this->name = parent::getName(); + $this->title = parent::getTitle(); + $this->entity = parent::getEntity(); + $this->productName = parent::getProductName(); + $this->url = parent::getBaseUrl(); + $this->primaryColor = parent::getColorPrimary(); + $this->backgroundColor = parent::getColorBackground(); + $this->iTunesAppId = parent::getiTunesAppId(); + $this->iOSClientUrl = parent::getiOSClientUrl(); + $this->AndroidClientUrl = parent::getAndroidClientUrl(); + $this->FDroidClientUrl = parent::getFDroidClientUrl(); + $this->docBaseUrl = parent::getDocBaseUrl(); + } + + public function getName() { + return strip_tags($this->config->getAppValue('theming', 'name', $this->name)); + } + + public function getHTMLName() { + return $this->config->getAppValue('theming', 'name', $this->name); + } + + public function getTitle() { + return strip_tags($this->config->getAppValue('theming', 'name', $this->title)); + } + + public function getEntity() { + return strip_tags($this->config->getAppValue('theming', 'name', $this->entity)); + } + + public function getProductName() { + return strip_tags($this->config->getAppValue('theming', 'productName', $this->productName)); + } + + public function getBaseUrl() { + return $this->config->getAppValue('theming', 'url', $this->url); + } + + /** + * We pass a string and sanitizeHTML will return a string too in that case + * @psalm-suppress InvalidReturnStatement + * @psalm-suppress InvalidReturnType + */ + public function getSlogan(?string $lang = null) { + return \OCP\Util::sanitizeHTML($this->config->getAppValue('theming', 'slogan', parent::getSlogan($lang))); + } + + public function getImprintUrl() { + return (string)$this->config->getAppValue('theming', 'imprintUrl', ''); + } + + public function getPrivacyUrl() { + return (string)$this->config->getAppValue('theming', 'privacyUrl', ''); + } + + public function getDocBaseUrl() { + return (string)$this->config->getAppValue('theming', 'docBaseUrl', $this->docBaseUrl); + } + + public function getShortFooter() { + $slogan = $this->getSlogan(); + $baseUrl = $this->getBaseUrl(); + $entity = $this->getEntity(); + $footer = ''; + + if ($entity !== '') { + if ($baseUrl !== '') { + $footer = '<a href="' . $baseUrl . '" target="_blank"' + . ' rel="noreferrer noopener" class="entity-name">' . $entity . '</a>'; + } else { + $footer = '<span class="entity-name">' . $entity . '</span>'; + } + } + $footer .= ($slogan !== '' ? ' – ' . $slogan : ''); + + $links = [ + [ + 'text' => $this->l->t('Legal notice'), + 'url' => (string)$this->getImprintUrl() + ], + [ + 'text' => $this->l->t('Privacy policy'), + 'url' => (string)$this->getPrivacyUrl() + ], + ]; + + $navigation = $this->navigationManager->getAll(INavigationManager::TYPE_GUEST); + $guestNavigation = array_map(function ($nav) { + return [ + 'text' => $nav['name'], + 'url' => $nav['href'] + ]; + }, $navigation); + $links = array_merge($links, $guestNavigation); + + $legalLinks = ''; + $divider = ''; + foreach ($links as $link) { + if ($link['url'] !== '' + && filter_var($link['url'], FILTER_VALIDATE_URL) + ) { + $legalLinks .= $divider . '<a href="' . $link['url'] . '" class="legal" target="_blank"' + . ' rel="noreferrer noopener">' . $link['text'] . '</a>'; + $divider = ' · '; + } + } + if ($legalLinks !== '') { + $footer .= '<br/><span class="footer__legal-links">' . $legalLinks . '</span>'; + } + + return $footer; + } + + /** + * Color that is used for highlighting elements like important buttons + * If user theming is enabled then the user defined value is returned + */ + public function getColorPrimary(): string { + $user = $this->userSession->getUser(); + + // admin-defined primary color + $defaultColor = $this->getDefaultColorPrimary(); + + if ($this->isUserThemingDisabled()) { + return $defaultColor; + } + + // user-defined primary color + if (!empty($user)) { + $userPrimaryColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'primary_color', ''); + if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userPrimaryColor)) { + return $userPrimaryColor; + } + } + + // Finally, return the system global primary color + return $defaultColor; + } + + /** + * Color that is used for the page background (e.g. the header) + * If user theming is enabled then the user defined value is returned + */ + public function getColorBackground(): string { + $user = $this->userSession->getUser(); + + // admin-defined background color + $defaultColor = $this->getDefaultColorBackground(); + + if ($this->isUserThemingDisabled()) { + return $defaultColor; + } + + // user-defined background color + if (!empty($user)) { + $userBackgroundColor = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'background_color', ''); + if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userBackgroundColor)) { + return $userBackgroundColor; + } + } + + // Finally, return the system global background color + return $defaultColor; + } + + /** + * Return the default primary color - only taking admin setting into account + */ + public function getDefaultColorPrimary(): string { + // try admin color + $defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'primary_color', ''); + if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) { + return $defaultColor; + } + + // fall back to default primary color + return $this->primaryColor; + } + + /** + * Default background color only taking admin setting into account + */ + public function getDefaultColorBackground(): string { + $defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'background_color'); + if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) { + return $defaultColor; + } + + return $this->backgroundColor; + } + + /** + * Themed logo url + * + * @param bool $useSvg Whether to point to the SVG image or a fallback + * @return string + */ + public function getLogo($useSvg = true): string { + $logo = $this->config->getAppValue('theming', 'logoMime', ''); + + // short cut to avoid setting up the filesystem just to check if the logo is there + // + // explanation: if an SVG is requested and the app config value for logoMime is set then the logo is there. + // otherwise we need to check it and maybe also generate a PNG from the SVG (that's done in getImage() which + // needs to be called then) + if ($useSvg === true && $logo !== false) { + $logoExists = true; + } else { + try { + $this->imageManager->getImage('logo', $useSvg); + $logoExists = true; + } catch (\Exception $e) { + $logoExists = false; + } + } + + $cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0'); + + if (!$logo || !$logoExists) { + if ($useSvg) { + $logo = $this->urlGenerator->imagePath('core', 'logo/logo.svg'); + } else { + $logo = $this->urlGenerator->imagePath('core', 'logo/logo.png'); + } + return $logo . '?v=' . $cacheBusterCounter; + } + + return $this->urlGenerator->linkToRoute('theming.Theming.getImage', [ 'key' => 'logo', 'useSvg' => $useSvg, 'v' => $cacheBusterCounter ]); + } + + /** + * Themed background image url + * + * @param bool $darkVariant if the dark variant (if available) of the background should be used + * @return string + */ + public function getBackground(bool $darkVariant = false): string { + return $this->imageManager->getImageUrl('background' . ($darkVariant ? 'Dark' : '')); + } + + /** + * @return string + */ + public function getiTunesAppId() { + return $this->config->getAppValue('theming', 'iTunesAppId', $this->iTunesAppId); + } + + /** + * @return string + */ + public function getiOSClientUrl() { + return $this->config->getAppValue('theming', 'iOSClientUrl', $this->iOSClientUrl); + } + + /** + * @return string + */ + public function getAndroidClientUrl() { + return $this->config->getAppValue('theming', 'AndroidClientUrl', $this->AndroidClientUrl); + } + + /** + * @return string + */ + public function getFDroidClientUrl() { + return $this->config->getAppValue('theming', 'FDroidClientUrl', $this->FDroidClientUrl); + } + + /** + * @return array scss variables to overwrite + * @deprecated since Nextcloud 22 - https://github.com/nextcloud/server/issues/9940 + */ + public function getScssVariables() { + $cacheBuster = $this->config->getAppValue('theming', 'cachebuster', '0'); + $cache = $this->cacheFactory->createDistributed('theming-' . $cacheBuster . '-' . $this->urlGenerator->getBaseUrl()); + if ($value = $cache->get('getScssVariables')) { + return $value; + } + + $variables = [ + 'theming-cachebuster' => "'" . $cacheBuster . "'", + 'theming-logo-mime' => "'" . $this->config->getAppValue('theming', 'logoMime') . "'", + 'theming-background-mime' => "'" . $this->config->getAppValue('theming', 'backgroundMime') . "'", + 'theming-logoheader-mime' => "'" . $this->config->getAppValue('theming', 'logoheaderMime') . "'", + 'theming-favicon-mime' => "'" . $this->config->getAppValue('theming', 'faviconMime') . "'" + ]; + + $variables['image-logo'] = "url('" . $this->imageManager->getImageUrl('logo') . "')"; + $variables['image-logoheader'] = "url('" . $this->imageManager->getImageUrl('logoheader') . "')"; + $variables['image-favicon'] = "url('" . $this->imageManager->getImageUrl('favicon') . "')"; + $variables['image-login-background'] = "url('" . $this->imageManager->getImageUrl('background') . "')"; + $variables['image-login-plain'] = 'false'; + + if ($this->appConfig->getValueString(Application::APP_ID, 'primary_color', '') !== '') { + $variables['color-primary'] = $this->getColorPrimary(); + $variables['color-primary-text'] = $this->getTextColorPrimary(); + $variables['color-primary-element'] = $this->util->elementColor($this->getColorPrimary()); + } + + if ($this->config->getAppValue('theming', 'backgroundMime', '') === 'backgroundColor') { + $variables['image-login-plain'] = 'true'; + } + + $variables['has-legal-links'] = 'false'; + if ($this->getImprintUrl() !== '' || $this->getPrivacyUrl() !== '') { + $variables['has-legal-links'] = 'true'; + } + + $cache->set('getScssVariables', $variables); + return $variables; + } + + /** + * Check if the image should be replaced by the theming app + * and return the new image location then + * + * @param string $app name of the app + * @param string $image filename of the image + * @return bool|string false if image should not replaced, otherwise the location of the image + */ + public function replaceImagePath($app, $image) { + if ($app === '' || $app === 'files_sharing') { + $app = 'core'; + } + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + + $route = false; + if ($image === 'favicon.ico' && ($this->imageManager->shouldReplaceIcons() || $this->getCustomFavicon() !== null)) { + $route = $this->urlGenerator->linkToRoute('theming.Icon.getFavicon', ['app' => $app]); + } + if (($image === 'favicon-touch.png' || $image === 'favicon-fb.png') && ($this->imageManager->shouldReplaceIcons() || $this->getCustomFavicon() !== null)) { + $route = $this->urlGenerator->linkToRoute('theming.Icon.getTouchIcon', ['app' => $app]); + } + if ($image === 'manifest.json') { + try { + $appPath = $this->appManager->getAppPath($app); + if (file_exists($appPath . '/img/manifest.json')) { + return false; + } + } catch (AppPathNotFoundException $e) { + } + $route = $this->urlGenerator->linkToRoute('theming.Theming.getManifest', ['app' => $app ]); + } + if (str_starts_with($image, 'filetypes/') && file_exists(\OC::$SERVERROOT . '/core/img/' . $image)) { + $route = $this->urlGenerator->linkToRoute('theming.Icon.getThemedIcon', ['app' => $app, 'image' => $image]); + } + + if ($route) { + return $route . '?v=' . $this->util->getCacheBuster(); + } + + return false; + } + + protected function getCustomFavicon(): ?ISimpleFile { + try { + return $this->imageManager->getImage('favicon'); + } catch (NotFoundException $e) { + return null; + } + } + + /** + * Increases the cache buster key + */ + public function increaseCacheBuster(): void { + $cacheBusterKey = (int)$this->config->getAppValue('theming', 'cachebuster', '0'); + $this->config->setAppValue('theming', 'cachebuster', (string)($cacheBusterKey + 1)); + $this->cacheFactory->createDistributed('theming-')->clear(); + $this->cacheFactory->createDistributed('imagePath')->clear(); + } + + /** + * Update setting in the database + * + * @param string $setting + * @param string $value + */ + public function set($setting, $value): void { + $this->config->setAppValue('theming', $setting, $value); + $this->increaseCacheBuster(); + } + + /** + * Revert all settings to the default value + */ + public function undoAll(): void { + // Remember the current cachebuster value, as we do not want to reset this value + // Otherwise this can lead to caching issues as the value might be known to a browser already + $cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0'); + $this->config->deleteAppValues('theming'); + $this->config->setAppValue('theming', 'cachebuster', $cacheBusterKey); + $this->increaseCacheBuster(); + } + + /** + * Revert admin settings to the default value + * + * @param string $setting setting which should be reverted + * @return string default value + */ + public function undo($setting): string { + $this->config->deleteAppValue('theming', $setting); + $this->increaseCacheBuster(); + + $returnValue = ''; + switch ($setting) { + case 'name': + $returnValue = $this->getEntity(); + break; + case 'url': + $returnValue = $this->getBaseUrl(); + break; + case 'slogan': + $returnValue = $this->getSlogan(); + break; + case 'primary_color': + $returnValue = BackgroundService::DEFAULT_COLOR; + break; + case 'background_color': + // If a background image is set we revert to the mean image color + if ($this->imageManager->hasImage('background')) { + $file = $this->imageManager->getImage('background'); + $returnValue = $this->backgroundService->setGlobalBackground($file->read()) ?? ''; + } + break; + case 'logo': + case 'logoheader': + case 'background': + case 'favicon': + $this->imageManager->delete($setting); + $this->config->deleteAppValue('theming', $setting . 'Mime'); + break; + } + + return $returnValue; + } + + /** + * Color of text in the header menu + * + * @return string + */ + public function getTextColorBackground() { + return $this->util->invertTextColor($this->getColorBackground()) ? '#000000' : '#ffffff'; + } + + /** + * Color of text on primary buttons and other elements + * + * @return string + */ + public function getTextColorPrimary() { + return $this->util->invertTextColor($this->getColorPrimary()) ? '#000000' : '#ffffff'; + } + + /** + * Color of text in the header and primary buttons + * + * @return string + */ + public function getDefaultTextColorPrimary() { + return $this->util->invertTextColor($this->getDefaultColorPrimary()) ? '#000000' : '#ffffff'; + } + + /** + * Has the admin disabled user customization + */ + public function isUserThemingDisabled(): bool { + return $this->appConfig->getValueBool(Application::APP_ID, 'disable-user-theming'); + } +} diff --git a/apps/theming/lib/Util.php b/apps/theming/lib/Util.php new file mode 100644 index 00000000000..797456632fc --- /dev/null +++ b/apps/theming/lib/Util.php @@ -0,0 +1,326 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming; + +use Mexitek\PHPColors\Color; +use OCP\App\AppPathNotFoundException; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\IConfig; +use OCP\IUserSession; +use OCP\Server; +use OCP\ServerVersion; + +class Util { + public function __construct( + private ServerVersion $serverVersion, + private IConfig $config, + private IAppManager $appManager, + private IAppData $appData, + private ImageManager $imageManager, + ) { + } + + /** + * Should we invert the text on this background color? + * @param string $color rgb color value + * @return bool + */ + public function invertTextColor(string $color): bool { + return $this->colorContrast($color, '#ffffff') < 4.5; + } + + /** + * Is this color too bright ? + * @param string $color rgb color value + * @return bool + */ + public function isBrightColor(string $color): bool { + $l = $this->calculateLuma($color); + if ($l > 0.6) { + return true; + } else { + return false; + } + } + + /** + * get color for on-page elements: + * theme color by default, grey if theme color is to bright + * @param string $color + * @param ?bool $brightBackground + * @return string + */ + public function elementColor($color, ?bool $brightBackground = null, ?string $backgroundColor = null, bool $highContrast = false) { + if ($backgroundColor !== null) { + $brightBackground = $brightBackground ?? $this->isBrightColor($backgroundColor); + // Minimal amount that is possible to change the luminance + $epsilon = 1.0 / 255.0; + // Current iteration to prevent infinite loops + $iteration = 0; + // We need to keep blurred backgrounds in mind which might be mixed with the background + $blurredBackground = $this->mix($backgroundColor, $brightBackground ? $color : '#ffffff', 66); + $contrast = $this->colorContrast($color, $blurredBackground); + + // Min. element contrast is 3:1 but we need to keep hover states in mind -> min 3.2:1 + $minContrast = $highContrast ? 5.6 : 3.2; + + while ($contrast < $minContrast && $iteration++ < 100) { + $hsl = Color::hexToHsl($color); + $hsl['L'] = max(0, min(1, $hsl['L'] + ($brightBackground ? -$epsilon : $epsilon))); + $color = '#' . Color::hslToHex($hsl); + $contrast = $this->colorContrast($color, $blurredBackground); + } + return $color; + } + + // Fallback for legacy calling + $luminance = $this->calculateLuminance($color); + + if ($brightBackground !== false && $luminance > 0.8) { + // If the color is too bright in bright mode, we fall back to a darkened color + return $this->darken($color, 30); + } + + if ($brightBackground !== true && $luminance < 0.2) { + // If the color is too dark in dark mode, we fall back to a brightened color + return $this->lighten($color, 30); + } + + return $color; + } + + public function mix(string $color1, string $color2, int $factor): string { + $color = new Color($color1); + return '#' . $color->mix($color2, $factor); + } + + public function lighten(string $color, int $factor): string { + $color = new Color($color); + return '#' . $color->lighten($factor); + } + + public function darken(string $color, int $factor): string { + $color = new Color($color); + return '#' . $color->darken($factor); + } + + /** + * Convert RGB to HSL + * + * Copied from cssphp, copyright Leaf Corcoran, licensed under MIT + * + * @param int $red + * @param int $green + * @param int $blue + * + * @return float[] + */ + public function toHSL(int $red, int $green, int $blue): array { + $color = new Color(Color::rgbToHex(['R' => $red, 'G' => $green, 'B' => $blue])); + return array_values($color->getHsl()); + } + + /** + * @param string $color rgb color value + * @return float + */ + public function calculateLuminance(string $color): float { + [$red, $green, $blue] = $this->hexToRGB($color); + $hsl = $this->toHSL($red, $green, $blue); + return $hsl[2]; + } + + /** + * Calculate the Luma according to WCAG 2 + * http://www.w3.org/TR/WCAG20/#relativeluminancedef + * @param string $color rgb color value + * @return float + */ + public function calculateLuma(string $color): float { + $rgb = $this->hexToRGB($color); + + // Normalize the values by converting to float and applying the rules from WCAG2.0 + $rgb = array_map(function (int $color) { + $color = $color / 255.0; + if ($color <= 0.03928) { + return $color / 12.92; + } else { + return pow((($color + 0.055) / 1.055), 2.4); + } + }, $rgb); + + [$red, $green, $blue] = $rgb; + return (0.2126 * $red + 0.7152 * $green + 0.0722 * $blue); + } + + /** + * Calculat the color contrast according to WCAG 2 + * http://www.w3.org/TR/WCAG20/#contrast-ratiodef + * @param string $color1 The first color + * @param string $color2 The second color + */ + public function colorContrast(string $color1, string $color2): float { + $luminance1 = $this->calculateLuma($color1) + 0.05; + $luminance2 = $this->calculateLuma($color2) + 0.05; + return max($luminance1, $luminance2) / min($luminance1, $luminance2); + } + + /** + * @param string $color rgb color value + * @return int[] + * @psalm-return array{0: int, 1: int, 2: int} + */ + public function hexToRGB(string $color): array { + $color = new Color($color); + return array_values($color->getRgb()); + } + + /** + * @param $color + * @return string base64 encoded radio button svg + */ + public function generateRadioButton($color) { + $radioButtonIcon = '<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16">' + . '<path d="M8 1a7 7 0 0 0-7 7 7 7 0 0 0 7 7 7 7 0 0 0 7-7 7 7 0 0 0-7-7zm0 1a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8z" fill="' . $color . '"/></svg>'; + return base64_encode($radioButtonIcon); + } + + + /** + * @param string $app app name + * @return string|ISimpleFile path to app icon / file of logo + */ + public function getAppIcon($app) { + $app = $this->appManager->cleanAppId($app); + try { + $appPath = $this->appManager->getAppPath($app); + $icon = $appPath . '/img/' . $app . '.svg'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/app.svg'; + if (file_exists($icon)) { + return $icon; + } + } catch (AppPathNotFoundException $e) { + } + + if ($this->config->getAppValue('theming', 'logoMime', '') !== '') { + $logoFile = null; + try { + $folder = $this->appData->getFolder('global/images'); + return $folder->getFile('logo'); + } catch (NotFoundException $e) { + } + } + return \OC::$SERVERROOT . '/core/img/logo/logo.svg'; + } + + /** + * @param string $app app name + * @param string $image relative path to image in app folder + * @return string|false absolute path to image + */ + public function getAppImage($app, $image) { + $app = $this->appManager->cleanAppId($app); + /** + * @psalm-taint-escape file + */ + $image = str_replace(['\0', '\\', '..'], '', $image); + if ($app === 'core') { + $icon = \OC::$SERVERROOT . '/core/img/' . $image; + if (file_exists($icon)) { + return $icon; + } + } + + try { + $appPath = $this->appManager->getAppPath($app); + } catch (AppPathNotFoundException $e) { + return false; + } + + $icon = $appPath . '/img/' . $image; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.svg'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.png'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.gif'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.jpg'; + if (file_exists($icon)) { + return $icon; + } + + return false; + } + + /** + * replace default color with a custom one + * + * @param string $svg content of a svg file + * @param string $color color to match + * @return string + */ + public function colorizeSvg($svg, $color) { + $svg = preg_replace('/#0082c9/i', $color, $svg); + return $svg; + } + + /** + * Check if a custom theme is set in the server configuration + * + * @return bool + */ + public function isAlreadyThemed() { + $theme = $this->config->getSystemValue('theme', ''); + if ($theme !== '') { + return true; + } + return false; + } + + public function isBackgroundThemed() { + $backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime', ''); + return $backgroundLogo !== '' && $backgroundLogo !== 'backgroundColor'; + } + + public function isLogoThemed() { + return $this->imageManager->hasImage('logo') + || $this->imageManager->hasImage('logoheader'); + } + + public function getCacheBuster(): string { + $userSession = Server::get(IUserSession::class); + $userId = ''; + $user = $userSession->getUser(); + if (!is_null($user)) { + $userId = $user->getUID(); + } + $serverVersion = $this->serverVersion->getVersionString(); + $themingAppVersion = $this->appManager->getAppVersion('theming'); + $userCacheBuster = ''; + if ($userId) { + $userCacheBusterValue = (int)$this->config->getUserValue($userId, 'theming', 'userCacheBuster', '0'); + $userCacheBuster = $userId . '_' . $userCacheBusterValue; + } + $systemCacheBuster = $this->config->getAppValue('theming', 'cachebuster', '0'); + return substr(sha1($serverVersion . $themingAppVersion . $userCacheBuster . $systemCacheBuster), 0, 8); + } +} diff --git a/apps/theming/openapi.json b/apps/theming/openapi.json new file mode 100644 index 00000000000..66ee05413b3 --- /dev/null +++ b/apps/theming/openapi.json @@ -0,0 +1,1047 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "theming", + "version": "0.0.1", + "description": "Adjust the Nextcloud theme", + "license": { + "name": "agpl" + } + }, + "components": { + "securitySchemes": { + "basic_auth": { + "type": "http", + "scheme": "basic" + }, + "bearer_auth": { + "type": "http", + "scheme": "bearer" + } + }, + "schemas": { + "Background": { + "type": "object", + "required": [ + "backgroundImage", + "backgroundColor", + "primaryColor", + "version" + ], + "properties": { + "backgroundImage": { + "type": "string", + "nullable": true + }, + "backgroundColor": { + "type": "string" + }, + "primaryColor": { + "type": "string" + }, + "version": { + "type": "integer", + "format": "int64" + } + } + }, + "OCSMeta": { + "type": "object", + "required": [ + "status", + "statuscode" + ], + "properties": { + "status": { + "type": "string" + }, + "statuscode": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "totalitems": { + "type": "string" + }, + "itemsperpage": { + "type": "string" + } + } + }, + "PublicCapabilities": { + "type": "object", + "required": [ + "theming" + ], + "properties": { + "theming": { + "type": "object", + "required": [ + "name", + "productName", + "url", + "slogan", + "color", + "color-text", + "color-element", + "color-element-bright", + "color-element-dark", + "logo", + "background", + "background-text", + "background-plain", + "background-default", + "logoheader", + "favicon" + ], + "properties": { + "name": { + "type": "string" + }, + "productName": { + "type": "string" + }, + "url": { + "type": "string" + }, + "slogan": { + "type": "string" + }, + "color": { + "type": "string" + }, + "color-text": { + "type": "string" + }, + "color-element": { + "type": "string" + }, + "color-element-bright": { + "type": "string" + }, + "color-element-dark": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "background": { + "type": "string" + }, + "background-text": { + "type": "string" + }, + "background-plain": { + "type": "boolean" + }, + "background-default": { + "type": "boolean" + }, + "logoheader": { + "type": "string" + }, + "favicon": { + "type": "string" + } + } + } + } + } + } + }, + "paths": { + "/index.php/apps/theming/theme/{themeId}.css": { + "get": { + "operationId": "theming-get-theme-stylesheet", + "summary": "Get the CSS stylesheet for a theme", + "tags": [ + "theming" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "themeId", + "in": "path", + "description": "ID of the theme", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "plain", + "in": "query", + "description": "Let the browser decide the CSS priority", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } + }, + { + "name": "withCustomCss", + "in": "query", + "description": "Include custom CSS", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } + } + ], + "responses": { + "200": { + "description": "Stylesheet returned", + "content": { + "text/css": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Theme not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/image/{key}": { + "get": { + "operationId": "theming-get-image", + "summary": "Get an image", + "tags": [ + "theming" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "key", + "in": "path", + "description": "Key of the image", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "useSvg", + "in": "query", + "description": "Return image as SVG", + "schema": { + "type": "integer", + "default": 1, + "enum": [ + 0, + 1 + ] + } + } + ], + "responses": { + "200": { + "description": "Image returned", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Image not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/manifest/{app}": { + "get": { + "operationId": "theming-get-manifest", + "summary": "Get the manifest for an app", + "tags": [ + "theming" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "app", + "in": "path", + "description": "ID of the app", + "required": true, + "schema": { + "type": "string", + "default": "core" + } + } + ], + "responses": { + "200": { + "description": "Manifest returned", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name", + "short_name", + "start_url", + "theme_color", + "background_color", + "description", + "icons", + "display_override", + "display" + ], + "properties": { + "name": { + "type": "string" + }, + "short_name": { + "type": "string" + }, + "start_url": { + "type": "string" + }, + "theme_color": { + "type": "string" + }, + "background_color": { + "type": "string" + }, + "description": { + "type": "string" + }, + "icons": { + "type": "array", + "items": { + "type": "object", + "required": [ + "src", + "type", + "sizes" + ], + "properties": { + "src": { + "type": "string", + "minLength": 1 + }, + "type": { + "type": "string" + }, + "sizes": { + "type": "string" + } + } + } + }, + "display_override": { + "type": "array", + "items": { + "type": "string" + } + }, + "display": { + "type": "string" + } + } + } + } + } + }, + "404": { + "description": "App not found", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + } + } + }, + "/index.php/apps/theming/favicon/{app}": { + "get": { + "operationId": "icon-get-favicon", + "summary": "Return a 32x32 favicon as png", + "tags": [ + "icon" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "app", + "in": "path", + "description": "ID of the app", + "required": true, + "schema": { + "type": "string", + "default": "core" + } + } + ], + "responses": { + "200": { + "description": "Favicon returned", + "content": { + "image/x-icon": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Favicon not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/icon/{app}": { + "get": { + "operationId": "icon-get-touch-icon", + "summary": "Return a 512x512 icon for touch devices", + "tags": [ + "icon" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "app", + "in": "path", + "description": "ID of the app", + "required": true, + "schema": { + "type": "string", + "default": "core" + } + } + ], + "responses": { + "200": { + "description": "Touch icon returned", + "content": { + "image/png": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "image/x-icon": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Touch icon not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/img/{app}/{image}": { + "get": { + "operationId": "icon-get-themed-icon", + "summary": "Get a themed icon", + "tags": [ + "icon" + ], + "security": [ + {}, + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "app", + "in": "path", + "description": "ID of the app", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "image", + "in": "path", + "description": "image file name (svg required)", + "required": true, + "schema": { + "type": "string", + "pattern": "^.+$" + } + } + ], + "responses": { + "200": { + "description": "Themed icon returned", + "content": { + "image/svg+xml": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Themed icon not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/background": { + "get": { + "operationId": "user_theme-get-background", + "summary": "Get the background image", + "tags": [ + "user_theme" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Background image returned", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Background image not found", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/index.php/apps/theming/background/{type}": { + "post": { + "operationId": "user_theme-set-background", + "summary": "Set the background", + "tags": [ + "user_theme" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "", + "description": "Path of the background image" + }, + "color": { + "type": "string", + "nullable": true, + "default": null, + "description": "Color for the background" + } + } + } + } + } + }, + "parameters": [ + { + "name": "type", + "in": "path", + "description": "Type of background", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Background set successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Background" + } + } + } + }, + "400": { + "description": "Setting background is not possible", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + } + } + } + } + }, + "500": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/index.php/apps/theming/background/custom": { + "delete": { + "operationId": "user_theme-delete-background", + "summary": "Delete the background", + "tags": [ + "user_theme" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Background deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Background" + } + } + } + } + } + } + }, + "/ocs/v2.php/apps/theming/api/v1/theme/{themeId}/enable": { + "put": { + "operationId": "user_theme-enable-theme", + "summary": "Enable theme", + "tags": [ + "user_theme" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "themeId", + "in": "path", + "description": "the theme ID", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Theme enabled successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "400": { + "description": "Enabling theme is not possible", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/ocs/v2.php/apps/theming/api/v1/theme/{themeId}": { + "delete": { + "operationId": "user_theme-disable-theme", + "summary": "Disable theme", + "tags": [ + "user_theme" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "themeId", + "in": "path", + "description": "the theme ID", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Theme disabled successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "400": { + "description": "Disabling theme is not possible", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "500": { + "description": "", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "tags": [ + { + "name": "theming", + "description": "Class ThemingController handle ajax requests to update the theme" + } + ] +} diff --git a/apps/theming/openapi.json.license b/apps/theming/openapi.json.license new file mode 100644 index 00000000000..83559daa9dc --- /dev/null +++ b/apps/theming/openapi.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors +SPDX-License-Identifier: AGPL-3.0-or-later
\ No newline at end of file diff --git a/apps/theming/src/AdminTheming.vue b/apps/theming/src/AdminTheming.vue new file mode 100644 index 00000000000..e899024ca53 --- /dev/null +++ b/apps/theming/src/AdminTheming.vue @@ -0,0 +1,365 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <section> + <NcSettingsSection :name="t('theming', 'Theming')" + :description="t('theming', 'Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.')" + :doc-url="docUrl" + data-admin-theming-settings> + <div class="admin-theming"> + <NcNoteCard v-if="!isThemable" + type="error" + :show-alert="true"> + <p>{{ notThemableErrorMessage }}</p> + </NcNoteCard> + + <!-- Name, web link, slogan... fields --> + <TextField v-for="field in textFields" + :key="field.name" + :data-admin-theming-setting-field="field.name" + :default-value="field.defaultValue" + :display-name="field.displayName" + :maxlength="field.maxlength" + :name="field.name" + :placeholder="field.placeholder" + :type="field.type" + :value.sync="field.value" + @update:theming="refreshStyles" /> + + <!-- Primary color picker --> + <ColorPickerField :name="primaryColorPickerField.name" + :description="primaryColorPickerField.description" + :default-value="primaryColorPickerField.defaultValue" + :display-name="primaryColorPickerField.displayName" + :value.sync="primaryColorPickerField.value" + data-admin-theming-setting-primary-color + @update:theming="refreshStyles" /> + + <!-- Background color picker --> + <ColorPickerField name="background_color" + :description="t('theming', 'Instead of a background image you can also configure a plain background color. If you use a background image changing this color will influence the color of the app menu icons.')" + :default-value.sync="defaultBackgroundColor" + :display-name="t('theming', 'Background color')" + :value.sync="backgroundColor" + data-admin-theming-setting-background-color + @update:theming="refreshStyles" /> + + <!-- Default background picker --> + <FileInputField :aria-label="t('theming', 'Upload new logo')" + data-admin-theming-setting-file="logo" + :display-name="t('theming', 'Logo')" + mime-name="logoMime" + :mime-value.sync="logoMime" + name="logo" + @update:theming="refreshStyles" /> + + <FileInputField :aria-label="t('theming', 'Upload new background and login image')" + data-admin-theming-setting-file="background" + :display-name="t('theming', 'Background and login image')" + mime-name="backgroundMime" + :mime-value.sync="backgroundMime" + name="background" + @uploaded="backgroundURL = $event" + @update:theming="refreshStyles" /> + + <div class="admin-theming__preview" data-admin-theming-preview> + <div class="admin-theming__preview-logo" data-admin-theming-preview-logo /> + </div> + </div> + </NcSettingsSection> + + <NcSettingsSection :name="t('theming', 'Advanced options')"> + <div class="admin-theming-advanced"> + <TextField v-for="field in advancedTextFields" + :key="field.name" + :name="field.name" + :value.sync="field.value" + :default-value="field.defaultValue" + :type="field.type" + :display-name="field.displayName" + :placeholder="field.placeholder" + :maxlength="field.maxlength" + @update:theming="refreshStyles" /> + <FileInputField v-for="field in advancedFileInputFields" + :key="field.name" + :name="field.name" + :mime-name="field.mimeName" + :mime-value.sync="field.mimeValue" + :default-mime-value="field.defaultMimeValue" + :display-name="field.displayName" + :aria-label="field.ariaLabel" + @update:theming="refreshStyles" /> + <CheckboxField :name="userThemingField.name" + :value="userThemingField.value" + :default-value="userThemingField.defaultValue" + :display-name="userThemingField.displayName" + :label="userThemingField.label" + :description="userThemingField.description" + data-admin-theming-setting-disable-user-theming + @update:theming="refreshStyles" /> + <a v-if="!canThemeIcons" + :href="docUrlIcons" + rel="noreferrer noopener"> + <em>{{ t('theming', 'Install the ImageMagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color.') }}</em> + </a> + </div> + </NcSettingsSection> + <AppMenuSection :default-apps.sync="defaultApps" /> + </section> +</template> + +<script> +import { loadState } from '@nextcloud/initial-state' +import { refreshStyles } from './helpers/refreshStyles.js' + +import NcNoteCard from '@nextcloud/vue/components/NcNoteCard' +import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection' +import CheckboxField from './components/admin/CheckboxField.vue' +import ColorPickerField from './components/admin/ColorPickerField.vue' +import FileInputField from './components/admin/FileInputField.vue' +import TextField from './components/admin/TextField.vue' +import AppMenuSection from './components/admin/AppMenuSection.vue' + +const { + defaultBackgroundURL, + + backgroundMime, + backgroundURL, + backgroundColor, + canThemeIcons, + docUrl, + docUrlIcons, + faviconMime, + isThemable, + legalNoticeUrl, + logoheaderMime, + logoMime, + name, + notThemableErrorMessage, + primaryColor, + privacyPolicyUrl, + slogan, + url, + userThemingDisabled, + defaultApps, +} = loadState('theming', 'adminThemingParameters') + +const textFields = [ + { + name: 'name', + value: name, + defaultValue: 'Nextcloud', + type: 'text', + displayName: t('theming', 'Name'), + placeholder: t('theming', 'Name'), + maxlength: 250, + }, + { + name: 'url', + value: url, + defaultValue: 'https://nextcloud.com', + type: 'url', + displayName: t('theming', 'Web link'), + placeholder: 'https://…', + maxlength: 500, + }, + { + name: 'slogan', + value: slogan, + defaultValue: t('theming', 'a safe home for all your data'), + type: 'text', + displayName: t('theming', 'Slogan'), + placeholder: t('theming', 'Slogan'), + maxlength: 500, + }, +] + +const primaryColorPickerField = { + name: 'primary_color', + value: primaryColor, + defaultValue: '#0082c9', + displayName: t('theming', 'Primary color'), + description: t('theming', 'The primary color is used for highlighting elements like important buttons. It might get slightly adjusted depending on the current color schema.'), +} + +const advancedTextFields = [ + { + name: 'imprintUrl', + value: legalNoticeUrl, + defaultValue: '', + type: 'url', + displayName: t('theming', 'Legal notice link'), + placeholder: 'https://…', + maxlength: 500, + }, + { + name: 'privacyUrl', + value: privacyPolicyUrl, + defaultValue: '', + type: 'url', + displayName: t('theming', 'Privacy policy link'), + placeholder: 'https://…', + maxlength: 500, + }, +] + +const advancedFileInputFields = [ + { + name: 'logoheader', + mimeName: 'logoheaderMime', + mimeValue: logoheaderMime, + defaultMimeValue: '', + displayName: t('theming', 'Header logo'), + ariaLabel: t('theming', 'Upload new header logo'), + }, + { + name: 'favicon', + mimeName: 'faviconMime', + mimeValue: faviconMime, + defaultMimeValue: '', + displayName: t('theming', 'Favicon'), + ariaLabel: t('theming', 'Upload new favicon'), + }, +] + +const userThemingField = { + name: 'disable-user-theming', + value: userThemingDisabled, + defaultValue: false, + displayName: t('theming', 'User settings'), + label: t('theming', 'Disable user theming'), + description: t('theming', 'Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.'), +} + +export default { + name: 'AdminTheming', + + components: { + AppMenuSection, + CheckboxField, + ColorPickerField, + FileInputField, + NcNoteCard, + NcSettingsSection, + TextField, + }, + + data() { + return { + backgroundMime, + backgroundURL, + backgroundColor, + defaultBackgroundColor: '#0069c3', + + logoMime, + + textFields, + primaryColorPickerField, + advancedTextFields, + advancedFileInputFields, + userThemingField, + defaultApps, + + canThemeIcons, + docUrl, + docUrlIcons, + isThemable, + notThemableErrorMessage, + } + }, + + computed: { + cssBackgroundImage() { + if (this.backgroundURL) { + return `url('${this.backgroundURL}')` + } + return 'unset' + }, + }, + + watch: { + backgroundMime() { + if (this.backgroundMime === '') { + // Reset URL to default value for preview + this.backgroundURL = defaultBackgroundURL + } else if (this.backgroundMime === 'backgroundColor') { + // Reset URL to empty image when only color is configured + this.backgroundURL = '' + } + }, + async backgroundURL() { + // When the background is changed we need to emulate the background color change + if (this.backgroundURL !== '') { + const color = await this.calculateDefaultBackground() + this.defaultBackgroundColor = color + this.backgroundColor = color + } + }, + }, + + async mounted() { + if (this.backgroundURL) { + this.defaultBackgroundColor = await this.calculateDefaultBackground() + } + }, + + methods: { + refreshStyles, + + /** + * Same as on server - if a user uploads an image the mean color will be set as the background color + */ + calculateDefaultBackground() { + const toHex = (num) => `00${num.toString(16)}`.slice(-2) + + return new Promise((resolve, reject) => { + const img = new Image() + img.src = this.backgroundURL + img.onload = () => { + const context = document.createElement('canvas').getContext('2d') + context.imageSmoothingEnabled = true + context.drawImage(img, 0, 0, 1, 1) + resolve('#' + [...context.getImageData(0, 0, 1, 1).data.slice(0, 3)].map(toHex).join('')) + } + img.onerror = reject + }) + }, + }, +} +</script> + +<style lang="scss" scoped> +.admin-theming, +.admin-theming-advanced { + display: flex; + flex-direction: column; + gap: 8px 0; +} + +.admin-theming { + &__preview { + width: 230px; + height: 140px; + background-size: cover; + background-position: center; + text-align: center; + margin-top: 10px; + background-color: v-bind('backgroundColor'); + background-image: v-bind('cssBackgroundImage'); + + &-logo { + width: 20%; + height: 20%; + margin-top: 20px; + display: inline-block; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + background-image: var(--image-logo, url('../../../core/img/logo/logo.svg')); + } + } +} +</style> diff --git a/apps/theming/src/UserTheming.vue b/apps/theming/src/UserTheming.vue new file mode 100644 index 00000000000..baebf09bcc5 --- /dev/null +++ b/apps/theming/src/UserTheming.vue @@ -0,0 +1,336 @@ +<!-- + - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <section> + <NcSettingsSection :name="t('theming', 'Appearance and accessibility settings')" + class="theming"> + <!-- eslint-disable-next-line vue/no-v-html --> + <p v-html="description" /> + <!-- eslint-disable-next-line vue/no-v-html --> + <p v-html="descriptionDetail" /> + + <div class="theming__preview-list"> + <ItemPreview v-for="theme in themes" + :key="theme.id" + :enforced="theme.id === enforceTheme" + :selected="selectedTheme.id === theme.id" + :theme="theme" + :unique="themes.length === 1" + type="theme" + @change="changeTheme" /> + </div> + + <div class="theming__preview-list"> + <ItemPreview v-for="theme in fonts" + :key="theme.id" + :selected="theme.enabled" + :theme="theme" + :unique="fonts.length === 1" + type="font" + @change="changeFont" /> + </div> + + <h3>{{ t('theming', 'Misc accessibility options') }}</h3> + <NcCheckboxRadioSwitch type="checkbox" + :checked="enableBlurFilter === 'yes'" + :indeterminate="enableBlurFilter === ''" + @update:checked="changeEnableBlurFilter"> + {{ t('theming', 'Enable blur background filter (may increase GPU load)') }} + </NcCheckboxRadioSwitch> + </NcSettingsSection> + + <NcSettingsSection :name="t('theming', 'Primary color')" + :description="isUserThemingDisabled + ? t('theming', 'Customization has been disabled by your administrator') + : t('theming', 'Set a primary color to highlight important elements. The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.')"> + <UserPrimaryColor v-if="!isUserThemingDisabled" + ref="primaryColor" + @refresh-styles="refreshGlobalStyles" /> + </NcSettingsSection> + + <NcSettingsSection class="background" + :name="t('theming', 'Background and color')" + :description="isUserThemingDisabled + ? t('theming', 'Customization has been disabled by your administrator') + : t('theming', 'The background can be set to an image from the default set, a custom uploaded image, or a plain color.')"> + <BackgroundSettings v-if="!isUserThemingDisabled" + class="background__grid" + @update:background="refreshGlobalStyles" /> + </NcSettingsSection> + + <NcSettingsSection :name="t('theming', 'Keyboard shortcuts')" + :description="t('theming', 'In some cases keyboard shortcuts can interfere with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps.')"> + <NcCheckboxRadioSwitch class="theming__preview-toggle" + :checked.sync="shortcutsDisabled" + type="switch" + @change="changeShortcutsDisabled"> + {{ t('theming', 'Disable all keyboard shortcuts') }} + </NcCheckboxRadioSwitch> + </NcSettingsSection> + + <UserAppMenuSection /> + </section> +</template> + +<script> +import { showError } from '@nextcloud/dialogs' +import { loadState } from '@nextcloud/initial-state' +import { generateOcsUrl } from '@nextcloud/router' +import { refreshStyles } from './helpers/refreshStyles' + +import axios, { isAxiosError } from '@nextcloud/axios' + +import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' +import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection' + +import BackgroundSettings from './components/BackgroundSettings.vue' +import ItemPreview from './components/ItemPreview.vue' +import UserAppMenuSection from './components/UserAppMenuSection.vue' +import UserPrimaryColor from './components/UserPrimaryColor.vue' + +const availableThemes = loadState('theming', 'themes', []) +const enforceTheme = loadState('theming', 'enforceTheme', '') +const shortcutsDisabled = loadState('theming', 'shortcutsDisabled', false) +const enableBlurFilter = loadState('theming', 'enableBlurFilter', '') + +const isUserThemingDisabled = loadState('theming', 'isUserThemingDisabled') + +export default { + name: 'UserTheming', + + components: { + ItemPreview, + NcCheckboxRadioSwitch, + NcSettingsSection, + BackgroundSettings, + UserAppMenuSection, + UserPrimaryColor, + }, + + data() { + return { + availableThemes, + + // Admin defined configs + enforceTheme, + shortcutsDisabled, + isUserThemingDisabled, + + enableBlurFilter, + } + }, + + computed: { + themes() { + return this.availableThemes.filter(theme => theme.type === 1) + }, + + fonts() { + return this.availableThemes.filter(theme => theme.type === 2) + }, + + // Selected theme, fallback on first (default) if none + selectedTheme() { + return this.themes.find(theme => theme.enabled === true) || this.themes[0] + }, + + description() { + return t( + 'theming', + 'Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {linkstart}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level.', + { + linkstart: '<a target="_blank" href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noreferrer nofollow">', + linkend: '</a>', + }, + { + escape: false, + }, + ) + }, + + descriptionDetail() { + return t( + 'theming', + 'If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!', + { + issuetracker: '<a target="_blank" href="https://github.com/nextcloud/server/issues/" rel="noreferrer nofollow">', + designteam: '<a target="_blank" href="https://nextcloud.com/design" rel="noreferrer nofollow">', + linkend: '</a>', + }, + { + escape: false, + }, + ) + }, + }, + + watch: { + shortcutsDisabled(newState) { + this.changeShortcutsDisabled(newState) + }, + }, + + methods: { + // Refresh server-side generated theming CSS + async refreshGlobalStyles() { + await refreshStyles() + this.$nextTick(() => this.$refs.primaryColor.reload()) + }, + + changeTheme({ enabled, id }) { + // Reset selected and select new one + this.themes.forEach(theme => { + if (theme.id === id && enabled) { + theme.enabled = true + return + } + theme.enabled = false + }) + + this.updateBodyAttributes() + this.selectItem(enabled, id) + }, + + changeFont({ enabled, id }) { + // Reset selected and select new one + this.fonts.forEach(font => { + if (font.id === id && enabled) { + font.enabled = true + return + } + font.enabled = false + }) + + this.updateBodyAttributes() + this.selectItem(enabled, id) + }, + + async changeShortcutsDisabled(newState) { + if (newState) { + await axios({ + url: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', { + appId: 'theming', + configKey: 'shortcuts_disabled', + }), + data: { + configValue: 'yes', + }, + method: 'POST', + }) + } else { + await axios({ + url: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', { + appId: 'theming', + configKey: 'shortcuts_disabled', + }), + method: 'DELETE', + }) + } + }, + + async changeEnableBlurFilter() { + this.enableBlurFilter = this.enableBlurFilter === 'no' ? 'yes' : 'no' + await axios({ + url: generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', { + appId: 'theming', + configKey: 'force_enable_blur_filter', + }), + data: { + configValue: this.enableBlurFilter, + }, + method: 'POST', + }) + // Refresh the styles + this.$emit('update:background') + }, + + updateBodyAttributes() { + const enabledThemesIDs = this.themes.filter(theme => theme.enabled === true).map(theme => theme.id) + const enabledFontsIDs = this.fonts.filter(font => font.enabled === true).map(font => font.id) + + this.themes.forEach(theme => { + document.body.toggleAttribute(`data-theme-${theme.id}`, theme.enabled) + }) + this.fonts.forEach(font => { + document.body.toggleAttribute(`data-theme-${font.id}`, font.enabled) + }) + + document.body.setAttribute('data-themes', [...enabledThemesIDs, ...enabledFontsIDs].join(',')) + }, + + /** + * Commit a change and force reload css + * Fetching the file again will trigger the server update + * + * @param {boolean} enabled the theme state + * @param {string} themeId the theme ID to change + */ + async selectItem(enabled, themeId) { + try { + if (enabled) { + await axios({ + url: generateOcsUrl('apps/theming/api/v1/theme/{themeId}/enable', { themeId }), + method: 'PUT', + }) + } else { + await axios({ + url: generateOcsUrl('apps/theming/api/v1/theme/{themeId}', { themeId }), + method: 'DELETE', + }) + } + + } catch (error) { + console.error('theming: Unable to apply setting.', error) + let message = t('theming', 'Unable to apply the setting.') + if (isAxiosError(error) && error.response.data.ocs?.meta?.message) { + message = `${error.response.data.ocs.meta.message}. ${message}` + } + showError(message) + } + }, + }, +} +</script> + +<style lang="scss" scoped> +.theming { + // Limit width of settings sections for readability + p { + max-width: 800px; + } + + // Proper highlight for links and focus feedback + :deep(a) { + font-weight: bold; + + &:hover, + &:focus { + text-decoration: underline; + } + } + + &__preview-list { + --gap: 30px; + display: grid; + margin-top: var(--gap); + column-gap: var(--gap); + row-gap: var(--gap); + } +} + +.background { + &__grid { + margin-top: 30px; + } +} + +@media (max-width: 1440px) { + .theming__preview-list { + display: flex; + flex-direction: column; + } +} +</style> diff --git a/apps/theming/src/admin-settings.js b/apps/theming/src/admin-settings.js new file mode 100644 index 00000000000..622837658f9 --- /dev/null +++ b/apps/theming/src/admin-settings.js @@ -0,0 +1,18 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +import { getCSPNonce } from '@nextcloud/auth' +import Vue from 'vue' + +import App from './AdminTheming.vue' + +// eslint-disable-next-line camelcase +__webpack_nonce__ = getCSPNonce() + +Vue.prototype.OC = OC +Vue.prototype.t = t + +const View = Vue.extend(App) +const theming = new View() +theming.$mount('#admin-theming') diff --git a/apps/theming/src/components/AppOrderSelector.vue b/apps/theming/src/components/AppOrderSelector.vue new file mode 100644 index 00000000000..9c065211bc1 --- /dev/null +++ b/apps/theming/src/components/AppOrderSelector.vue @@ -0,0 +1,199 @@ +<!-- + - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <Fragment> + <div :id="statusInfoId" + aria-live="polite" + class="hidden-visually" + role="status"> + {{ statusInfo }} + </div> + <ol ref="listElement" data-cy-app-order class="order-selector"> + <AppOrderSelectorElement v-for="app,index in appList" + :key="`${app.id}${renderCount}`" + ref="selectorElements" + :app="app" + :aria-details="ariaDetails" + :aria-describedby="statusInfoId" + :is-first="index === 0 || !!appList[index - 1].default" + :is-last="index === value.length - 1" + v-on="app.default ? {} : { + 'move:up': () => moveUp(index), + 'move:down': () => moveDown(index), + 'update:focus': () => updateStatusInfo(index), + }" /> + </ol> + </Fragment> +</template> + +<script lang="ts"> +import type { PropType } from 'vue' + +import { translate as t } from '@nextcloud/l10n' +import { useSortable } from '@vueuse/integrations/useSortable' +import { computed, defineComponent, onUpdated, ref } from 'vue' +import { Fragment } from 'vue-frag' + +import AppOrderSelectorElement from './AppOrderSelectorElement.vue' + +export interface IApp { + id: string // app id + icon: string // path to the icon svg + label: string // display name + default?: boolean // force app as default app + app?: string +} + +export default defineComponent({ + name: 'AppOrderSelector', + components: { + AppOrderSelectorElement, + Fragment, + }, + props: { + /** + * Details like status information that need to be forwarded to the interactive elements + */ + ariaDetails: { + type: String, + default: null, + }, + /** + * List of apps to reorder + */ + value: { + type: Array as PropType<IApp[]>, + required: true, + }, + }, + emits: { + /** + * Update the apps list on reorder + * @param value The new value of the app list + */ + 'update:value': (value: IApp[]) => Array.isArray(value), + }, + setup(props, { emit }) { + /** + * The Element that contains the app list + */ + const listElement = ref<HTMLElement | null>(null) + + /** + * The app list with setter that will ement the `update:value` event + */ + const appList = computed({ + get: () => props.value, + // Ensure the sortable.js does not mess with the default attribute + set: (list) => { + const newValue = [...list].sort((a, b) => ((b.default ? 1 : 0) - (a.default ? 1 : 0)) || list.indexOf(a) - list.indexOf(b)) + if (newValue.some(({ id }, index) => id !== props.value[index].id)) { + emit('update:value', newValue) + } else { + // forceUpdate as the DOM has changed because of a drag event, but the reactive state has not -> wrong state + renderCount.value += 1 + } + }, + }) + + /** + * Helper to force rerender the list in case of a invalid drag event + */ + const renderCount = ref(0) + + /** + * Handle drag & drop sorting + */ + useSortable(listElement, appList, { filter: '.order-selector-element--disabled' }) + + /** + * Array of all AppOrderSelectorElement components used to for keeping the focus after button click + */ + const selectorElements = ref<InstanceType<typeof AppOrderSelectorElement>[]>([]) + + /** + * We use the updated hook here to verify all selector elements keep the focus on the last pressed button + * This is needed to be done in this component to make sure Sortable.JS has finished sorting the elements before focussing an element + */ + onUpdated(() => { + selectorElements.value.forEach(element => element.keepFocus()) + }) + + /** + * Handle element is moved up + * @param index The index of the element that is moved + */ + const moveUp = (index: number) => { + const before = index > 1 ? props.value.slice(0, index - 1) : [] + // skip if not possible, because of default default app + if (props.value[index - 1]?.default) { + return + } + + const after = [props.value[index - 1]] + if (index < props.value.length - 1) { + after.push(...props.value.slice(index + 1)) + } + emit('update:value', [...before, props.value[index], ...after]) + } + + /** + * Handle element is moved down + * @param index The index of the element that is moved + */ + const moveDown = (index: number) => { + const before = index > 0 ? props.value.slice(0, index) : [] + before.push(props.value[index + 1]) + + const after = index < (props.value.length - 2) ? props.value.slice(index + 2) : [] + emit('update:value', [...before, props.value[index], ...after]) + } + + /** + * Additional status information to show to screen reader users for accessibility + */ + const statusInfo = ref('') + + /** + * ID to be used on the status info element + */ + const statusInfoId = `sorting-status-info-${(Math.random() + 1).toString(36).substring(7)}` + + /** + * Update the status information for the currently selected app + * @param index Index of the app that is currently selected + */ + const updateStatusInfo = (index: number) => { + statusInfo.value = t('theming', 'Current selected app: {app}, position {position} of {total}', { + app: props.value[index].label, + position: index + 1, + total: props.value.length, + }) + } + + return { + appList, + listElement, + + moveDown, + moveUp, + + statusInfoId, + statusInfo, + updateStatusInfo, + + renderCount, + selectorElements, + } + }, +}) +</script> + +<style scoped lang="scss"> +.order-selector { + width: max-content; + min-width: 260px; // align with NcSelect +} +</style> diff --git a/apps/theming/src/components/AppOrderSelectorElement.vue b/apps/theming/src/components/AppOrderSelectorElement.vue new file mode 100644 index 00000000000..fc41e8e6165 --- /dev/null +++ b/apps/theming/src/components/AppOrderSelectorElement.vue @@ -0,0 +1,224 @@ +<!-- + - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <li :data-cy-app-order-element="app.id" + :class="{ + 'order-selector-element': true, + 'order-selector-element--disabled': app.default + }" + @focusin="$emit('update:focus')"> + <svg width="20" + height="20" + viewBox="0 0 20 20" + role="presentation"> + <image preserveAspectRatio="xMinYMin meet" + x="0" + y="0" + width="20" + height="20" + :xlink:href="app.icon" + class="order-selector-element__icon" /> + </svg> + + <div class="order-selector-element__label"> + {{ app.label ?? app.id }} + </div> + + <div class="order-selector-element__actions"> + <NcButton v-show="!isFirst && !app.default" + ref="buttonUp" + :aria-label="t('settings', 'Move up')" + :aria-describedby="ariaDescribedby" + :aria-details="ariaDetails" + data-cy-app-order-button="up" + type="tertiary-no-background" + @click="moveUp"> + <template #icon> + <IconArrowUp :size="20" /> + </template> + </NcButton> + <div v-show="isFirst || !!app.default" aria-hidden="true" class="order-selector-element__placeholder" /> + <NcButton v-show="!isLast && !app.default" + ref="buttonDown" + :aria-label="t('settings', 'Move down')" + :aria-describedby="ariaDescribedby" + :aria-details="ariaDetails" + data-cy-app-order-button="down" + type="tertiary-no-background" + @click="moveDown"> + <template #icon> + <IconArrowDown :size="20" /> + </template> + </NcButton> + <div v-show="isLast || !!app.default" aria-hidden="true" class="order-selector-element__placeholder" /> + </div> + </li> +</template> + +<script lang="ts"> +import type { PropType } from 'vue' + +import { translate as t } from '@nextcloud/l10n' +import { defineComponent, nextTick, ref } from 'vue' + +import IconArrowDown from 'vue-material-design-icons/ArrowDown.vue' +import IconArrowUp from 'vue-material-design-icons/ArrowUp.vue' +import NcButton from '@nextcloud/vue/components/NcButton' + +interface IApp { + id: string // app id + icon: string // path to the icon svg + label?: string // display name + default?: boolean // for app as default app +} + +export default defineComponent({ + name: 'AppOrderSelectorElement', + components: { + IconArrowDown, + IconArrowUp, + NcButton, + }, + props: { + /** + * Needs to be forwarded to the buttons (as interactive elements) + */ + ariaDescribedby: { + type: String, + default: null, + }, + ariaDetails: { + type: String, + default: null, + }, + app: { + type: Object as PropType<IApp>, + required: true, + }, + isFirst: { + type: Boolean, + default: false, + }, + isLast: { + type: Boolean, + default: false, + }, + }, + emits: { + 'move:up': () => true, + 'move:down': () => true, + /** + * We need this as Sortable.js removes all native focus event listeners + */ + 'update:focus': () => true, + }, + setup(props, { emit }) { + const buttonUp = ref() + const buttonDown = ref() + + /** + * Used to decide if we need to trigger focus() an a button on update + */ + let needsFocus = 0 + + /** + * Handle move up, ensure focus is kept on the button + */ + const moveUp = () => { + emit('move:up') + needsFocus = 1 // request focus on buttonUp + } + + /** + * Handle move down, ensure focus is kept on the button + */ + const moveDown = () => { + emit('move:down') + needsFocus = -1 // request focus on buttonDown + } + + /** + * Reset the focus on the last used button. + * If the button is now visible anymore (because this element is the first/last) then the opposite button is focussed + * + * This function is exposed to the "AppOrderSelector" component which triggers this when the list was successfully rerendered + */ + const keepFocus = () => { + if (needsFocus !== 0) { + // focus requested + if ((needsFocus === 1 || props.isLast) && !props.isFirst) { + // either requested to btn up and it is not the first, or it was requested to btn down but it is the last + nextTick(() => buttonUp.value.$el.focus()) + } else { + nextTick(() => buttonDown.value.$el.focus()) + } + } + needsFocus = 0 + } + + return { + buttonUp, + buttonDown, + + moveUp, + moveDown, + + keepFocus, + + t, + } + }, +}) +</script> + +<style lang="scss" scoped> +.order-selector-element { + // hide default styling + list-style: none; + // Align children + display: flex; + flex-direction: row; + align-items: center; + // Spacing + gap: 12px; + padding-inline: 12px; + + &:hover { + background-color: var(--color-background-hover); + border-radius: var(--border-radius-large); + } + + &--disabled { + border-color: var(--color-text-maxcontrast); + color: var(--color-text-maxcontrast); + + .order-selector-element__icon { + opacity: 75%; + } + } + + &__actions { + flex: 0 0; + display: flex; + flex-direction: row; + gap: 6px; + } + + &__label { + flex: 1 1; + text-overflow: ellipsis; + overflow: hidden; + } + + &__placeholder { + height: 44px; + width: 44px; + } + + &__icon { + filter: var(--background-invert-if-bright); + } +} +</style> diff --git a/apps/theming/src/components/BackgroundSettings.vue b/apps/theming/src/components/BackgroundSettings.vue new file mode 100644 index 00000000000..58b76dd9602 --- /dev/null +++ b/apps/theming/src/components/BackgroundSettings.vue @@ -0,0 +1,354 @@ +<!-- + - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <div class="background-selector" data-user-theming-background-settings> + <!-- Custom background --> + <button :aria-pressed="backgroundImage === 'custom'" + :class="{ + 'icon-loading': loading === 'custom', + 'background background__filepicker': true, + 'background--active': backgroundImage === 'custom' + }" + data-user-theming-background-custom + tabindex="0" + @click="pickFile"> + {{ t('theming', 'Custom background') }} + <ImageEdit v-if="backgroundImage !== 'custom'" :size="20" /> + <Check :size="44" /> + </button> + + <!-- Custom color picker --> + <NcColorPicker v-model="Theming.backgroundColor" @update:value="debouncePickColor"> + <button :class="{ + 'icon-loading': loading === 'color', + 'background background__color': true, + 'background--active': backgroundImage === 'color' + }" + :aria-pressed="backgroundImage === 'color'" + :data-color="Theming.backgroundColor" + :data-color-bright="invertTextColor(Theming.backgroundColor)" + :style="{ backgroundColor: Theming.backgroundColor, '--border-color': Theming.backgroundColor}" + data-user-theming-background-color + tabindex="0" + @click="backgroundImage !== 'color' && debouncePickColor(Theming.backgroundColor)"> + {{ t('theming', 'Plain background') /* TRANSLATORS: Background using a single color */ }} + <ColorPalette v-if="backgroundImage !== 'color'" :size="20" /> + <Check :size="44" /> + </button> + </NcColorPicker> + + <!-- Default background --> + <button :aria-pressed="backgroundImage === 'default'" + :class="{ + 'icon-loading': loading === 'default', + 'background background__default': true, + 'background--active': backgroundImage === 'default' + }" + :data-color-bright="invertTextColor(Theming.defaultBackgroundColor)" + :style="{ '--border-color': Theming.defaultBackgroundColor }" + data-user-theming-background-default + tabindex="0" + @click="setDefault"> + {{ t('theming', 'Default background') }} + <Check :size="44" /> + </button> + + <!-- Background set selection --> + <button v-for="shippedBackground in shippedBackgrounds" + :key="shippedBackground.name" + :title="shippedBackground.details.attribution" + :aria-label="shippedBackground.details.description" + :aria-pressed="backgroundImage === shippedBackground.name" + :class="{ + 'background background__shipped': true, + 'icon-loading': loading === shippedBackground.name, + 'background--active': backgroundImage === shippedBackground.name + }" + :data-color-bright="invertTextColor(shippedBackground.details.background_color)" + :data-user-theming-background-shipped="shippedBackground.name" + :style="{ backgroundImage: 'url(' + shippedBackground.preview + ')', '--border-color': shippedBackground.details.primary_color }" + tabindex="0" + @click="setShipped(shippedBackground.name)"> + <Check :size="44" /> + </button> + </div> +</template> + +<script> +import { generateFilePath, generateUrl } from '@nextcloud/router' +import { getFilePickerBuilder, showError } from '@nextcloud/dialogs' +import { loadState } from '@nextcloud/initial-state' +import axios from '@nextcloud/axios' +import debounce from 'debounce' +import NcColorPicker from '@nextcloud/vue/components/NcColorPicker' + +import Check from 'vue-material-design-icons/Check.vue' +import ImageEdit from 'vue-material-design-icons/ImageEdit.vue' +import ColorPalette from 'vue-material-design-icons/PaletteOutline.vue' + +const shippedBackgroundList = loadState('theming', 'shippedBackgrounds') +const backgroundImage = loadState('theming', 'userBackgroundImage') +const { + backgroundImage: defaultBackgroundImage, + // backgroundColor: defaultBackgroundColor, + backgroundMime: defaultBackgroundMime, + defaultShippedBackground, +} = loadState('theming', 'themingDefaults') + +const prefixWithBaseUrl = (url) => generateFilePath('theming', '', 'img/background/') + url + +export default { + name: 'BackgroundSettings', + + components: { + Check, + ColorPalette, + ImageEdit, + NcColorPicker, + }, + + data() { + return { + loading: false, + Theming: loadState('theming', 'data', {}), + + // User background image and color settings + backgroundImage, + } + }, + + computed: { + shippedBackgrounds() { + return Object.keys(shippedBackgroundList) + .filter((background) => { + // If the admin did not changed the global background + // let's hide the default background to not show it twice + return background !== defaultShippedBackground || !this.isGlobalBackgroundDefault + }) + .map((fileName) => { + return { + name: fileName, + url: prefixWithBaseUrl(fileName), + preview: prefixWithBaseUrl('preview/' + fileName), + details: shippedBackgroundList[fileName], + } + }) + }, + + isGlobalBackgroundDefault() { + return defaultBackgroundMime === '' + }, + + isGlobalBackgroundDeleted() { + return defaultBackgroundMime === 'backgroundColor' + }, + + cssDefaultBackgroundImage() { + return `url('${defaultBackgroundImage}')` + }, + }, + + methods: { + /** + * Do we need to invert the text if color is too bright? + * + * @param {string} color the hex color + */ + invertTextColor(color) { + return this.calculateLuma(color) > 0.6 + }, + + /** + * Calculate luminance of provided hex color + * + * @param {string} color the hex color + */ + calculateLuma(color) { + const [red, green, blue] = this.hexToRGB(color) + return (0.2126 * red + 0.7152 * green + 0.0722 * blue) / 255 + }, + + /** + * Convert hex color to RGB + * + * @param {string} hex the hex color + */ + hexToRGB(hex) { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) + return result + ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] + : null + }, + + /** + * Update local state + * + * @param {object} data destructuring object + * @param {string} data.backgroundColor background color value + * @param {string} data.backgroundImage background image value + * @param {string} data.version cache buster number + * @see https://github.com/nextcloud/server/blob/c78bd45c64d9695724fc44fe8453a88824b85f2f/apps/theming/lib/Controller/UserThemeController.php#L187-L191 + */ + async update(data) { + // Update state + this.backgroundImage = data.backgroundImage + this.Theming.backgroundColor = data.backgroundColor + + // Notify parent and reload style + this.$emit('update:background') + this.loading = false + }, + + async setDefault() { + this.loading = 'default' + const result = await axios.post(generateUrl('/apps/theming/background/default')) + this.update(result.data) + }, + + async setShipped(shipped) { + this.loading = shipped + const result = await axios.post(generateUrl('/apps/theming/background/shipped'), { value: shipped }) + this.update(result.data) + }, + + async setFile(path) { + this.loading = 'custom' + const result = await axios.post(generateUrl('/apps/theming/background/custom'), { value: path }) + this.update(result.data) + }, + + async removeBackground() { + this.loading = 'remove' + const result = await axios.delete(generateUrl('/apps/theming/background/custom')) + this.update(result.data) + }, + + async pickColor(color) { + this.loading = 'color' + const { data } = await axios.post(generateUrl('/apps/theming/background/color'), { color: color || '#0082c9' }) + this.update(data) + }, + + debouncePickColor: debounce(function(...args) { + this.pickColor(...args) + }, 1000), + + pickFile() { + const picker = getFilePickerBuilder(t('theming', 'Select a background from your files')) + .allowDirectories(false) + .setMimeTypeFilter(['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml', 'image/svg']) + .setMultiSelect(false) + .addButton({ + id: 'select', + label: t('theming', 'Select background'), + callback: (nodes) => { + this.applyFile(nodes[0]?.path) + }, + type: 'primary', + }) + .build() + picker.pick() + }, + + async applyFile(path) { + if (!path || typeof path !== 'string' || path.trim().length === 0 || path === '/') { + console.error('No valid background have been selected', { path }) + showError(t('theming', 'No background has been selected')) + return + } + + this.loading = 'custom' + this.setFile(path) + }, + }, +} +</script> + +<style scoped lang="scss"> +.background-selector { + display: flex; + flex-wrap: wrap; + justify-content: center; + + .background-color { + display: flex; + justify-content: center; + align-items: center; + width: 176px; + height: 96px; + margin: 8px; + border-radius: var(--border-radius-large); + background-color: var(--color-primary); + } + + .background { + overflow: hidden; + width: 176px; + height: 96px; + margin: 8px; + text-align: center; + word-wrap: break-word; + hyphens: auto; + border: 2px solid var(--color-main-background); + border-radius: var(--border-radius-large); + background-position: center center; + background-size: cover; + + &__filepicker { + background-color: var(--color-background-dark); + + &.background--active { + color: var(--color-background-plain-text); + background-image: var(--image-background); + } + } + + &__default { + background-color: var(--color-background-plain); + background-image: linear-gradient(to bottom, rgba(23, 23, 23, 0.5), rgba(23, 23, 23, 0.5)), v-bind(cssDefaultBackgroundImage); + } + + &__filepicker, &__default, &__color { + border-color: var(--color-border); + } + + // Over a background image + &__default, + &__shipped { + color: white; + } + + // Text and svg icon dark on bright background + &[data-color-bright] { + color: black; + } + + &--active, + &:hover, + &:focus { + outline: 2px solid var(--color-main-text) !important; + border-color: var(--color-main-background) !important; + } + + // Icon + span { + margin: 4px; + } + + .check-icon { + display: none; + } + + &--active:not(.icon-loading) { + .check-icon { + // Show checkmark + display: block !important; + } + } + } +} + +</style> diff --git a/apps/theming/src/components/ItemPreview.vue b/apps/theming/src/components/ItemPreview.vue new file mode 100644 index 00000000000..e4a1acd3e2a --- /dev/null +++ b/apps/theming/src/components/ItemPreview.vue @@ -0,0 +1,174 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <div :class="'theming__preview--' + theme.id" class="theming__preview"> + <div class="theming__preview-image" :style="{ backgroundImage: 'url(' + img + ')' }" @click="onToggle" /> + <div class="theming__preview-description"> + <h3>{{ theme.title }}</h3> + <p class="theming__preview-explanation"> + {{ theme.description }} + </p> + <span v-if="enforced" class="theming__preview-warning" role="note"> + {{ t('theming', 'Theme selection is enforced') }} + </span> + + <!-- Only show checkbox if we can change themes --> + <NcCheckboxRadioSwitch v-show="!enforced" + class="theming__preview-toggle" + :checked.sync="checked" + :disabled="enforced" + :name="name" + :type="switchType"> + {{ theme.enableLabel }} + </NcCheckboxRadioSwitch> + </div> + </div> +</template> + +<script> +import { generateFilePath } from '@nextcloud/router' +import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' + +export default { + name: 'ItemPreview', + components: { + NcCheckboxRadioSwitch, + }, + props: { + enforced: { + type: Boolean, + default: false, + }, + selected: { + type: Boolean, + default: false, + }, + theme: { + type: Object, + required: true, + }, + type: { + type: String, + default: '', + }, + unique: { + type: Boolean, + default: false, + }, + }, + computed: { + switchType() { + return this.unique ? 'switch' : 'radio' + }, + + name() { + return !this.unique ? this.type : null + }, + + img() { + return generateFilePath('theming', 'img', this.theme.id + '.jpg') + }, + + checked: { + get() { + return this.selected + }, + set(checked) { + if (this.enforced) { + return + } + + console.debug('Changed theme', this.theme.id, checked) + + // If this is a radio, we can only enable + if (!this.unique) { + this.$emit('change', { enabled: true, id: this.theme.id }) + return + } + + // If this is a switch, we can disable the theme + this.$emit('change', { enabled: checked === true, id: this.theme.id }) + }, + }, + }, + + methods: { + onToggle() { + if (this.enforced) { + return + } + + if (this.switchType === 'radio') { + this.checked = true + return + } + + // Invert state + this.checked = !this.checked + }, + }, +} +</script> +<style lang="scss" scoped> +@use 'sass:math'; + +.theming__preview { + // We make previews on 16/10 screens + --ratio: 16; + position: relative; + display: flex; + justify-content: flex-start; + + &, + * { + user-select: none; + } + + &-image { + flex-basis: calc(16px * var(--ratio)); + flex-shrink: 0; + height: calc(10px * var(--ratio)); + margin-inline-end: var(--gap); + cursor: pointer; + border-radius: var(--border-radius); + background-repeat: no-repeat; + background-position: top left; + background-size: cover; + } + + &-explanation { + margin-bottom: 10px; + } + + &-description { + display: flex; + flex-direction: column; + + h3 { + font-weight: bold; + margin-bottom: 0; + } + + label { + padding: 12px 0; + } + } + + &-warning { + color: var(--color-warning); + } +} + +@media (max-width: math.div(1024px, 1.5)) { + .theming__preview { + flex-direction: column; + + &-image { + margin: 0; + } + } +} + +</style> diff --git a/apps/theming/src/components/UserAppMenuSection.vue b/apps/theming/src/components/UserAppMenuSection.vue new file mode 100644 index 00000000000..d4221190f6b --- /dev/null +++ b/apps/theming/src/components/UserAppMenuSection.vue @@ -0,0 +1,188 @@ +<!-- + - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <NcSettingsSection :name="t('theming', 'Navigation bar settings')"> + <p> + {{ t('theming', 'You can configure the app order used for the navigation bar. The first entry will be the default app, opened after login or when clicking on the logo.') }} + </p> + <NcNoteCard v-if="enforcedDefaultApp" :id="elementIdEnforcedDefaultApp" type="info"> + {{ t('theming', 'The default app can not be changed because it was configured by the administrator.') }} + </NcNoteCard> + <NcNoteCard v-if="hasAppOrderChanged" :id="elementIdAppOrderChanged" type="info"> + {{ t('theming', 'The app order was changed, to see it in action you have to reload the page.') }} + </NcNoteCard> + + <AppOrderSelector class="user-app-menu-order" + :aria-details="ariaDetailsAppOrder" + :value="appOrder" + @update:value="updateAppOrder" /> + + <NcButton data-test-id="btn-apporder-reset" + :disabled="!hasCustomAppOrder" + type="tertiary" + @click="resetAppOrder"> + <template #icon> + <IconUndo :size="20" /> + </template> + {{ t('theming', 'Reset default app order') }} + </NcButton> + </NcSettingsSection> +</template> + +<script lang="ts"> +import type { IApp } from './AppOrderSelector.vue' +import type { INavigationEntry } from '../../../../core/src/types/navigation.d.ts' + +import { showError } from '@nextcloud/dialogs' +import { loadState } from '@nextcloud/initial-state' +import { translate as t } from '@nextcloud/l10n' +import { generateOcsUrl } from '@nextcloud/router' +import { computed, defineComponent, ref } from 'vue' + +import axios from '@nextcloud/axios' +import AppOrderSelector from './AppOrderSelector.vue' +import IconUndo from 'vue-material-design-icons/Undo.vue' +import NcButton from '@nextcloud/vue/components/NcButton' +import NcNoteCard from '@nextcloud/vue/components/NcNoteCard' +import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection' + +/** The app order user setting */ +type IAppOrder = Record<string, { order: number, app?: string }> + +/** OCS responses */ +interface IOCSResponse<T> { + ocs: { + meta: unknown + data: T + } +} + +export default defineComponent({ + name: 'UserAppMenuSection', + components: { + AppOrderSelector, + IconUndo, + NcButton, + NcNoteCard, + NcSettingsSection, + }, + setup() { + const { + /** The app order currently defined by the user */ + userAppOrder, + /** The enforced default app set by the administrator (if any) */ + enforcedDefaultApp, + } = loadState<{ userAppOrder: IAppOrder, enforcedDefaultApp: string }>('theming', 'navigationBar') + + /** + * Array of all available apps, it is set by a core controller for the app menu, so it is always available + */ + const initialAppOrder = loadState<INavigationEntry[]>('core', 'apps') + .filter(({ type }) => type === 'link') + .map((app) => ({ ...app, label: app.name, default: app.default && app.id === enforcedDefaultApp })) + + /** + * Check if a custom app order is used or the default is shown + */ + const hasCustomAppOrder = ref(!Array.isArray(userAppOrder) || Object.values(userAppOrder).length > 0) + + /** + * Track if the app order has changed, so the user can be informed to reload + */ + const hasAppOrderChanged = computed(() => initialAppOrder.some(({ id }, index) => id !== appOrder.value[index].id)) + + /** ID of the "app order has changed" NcNodeCard, used for the aria-details of the apporder */ + const elementIdAppOrderChanged = 'theming-apporder-changed-infocard' + + /** ID of the "you can not change the default app" NcNodeCard, used for the aria-details of the apporder */ + const elementIdEnforcedDefaultApp = 'theming-apporder-changed-infocard' + + /** + * The aria-details value of the app order selector + * contains the space separated list of element ids of NcNoteCards + */ + const ariaDetailsAppOrder = computed(() => (hasAppOrderChanged.value ? `${elementIdAppOrderChanged} ` : '') + (enforcedDefaultApp ? elementIdEnforcedDefaultApp : '')) + + /** + * The current apporder (sorted by user) + */ + const appOrder = ref([...initialAppOrder]) + + /** + * Update the app order, called when the user sorts entries + * @param value The new app order value + */ + const updateAppOrder = (value: IApp[]) => { + const order: IAppOrder = {} + value.forEach(({ app, id }, index) => { + order[id] = { order: index, app } + }) + + saveSetting('apporder', order) + .then(() => { + appOrder.value = value as never + hasCustomAppOrder.value = true + }) + .catch((error) => { + console.warn('Could not set the app order', error) + showError(t('theming', 'Could not set the app order')) + }) + } + + /** + * Reset the app order to the default + */ + const resetAppOrder = async () => { + try { + await saveSetting('apporder', []) + hasCustomAppOrder.value = false + + // Reset our app order list + const { data } = await axios.get<IOCSResponse<INavigationEntry[]>>(generateOcsUrl('/core/navigation/apps'), { + headers: { + 'OCS-APIRequest': 'true', + }, + }) + appOrder.value = data.ocs.data.map((app) => ({ ...app, label: app.name, default: app.default && app.app === enforcedDefaultApp })) + } catch (error) { + console.warn(error) + showError(t('theming', 'Could not reset the app order')) + } + } + + const saveSetting = async (key: string, value: unknown) => { + const url = generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', { + appId: 'core', + configKey: key, + }) + return await axios.post(url, { + configValue: JSON.stringify(value), + }) + } + + return { + appOrder, + updateAppOrder, + resetAppOrder, + + enforcedDefaultApp, + hasAppOrderChanged, + hasCustomAppOrder, + + ariaDetailsAppOrder, + elementIdAppOrderChanged, + elementIdEnforcedDefaultApp, + + t, + } + }, +}) +</script> + +<style scoped lang="scss"> +.user-app-menu-order { + margin-block: 12px; +} +</style> diff --git a/apps/theming/src/components/UserPrimaryColor.vue b/apps/theming/src/components/UserPrimaryColor.vue new file mode 100644 index 00000000000..f10b8a01825 --- /dev/null +++ b/apps/theming/src/components/UserPrimaryColor.vue @@ -0,0 +1,160 @@ +<!-- + - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <div class="primary-color__wrapper"> + <NcColorPicker v-model="primaryColor" + data-user-theming-primary-color + @update:value="debouncedOnUpdate"> + <button ref="trigger" + class="color-container primary-color__trigger" + :style="{ 'background-color': primaryColor }" + data-user-theming-primary-color-trigger> + {{ t('theming', 'Primary color') }} + <NcLoadingIcon v-if="loading" /> + <IconColorPalette v-else :size="20" /> + </button> + </NcColorPicker> + <NcButton type="tertiary" :disabled="isdefaultPrimaryColor" @click="onReset"> + <template #icon> + <IconUndo :size="20" /> + </template> + {{ t('theming', 'Reset primary color') }} + </NcButton> + </div> +</template> + +<script lang="ts"> +import { showError } from '@nextcloud/dialogs' +import { loadState } from '@nextcloud/initial-state' +import { translate as t } from '@nextcloud/l10n' +import { generateOcsUrl } from '@nextcloud/router' +import { colord } from 'colord' +import { defineComponent } from 'vue' +import axios from '@nextcloud/axios' +import debounce from 'debounce' + +import NcButton from '@nextcloud/vue/components/NcButton' +import NcColorPicker from '@nextcloud/vue/components/NcColorPicker' +import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon' +import IconColorPalette from 'vue-material-design-icons/PaletteOutline.vue' +import IconUndo from 'vue-material-design-icons/UndoVariant.vue' + +const { primaryColor, defaultPrimaryColor } = loadState('theming', 'data', { primaryColor: '#0082c9', defaultPrimaryColor: '#0082c9' }) + +export default defineComponent({ + name: 'UserPrimaryColor', + + components: { + IconColorPalette, + IconUndo, + NcButton, + NcColorPicker, + NcLoadingIcon, + }, + + emits: ['refresh-styles'], + + data() { + return { + primaryColor, + loading: false, + } + }, + + computed: { + isdefaultPrimaryColor() { + return colord(this.primaryColor).isEqual(colord(defaultPrimaryColor)) + }, + + debouncedOnUpdate() { + return debounce(this.onUpdate, 1000) + }, + }, + + methods: { + t, + + /** + * Global styles are reloaded so we might need to update the current value + */ + reload() { + const trigger = this.$refs.trigger as HTMLButtonElement + const newColor = window.getComputedStyle(trigger).backgroundColor + if (newColor.toLowerCase() !== this.primaryColor) { + this.primaryColor = newColor + } + }, + + onReset() { + this.primaryColor = defaultPrimaryColor + this.onUpdate(null) + }, + + async onUpdate(value: string | null) { + this.loading = true + const url = generateOcsUrl('apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', { + appId: 'theming', + configKey: 'primary_color', + }) + try { + if (value) { + await axios.post(url, { + configValue: value, + }) + } else { + await axios.delete(url) + } + this.$emit('refresh-styles') + } catch (e) { + console.error('Could not update primary color', e) + showError(t('theming', 'Could not set primary color')) + } + this.loading = false + }, + }, +}) +</script> + +<style scoped lang="scss"> +.primary-color { + &__wrapper { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 12px; + } + + &__trigger { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + + background-color: var(--color-primary); + color: var(--color-primary-text); + width: 350px; + max-width: 100vw; + height: 96px; + + word-wrap: break-word; + hyphens: auto; + + border: 2px solid var(--color-main-background); + border-radius: var(--border-radius-large); + + &:active { + background-color: var(--color-primary-hover) !important; + } + + &:hover, + &:focus, + &:focus-visible { + border-color: var(--color-main-background) !important; + outline: 2px solid var(--color-main-text) !important; + } + } +} +</style> diff --git a/apps/theming/src/components/admin/AppMenuSection.vue b/apps/theming/src/components/admin/AppMenuSection.vue new file mode 100644 index 00000000000..bf229f15df4 --- /dev/null +++ b/apps/theming/src/components/admin/AppMenuSection.vue @@ -0,0 +1,126 @@ +<!-- + - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <NcSettingsSection :name="t('theming', 'Navigation bar settings')"> + <h3>{{ t('theming', 'Default app') }}</h3> + <p class="info-note"> + {{ t('theming', 'The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.') }} + </p> + + <NcCheckboxRadioSwitch :checked.sync="hasCustomDefaultApp" type="switch" data-cy-switch-default-app=""> + {{ t('theming', 'Use custom default app') }} + </NcCheckboxRadioSwitch> + + <template v-if="hasCustomDefaultApp"> + <h4>{{ t('theming', 'Global default app') }}</h4> + <NcSelect v-model="selectedApps" + :close-on-select="false" + :placeholder="t('theming', 'Global default apps')" + :options="allApps" + :multiple="true" /> + <h5>{{ t('theming', 'Default app priority') }}</h5> + <p class="info-note"> + {{ t('theming', 'If an app is not enabled for a user, the next app with lower priority is used.') }} + </p> + <AppOrderSelector :value.sync="selectedApps" /> + </template> + </NcSettingsSection> +</template> + +<script lang="ts"> +import type { INavigationEntry } from '../../../../../core/src/types/navigation' + +import { showError } from '@nextcloud/dialogs' +import { loadState } from '@nextcloud/initial-state' +import { translate as t } from '@nextcloud/l10n' +import { generateUrl } from '@nextcloud/router' +import { computed, defineComponent } from 'vue' + +import axios from '@nextcloud/axios' + +import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' +import NcSelect from '@nextcloud/vue/components/NcSelect' +import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection' +import AppOrderSelector from '../AppOrderSelector.vue' + +export default defineComponent({ + name: 'AppMenuSection', + components: { + AppOrderSelector, + NcCheckboxRadioSwitch, + NcSelect, + NcSettingsSection, + }, + props: { + defaultApps: { + type: Array, + required: true, + }, + }, + emits: { + 'update:defaultApps': (value: string[]) => Array.isArray(value) && value.every((id) => typeof id === 'string'), + }, + setup(props, { emit }) { + const hasCustomDefaultApp = computed({ + get: () => props.defaultApps.length > 0, + set: (checked: boolean) => { + if (checked) { + emit('update:defaultApps', ['dashboard', 'files']) + } else { + selectedApps.value = [] + } + }, + }) + + /** + * All enabled apps which can be navigated + */ + const allApps = loadState<INavigationEntry[]>('core', 'apps') + .map(({ id, name, icon }) => ({ label: name, id, icon })) + + /** + * Currently selected app, wrapps the setter + */ + const selectedApps = computed({ + get: () => props.defaultApps.map((id) => allApps.filter(app => app.id === id)[0]), + set(value) { + saveSetting('defaultApps', value.map(app => app.id)) + .then(() => emit('update:defaultApps', value.map(app => app.id))) + .catch(() => showError(t('theming', 'Could not set global default apps'))) + }, + }) + + const saveSetting = async (key: string, value: unknown) => { + const url = generateUrl('/apps/theming/ajax/updateAppMenu') + return await axios.put(url, { + setting: key, + value, + }) + } + + return { + allApps, + selectedApps, + hasCustomDefaultApp, + + t, + } + }, +}) +</script> + +<style scoped lang="scss"> +h3, h4 { + font-weight: bold; +} + +h4, h5 { + margin-block-start: 12px; +} + +.info-note { + color: var(--color-text-maxcontrast); +} +</style> diff --git a/apps/theming/src/components/admin/CheckboxField.vue b/apps/theming/src/components/admin/CheckboxField.vue new file mode 100644 index 00000000000..42d86ded4e7 --- /dev/null +++ b/apps/theming/src/components/admin/CheckboxField.vue @@ -0,0 +1,85 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <div class="field"> + <label :for="id">{{ displayName }}</label> + <div class="field__row"> + <NcCheckboxRadioSwitch :id="id" + type="switch" + :checked.sync="localValue" + @update:checked="save"> + {{ label }} + </NcCheckboxRadioSwitch> + </div> + + <p class="field__description"> + {{ description }} + </p> + + <NcNoteCard v-if="errorMessage" + type="error" + :show-alert="true"> + <p>{{ errorMessage }}</p> + </NcNoteCard> + </div> +</template> + +<script> +import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' +import NcNoteCard from '@nextcloud/vue/components/NcNoteCard' + +import TextValueMixin from '../../mixins/admin/TextValueMixin.js' + +export default { + name: 'CheckboxField', + + components: { + NcCheckboxRadioSwitch, + NcNoteCard, + }, + + mixins: [ + TextValueMixin, + ], + + props: { + name: { + type: String, + required: true, + }, + value: { + type: Boolean, + required: true, + }, + defaultValue: { + type: Boolean, + required: true, + }, + displayName: { + type: String, + required: true, + }, + label: { + type: String, + required: true, + }, + description: { + type: String, + required: true, + }, + }, +} +</script> + +<style lang="scss" scoped> +@use './shared/field' as *; + +.field { + &__description { + color: var(--color-text-maxcontrast); + } +} +</style> diff --git a/apps/theming/src/components/admin/ColorPickerField.vue b/apps/theming/src/components/admin/ColorPickerField.vue new file mode 100644 index 00000000000..4ec6d47fef6 --- /dev/null +++ b/apps/theming/src/components/admin/ColorPickerField.vue @@ -0,0 +1,157 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <div class="field"> + <label :for="id">{{ displayName }}</label> + <div class="field__row"> + <NcColorPicker :value.sync="localValue" + :advanced-fields="true" + @update:value="debounceSave"> + <NcButton :id="id" + class="field__button" + type="primary" + :aria-label="t('theming', 'Select a custom color')" + data-admin-theming-setting-color-picker> + <template #icon> + <NcLoadingIcon v-if="loading" + :appearance="calculatedTextColor === '#ffffff' ? 'light' : 'dark'" + :size="20" /> + <Palette v-else :size="20" /> + </template> + {{ value }} + </NcButton> + </NcColorPicker> + <div class="field__color-preview" data-admin-theming-setting-color /> + <NcButton v-if="value !== defaultValue" + type="tertiary" + :aria-label="t('theming', 'Reset to default')" + data-admin-theming-setting-color-reset + @click="undo"> + <template #icon> + <Undo :size="20" /> + </template> + </NcButton> + </div> + <div v-if="description" class="description"> + {{ description }} + </div> + + <NcNoteCard v-if="errorMessage" + type="error" + :show-alert="true"> + <p>{{ errorMessage }}</p> + </NcNoteCard> + </div> +</template> + +<script> +import { colord } from 'colord' +import debounce from 'debounce' + +import NcButton from '@nextcloud/vue/components/NcButton' +import NcColorPicker from '@nextcloud/vue/components/NcColorPicker' +import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon' +import NcNoteCard from '@nextcloud/vue/components/NcNoteCard' +import Undo from 'vue-material-design-icons/UndoVariant.vue' +import Palette from 'vue-material-design-icons/Palette.vue' + +import TextValueMixin from '../../mixins/admin/TextValueMixin.js' + +export default { + name: 'ColorPickerField', + + components: { + NcButton, + NcColorPicker, + NcLoadingIcon, + NcNoteCard, + Undo, + Palette, + }, + + mixins: [ + TextValueMixin, + ], + + props: { + name: { + type: String, + required: true, + }, + description: { + type: String, + default: '', + }, + value: { + type: String, + required: true, + }, + textColor: { + type: String, + default: null, + }, + defaultValue: { + type: String, + required: true, + }, + displayName: { + type: String, + required: true, + }, + }, + + emits: ['update:theming'], + + data() { + return { + loading: false, + } + }, + + computed: { + calculatedTextColor() { + const color = colord(this.value) + return color.isLight() ? '#000000' : '#ffffff' + }, + usedTextColor() { + if (this.textColor) { + return this.textColor + } + return this.calculatedTextColor + }, + }, + + methods: { + debounceSave: debounce(async function() { + this.loading = true + await this.save() + this.$emit('update:theming') + this.loading = false + }, 200), + }, +} +</script> + +<style lang="scss" scoped> +@use './shared/field' as *; + +.description { + color: var(--color-text-maxcontrast); +} + +.field { + &__button { + background-color: v-bind('value') !important; + color: v-bind('usedTextColor') !important; + } + + &__color-preview { + width: var(--default-clickable-area); + border-radius: var(--border-radius-large); + background-color: v-bind('value'); + } +} +</style> diff --git a/apps/theming/src/components/admin/FileInputField.vue b/apps/theming/src/components/admin/FileInputField.vue new file mode 100644 index 00000000000..d5e0052f5bd --- /dev/null +++ b/apps/theming/src/components/admin/FileInputField.vue @@ -0,0 +1,241 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <div class="field"> + <label :for="id">{{ displayName }}</label> + <div class="field__row"> + <NcButton :id="id" + type="secondary" + :aria-label="ariaLabel" + data-admin-theming-setting-file-picker + @click="activateLocalFilePicker"> + <template #icon> + <Upload :size="20" /> + </template> + {{ t('theming', 'Upload') }} + </NcButton> + <NcButton v-if="showReset" + type="tertiary" + :aria-label="t('theming', 'Reset to default')" + data-admin-theming-setting-file-reset + @click="undo"> + <template #icon> + <Undo :size="20" /> + </template> + </NcButton> + <NcButton v-if="showRemove" + type="tertiary" + :aria-label="t('theming', 'Remove background image')" + data-admin-theming-setting-file-remove + @click="removeBackground"> + <template #icon> + <Delete :size="20" /> + </template> + </NcButton> + <NcLoadingIcon v-if="showLoading" + class="field__loading-icon" + :size="20" /> + </div> + + <div v-if="(name === 'logoheader' || name === 'favicon') && mimeValue !== defaultMimeValue" + class="field__preview" + :class="{ + 'field__preview--logoheader': name === 'logoheader', + 'field__preview--favicon': name === 'favicon', + }" /> + + <NcNoteCard v-if="errorMessage" + type="error" + :show-alert="true"> + <p>{{ errorMessage }}</p> + </NcNoteCard> + + <input ref="input" + :accept="acceptMime" + type="file" + @change="onChange"> + </div> +</template> + +<script> +import axios from '@nextcloud/axios' +import { generateUrl } from '@nextcloud/router' +import { loadState } from '@nextcloud/initial-state' + +import NcButton from '@nextcloud/vue/components/NcButton' +import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon' +import NcNoteCard from '@nextcloud/vue/components/NcNoteCard' +import Delete from 'vue-material-design-icons/DeleteOutline.vue' +import Undo from 'vue-material-design-icons/UndoVariant.vue' +import Upload from 'vue-material-design-icons/Upload.vue' + +import FieldMixin from '../../mixins/admin/FieldMixin.js' + +const { + allowedMimeTypes, +} = loadState('theming', 'adminThemingParameters', {}) + +export default { + name: 'FileInputField', + + components: { + Delete, + NcButton, + NcLoadingIcon, + NcNoteCard, + Undo, + Upload, + }, + + mixins: [ + FieldMixin, + ], + + props: { + name: { + type: String, + required: true, + }, + mimeName: { + type: String, + required: true, + }, + mimeValue: { + type: String, + required: true, + }, + defaultMimeValue: { + type: String, + default: '', + }, + displayName: { + type: String, + required: true, + }, + ariaLabel: { + type: String, + required: true, + }, + }, + + data() { + return { + showLoading: false, + acceptMime: (allowedMimeTypes[this.name] + || ['image/jpeg', 'image/png', 'image/gif', 'image/webp']).join(','), + } + }, + + computed: { + showReset() { + return this.mimeValue !== this.defaultMimeValue + }, + + showRemove() { + if (this.name === 'background') { + if (this.mimeValue.startsWith('image/')) { + return true + } + if (this.mimeValue === this.defaultMimeValue) { + return true + } + } + return false + }, + }, + + methods: { + activateLocalFilePicker() { + this.reset() + // Set to null so that selecting the same file will trigger the change event + this.$refs.input.value = null + this.$refs.input.click() + }, + + async onChange(e) { + const file = e.target.files[0] + + const formData = new FormData() + formData.append('key', this.name) + formData.append('image', file) + + const url = generateUrl('/apps/theming/ajax/uploadImage') + try { + this.showLoading = true + const { data } = await axios.post(url, formData) + this.showLoading = false + this.$emit('update:mime-value', file.type) + this.$emit('uploaded', data.data.url) + this.handleSuccess() + } catch (e) { + this.showLoading = false + this.errorMessage = e.response.data.data?.message + } + }, + + async undo() { + this.reset() + const url = generateUrl('/apps/theming/ajax/undoChanges') + try { + await axios.post(url, { + setting: this.mimeName, + }) + this.$emit('update:mime-value', this.defaultMimeValue) + this.handleSuccess() + } catch (e) { + this.errorMessage = e.response.data.data?.message + } + }, + + async removeBackground() { + this.reset() + const url = generateUrl('/apps/theming/ajax/updateStylesheet') + try { + await axios.post(url, { + setting: this.mimeName, + value: 'backgroundColor', + }) + this.$emit('update:mime-value', 'backgroundColor') + this.handleSuccess() + } catch (e) { + this.errorMessage = e.response.data.data?.message + } + }, + }, +} +</script> + +<style lang="scss" scoped> +@use './shared/field' as *; + +.field { + &__loading-icon { + width: 44px; + height: 44px; + } + + &__preview { + width: 70px; + height: 70px; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + margin: 10px 0; + + &--logoheader { + background-image: var(--image-logoheader); + } + + &--favicon { + background-image: var(--image-favicon); + } + } +} + +input[type="file"] { + display: none; +} +</style> diff --git a/apps/theming/src/components/admin/TextField.vue b/apps/theming/src/components/admin/TextField.vue new file mode 100644 index 00000000000..6ec52733aed --- /dev/null +++ b/apps/theming/src/components/admin/TextField.vue @@ -0,0 +1,78 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <div class="field"> + <NcTextField :value.sync="localValue" + :label="displayName" + :placeholder="placeholder" + :type="type" + :maxlength="maxlength" + :spellcheck="false" + :success="showSuccess" + :error="Boolean(errorMessage)" + :helper-text="errorMessage" + :show-trailing-button="value !== defaultValue" + trailing-button-icon="undo" + @trailing-button-click="undo" + @keydown.enter="save" + @blur="save" /> + </div> +</template> + +<script> +import NcTextField from '@nextcloud/vue/components/NcTextField' + +import TextValueMixin from '../../mixins/admin/TextValueMixin.js' + +export default { + name: 'TextField', + + components: { + NcTextField, + }, + + mixins: [ + TextValueMixin, + ], + + props: { + name: { + type: String, + required: true, + }, + value: { + type: String, + required: true, + }, + defaultValue: { + type: String, + required: true, + }, + type: { + type: String, + required: true, + }, + displayName: { + type: String, + required: true, + }, + placeholder: { + type: String, + required: true, + }, + maxlength: { + type: Number, + required: true, + }, + }, +} +</script> + +<style lang="scss" scoped> +.field { + max-width: 400px; +} +</style> diff --git a/apps/theming/src/components/admin/shared/field.scss b/apps/theming/src/components/admin/shared/field.scss new file mode 100644 index 00000000000..2347f31f7c5 --- /dev/null +++ b/apps/theming/src/components/admin/shared/field.scss @@ -0,0 +1,15 @@ +/*! + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +.field { + display: flex; + flex-direction: column; + gap: 4px 0; + + &__row { + display: flex; + gap: 0 4px; + } +} diff --git a/apps/theming/src/helpers/refreshStyles.js b/apps/theming/src/helpers/refreshStyles.js new file mode 100644 index 00000000000..ba198be0a00 --- /dev/null +++ b/apps/theming/src/helpers/refreshStyles.js @@ -0,0 +1,26 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +/** + * Refresh server-side generated theming CSS + * This resolves when all themes are reloaded + */ +export async function refreshStyles() { + const themes = [...document.head.querySelectorAll('link.theme')] + const promises = themes.map((theme) => new Promise((resolve) => { + const url = new URL(theme.href) + url.searchParams.set('v', Date.now()) + const newTheme = theme.cloneNode() + newTheme.href = url.toString() + newTheme.onload = () => { + theme.remove() + resolve() + } + document.head.append(newTheme) + })) + + // Wait until all themes are loaded + await Promise.allSettled(promises) +} diff --git a/apps/theming/src/mixins/admin/FieldMixin.js b/apps/theming/src/mixins/admin/FieldMixin.js new file mode 100644 index 00000000000..743e711777a --- /dev/null +++ b/apps/theming/src/mixins/admin/FieldMixin.js @@ -0,0 +1,47 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +const styleRefreshFields = [ + 'color', + 'logo', + 'background', + 'logoheader', + 'favicon', + 'disable-user-theming', +] + +export default { + emits: [ + 'update:theming', + ], + + data() { + return { + showSuccess: false, + errorMessage: '', + } + }, + + computed: { + id() { + return `admin-theming-${this.name}` + }, + }, + + methods: { + reset() { + this.showSuccess = false + this.errorMessage = '' + }, + + handleSuccess() { + this.showSuccess = true + setTimeout(() => { this.showSuccess = false }, 2000) + if (styleRefreshFields.includes(this.name)) { + this.$emit('update:theming') + } + }, + }, +} diff --git a/apps/theming/src/mixins/admin/TextValueMixin.js b/apps/theming/src/mixins/admin/TextValueMixin.js new file mode 100644 index 00000000000..94d63ce1c8c --- /dev/null +++ b/apps/theming/src/mixins/admin/TextValueMixin.js @@ -0,0 +1,95 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import axios from '@nextcloud/axios' +import { generateUrl } from '@nextcloud/router' + +import FieldMixin from './FieldMixin.js' + +export default { + mixins: [ + FieldMixin, + ], + + watch: { + value(value) { + this.localValue = value + }, + }, + + data() { + return { + /** @type {string|boolean} */ + localValue: this.value, + } + }, + + computed: { + valueToPost() { + if (this.type === 'url') { + // if this is already encoded just make sure there is no doublequote (HTML XSS) + // otherwise simply URL encode + return this.isUrlEncoded(this.localValue) + ? this.localValue.replaceAll('"', '%22') + : encodeURI(this.localValue) + } + // Convert boolean to string as server expects string value + if (typeof this.localValue === 'boolean') { + return this.localValue ? 'yes' : 'no' + } + return this.localValue + }, + }, + + methods: { + /** + * Check if URL is percent-encoded + * @param {string} url The URL to check + * @return {boolean} + */ + isUrlEncoded(url) { + try { + return decodeURI(url) !== url + } catch { + return false + } + }, + + async save() { + this.reset() + const url = generateUrl('/apps/theming/ajax/updateStylesheet') + + try { + await axios.post(url, { + setting: this.name, + value: this.valueToPost, + }) + this.$emit('update:value', this.localValue) + this.handleSuccess() + } catch (e) { + console.error('Failed to save changes', e) + this.errorMessage = e.response?.data.data?.message + } + }, + + async undo() { + this.reset() + const url = generateUrl('/apps/theming/ajax/undoChanges') + try { + const { data } = await axios.post(url, { + setting: this.name, + }) + + if (data.data.value) { + this.$emit('update:defaultValue', data.data.value) + } + this.$emit('update:value', data.data.value || this.defaultValue) + this.handleSuccess() + } catch (e) { + this.errorMessage = e.response.data.data?.message + } + }, + }, +} diff --git a/apps/theming/src/personal-settings.js b/apps/theming/src/personal-settings.js new file mode 100644 index 00000000000..bbee88e3804 --- /dev/null +++ b/apps/theming/src/personal-settings.js @@ -0,0 +1,20 @@ +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +import { getCSPNonce } from '@nextcloud/auth' +import Vue from 'vue' + +import { refreshStyles } from './helpers/refreshStyles.js' +import App from './UserTheming.vue' + +// eslint-disable-next-line camelcase +__webpack_nonce__ = getCSPNonce() + +Vue.prototype.OC = OC +Vue.prototype.t = t + +const View = Vue.extend(App) +const theming = new View() +theming.$mount('#theming') +theming.$on('update:background', refreshStyles) diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php new file mode 100644 index 00000000000..05bbd3684b5 --- /dev/null +++ b/apps/theming/templates/settings-admin.php @@ -0,0 +1,8 @@ +<?php +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +?> + +<div id="admin-theming"></div> diff --git a/apps/theming/templates/settings-personal.php b/apps/theming/templates/settings-personal.php new file mode 100644 index 00000000000..494a466c840 --- /dev/null +++ b/apps/theming/templates/settings-personal.php @@ -0,0 +1,9 @@ +<?php +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +?> + +<span id="theming"></span>
\ No newline at end of file diff --git a/apps/theming/tests/CapabilitiesTest.php b/apps/theming/tests/CapabilitiesTest.php new file mode 100644 index 00000000000..aa08a45a28b --- /dev/null +++ b/apps/theming/tests/CapabilitiesTest.php @@ -0,0 +1,197 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\Capabilities; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +/** + * Class CapabilitiesTest + * + * @package OCA\Theming\Tests + */ +class CapabilitiesTest extends TestCase { + protected ThemingDefaults&MockObject $theming; + protected IURLGenerator&MockObject $url; + protected IConfig&MockObject $config; + protected Util&MockObject $util; + protected IUserSession $userSession; + protected Capabilities $capabilities; + + protected function setUp(): void { + parent::setUp(); + + $this->theming = $this->createMock(ThemingDefaults::class); + $this->url = $this->createMock(IURLGenerator::class); + $this->config = $this->createMock(IConfig::class); + $this->util = $this->createMock(Util::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->capabilities = new Capabilities( + $this->theming, + $this->util, + $this->url, + $this->config, + $this->userSession, + ); + } + + public static function dataGetCapabilities(): array { + return [ + ['name', 'url', 'slogan', '#FFFFFF', '#000000', 'logo', 'background', '#fff', '#000', 'http://absolute/', true, [ + 'name' => 'name', + 'productName' => 'name', + 'url' => 'url', + 'slogan' => 'slogan', + 'color' => '#FFFFFF', + 'color-text' => '#000000', + 'color-element' => '#b3b3b3', + 'color-element-bright' => '#b3b3b3', + 'color-element-dark' => '#FFFFFF', + 'logo' => 'http://absolute/logo', + 'background' => 'http://absolute/background', + 'background-text' => '#000', + 'background-plain' => false, + 'background-default' => false, + 'logoheader' => 'http://absolute/logo', + 'favicon' => 'http://absolute/logo', + ]], + ['name1', 'url2', 'slogan3', '#01e4a0', '#ffffff', 'logo5', 'background6', '#fff', '#000', 'http://localhost/', false, [ + 'name' => 'name1', + 'productName' => 'name1', + 'url' => 'url2', + 'slogan' => 'slogan3', + 'color' => '#01e4a0', + 'color-text' => '#ffffff', + 'color-element' => '#01e4a0', + 'color-element-bright' => '#01e4a0', + 'color-element-dark' => '#01e4a0', + 'logo' => 'http://localhost/logo5', + 'background' => 'http://localhost/background6', + 'background-text' => '#000', + 'background-plain' => false, + 'background-default' => true, + 'logoheader' => 'http://localhost/logo5', + 'favicon' => 'http://localhost/logo5', + ]], + ['name1', 'url2', 'slogan3', '#000000', '#ffffff', 'logo5', 'backgroundColor', '#000000', '#ffffff', 'http://localhost/', true, [ + 'name' => 'name1', + 'productName' => 'name1', + 'url' => 'url2', + 'slogan' => 'slogan3', + 'color' => '#000000', + 'color-text' => '#ffffff', + 'color-element' => '#4d4d4d', + 'color-element-bright' => '#4d4d4d', + 'color-element-dark' => '#4d4d4d', + 'logo' => 'http://localhost/logo5', + 'background' => '#000000', + 'background-text' => '#ffffff', + 'background-plain' => true, + 'background-default' => false, + 'logoheader' => 'http://localhost/logo5', + 'favicon' => 'http://localhost/logo5', + ]], + ['name1', 'url2', 'slogan3', '#000000', '#ffffff', 'logo5', 'backgroundColor', '#000000', '#ffffff', 'http://localhost/', false, [ + 'name' => 'name1', + 'productName' => 'name1', + 'url' => 'url2', + 'slogan' => 'slogan3', + 'color' => '#000000', + 'color-text' => '#ffffff', + 'color-element' => '#4d4d4d', + 'color-element-bright' => '#4d4d4d', + 'color-element-dark' => '#4d4d4d', + 'logo' => 'http://localhost/logo5', + 'background' => '#000000', + 'background-text' => '#ffffff', + 'background-plain' => true, + 'background-default' => true, + 'logoheader' => 'http://localhost/logo5', + 'favicon' => 'http://localhost/logo5', + ]], + ]; + } + + /** + * @param non-empty-array<string, string> $expected + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetCapabilities')] + public function testGetCapabilities(string $name, string $url, string $slogan, string $color, string $textColor, string $logo, string $background, string $backgroundColor, string $backgroundTextColor, string $baseUrl, bool $backgroundThemed, array $expected): void { + $this->config->expects($this->once()) + ->method('getAppValue') + ->willReturn($background); + $this->theming->expects($this->once()) + ->method('getName') + ->willReturn($name); + $this->theming->expects($this->once()) + ->method('getProductName') + ->willReturn($name); + $this->theming->expects($this->once()) + ->method('getBaseUrl') + ->willReturn($url); + $this->theming->expects($this->once()) + ->method('getSlogan') + ->willReturn($slogan); + $this->theming->expects($this->once()) + ->method('getColorBackground') + ->willReturn($backgroundColor); + $this->theming->expects($this->once()) + ->method('getTextColorBackground') + ->willReturn($backgroundTextColor); + $this->theming->expects($this->atLeast(1)) + ->method('getDefaultColorPrimary') + ->willReturn($color); + $this->theming->expects($this->exactly(3)) + ->method('getLogo') + ->willReturn($logo); + + $util = new Util($this->createMock(ServerVersion::class), $this->config, $this->createMock(IAppManager::class), $this->createMock(IAppData::class), $this->createMock(ImageManager::class)); + $this->util->expects($this->exactly(3)) + ->method('elementColor') + ->with($color) + ->willReturnCallback(static function (string $color, ?bool $brightBackground = null) use ($util) { + return $util->elementColor($color, $brightBackground); + }); + + $this->util->expects($this->any()) + ->method('invertTextColor') + ->willReturnCallback(fn () => $textColor === '#000000'); + $this->util->expects($this->once()) + ->method('isBackgroundThemed') + ->willReturn($backgroundThemed); + + if ($background !== 'backgroundColor') { + $this->theming->expects($this->once()) + ->method('getBackground') + ->willReturn($background); + $this->url->expects($this->exactly(4)) + ->method('getAbsoluteURL') + ->willReturnCallback(function ($url) use ($baseUrl) { + return $baseUrl . $url; + }); + } else { + $this->url->expects($this->exactly(3)) + ->method('getAbsoluteURL') + ->willReturnCallback(function ($url) use ($baseUrl) { + return $baseUrl . $url; + }); + } + + $this->assertEquals(['theming' => $expected], $this->capabilities->getCapabilities()); + } +} diff --git a/apps/theming/tests/Controller/IconControllerTest.php b/apps/theming/tests/Controller/IconControllerTest.php new file mode 100644 index 00000000000..c5034600e03 --- /dev/null +++ b/apps/theming/tests/Controller/IconControllerTest.php @@ -0,0 +1,185 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Controller; + +use OC\Files\SimpleFS\SimpleFile; +use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCA\Theming\Controller\IconController; +use OCA\Theming\IconBuilder; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\NotFoundException; +use OCP\IRequest; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class IconControllerTest extends TestCase { + private IRequest&MockObject $request; + private ThemingDefaults&MockObject $themingDefaults; + private ITimeFactory&MockObject $timeFactory; + private IconBuilder&MockObject $iconBuilder; + private FileAccessHelper&MockObject $fileAccessHelper; + private IAppManager&MockObject $appManager; + private ImageManager&MockObject $imageManager; + private IconController $iconController; + + protected function setUp(): void { + $this->request = $this->createMock(IRequest::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->iconBuilder = $this->createMock(IconBuilder::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->fileAccessHelper = $this->createMock(FileAccessHelper::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->timeFactory = $this->createMock(ITimeFactory::class); + $this->timeFactory->expects($this->any()) + ->method('getTime') + ->willReturn(123); + + $this->overwriteService(ITimeFactory::class, $this->timeFactory); + + $this->iconController = new IconController( + 'theming', + $this->request, + $this->themingDefaults, + $this->iconBuilder, + $this->imageManager, + $this->fileAccessHelper, + $this->appManager, + ); + + parent::setUp(); + } + + private function iconFileMock($filename, $data) { + $icon = $this->getMockBuilder('OCP\Files\File')->getMock(); + $icon->expects($this->any())->method('getContent')->willReturn($data); + $icon->expects($this->any())->method('getMimeType')->willReturn('image type'); + $icon->expects($this->any())->method('getEtag')->willReturn('my etag'); + $icon->expects($this->any())->method('getName')->willReturn('my name'); + $icon->expects($this->any())->method('getMTime')->willReturn(42); + $icon->method('getName')->willReturn($filename); + return new SimpleFile($icon); + } + + public function testGetThemedIcon(): void { + $file = $this->iconFileMock('icon-core-filetypes_folder.svg', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->with('icon-core-filetypes_folder.svg') + ->willReturn($file); + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); + $expected->cacheFor(86400, false, true); + $this->assertEquals($expected, $this->iconController->getThemedIcon('core', 'filetypes/folder.svg')); + } + + public function testGetFaviconDefault(): void { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getImage', false) + ->with('favicon') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->willThrowException(new NotFoundException()); + $this->iconBuilder->expects($this->once()) + ->method('getFavicon') + ->with('core') + ->willReturn('filecontent'); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getFavicon()); + } + + public function testGetFaviconFail(): void { + $this->imageManager->expects($this->once()) + ->method('getImage') + ->with('favicon', false) + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon.png'; + $this->fileAccessHelper->expects($this->once()) + ->method('file_get_contents') + ->with($fallbackLogo) + ->willReturn(file_get_contents($fallbackLogo)); + $expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getFavicon()); + } + + public function testGetTouchIconDefault(): void { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + + $this->imageManager->expects($this->once()) + ->method('getImage') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $this->iconBuilder->expects($this->once()) + ->method('getTouchIcon') + ->with('core') + ->willReturn('filecontent'); + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/png']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getTouchIcon()); + } + + public function testGetTouchIconFail(): void { + $this->imageManager->expects($this->once()) + ->method('getImage') + ->with('favicon') + ->willThrowException(new NotFoundException()); + $this->imageManager->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon-touch.png'; + $this->fileAccessHelper->expects($this->once()) + ->method('file_get_contents') + ->with($fallbackLogo) + ->willReturn(file_get_contents($fallbackLogo)); + $expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK, ['Content-Type' => 'image/png']); + $expected->cacheFor(86400); + $this->assertEquals($expected, $this->iconController->getTouchIcon()); + } +} diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php new file mode 100644 index 00000000000..fb461f03a28 --- /dev/null +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -0,0 +1,760 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Controller; + +use OC\L10N\L10N; +use OCA\Theming\Controller\ThemingController; +use OCA\Theming\ImageManager; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\ThemingDefaults; +use OCP\App\IAppManager; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Services\IAppConfig; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IRequest; +use OCP\ITempManager; +use OCP\IURLGenerator; +use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class ThemingControllerTest extends TestCase { + + private IRequest&MockObject $request; + private IConfig&MockObject $config; + private IAppConfig&MockObject $appConfig; + private ThemingDefaults&MockObject $themingDefaults; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + private ImageManager&MockObject $imageManager; + private IURLGenerator&MockObject $urlGenerator; + private ThemesService&MockObject $themesService; + private INavigationManager&MockObject $navigationManager; + + private ThemingController $themingController; + + protected function setUp(): void { + $this->request = $this->createMock(IRequest::class); + $this->config = $this->createMock(IConfig::class); + $this->appConfig = $this->createMock(IAppConfig::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->l10n = $this->createMock(L10N::class); + $this->appManager = $this->createMock(IAppManager::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->themesService = $this->createMock(ThemesService::class); + $this->navigationManager = $this->createMock(INavigationManager::class); + + $timeFactory = $this->createMock(ITimeFactory::class); + $timeFactory->expects($this->any()) + ->method('getTime') + ->willReturn(123); + + $this->overwriteService(ITimeFactory::class, $timeFactory); + + $this->themingController = new ThemingController( + 'theming', + $this->request, + $this->config, + $this->appConfig, + $this->themingDefaults, + $this->l10n, + $this->urlGenerator, + $this->appManager, + $this->imageManager, + $this->themesService, + $this->navigationManager, + ); + + parent::setUp(); + } + + public static function dataUpdateStylesheetSuccess(): array { + return [ + ['name', str_repeat('a', 250), 'Saved'], + ['url', 'https://nextcloud.com/' . str_repeat('a', 478), 'Saved'], + ['slogan', str_repeat('a', 500), 'Saved'], + ['color', '#0082c9', 'Saved'], + ['color', '#0082C9', 'Saved'], + ['color', '#0082C9', 'Saved'], + ['imprintUrl', 'https://nextcloud.com/' . str_repeat('a', 478), 'Saved'], + ['privacyUrl', 'https://nextcloud.com/' . str_repeat('a', 478), 'Saved'], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataUpdateStylesheetSuccess')] + public function testUpdateStylesheetSuccess(string $setting, string $value, string $message): void { + $this->themingDefaults + ->expects($this->once()) + ->method('set') + ->with($setting, $value); + $this->l10n + ->expects($this->once()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => $message, + ], + 'status' => 'success', + ] + ); + $this->assertEquals($expected, $this->themingController->updateStylesheet($setting, $value)); + } + + public static function dataUpdateStylesheetError(): array { + $urls = [ + 'url' => 'web address', + 'imprintUrl' => 'legal notice address', + 'privacyUrl' => 'privacy policy address', + ]; + + $urlTests = []; + foreach ($urls as $urlKey => $urlName) { + // Check length limit + $urlTests[] = [$urlKey, 'http://example.com/' . str_repeat('a', 501), "The given {$urlName} is too long"]; + // Check potential evil javascript + $urlTests[] = [$urlKey, 'javascript:alert(1)', "The given {$urlName} is not a valid URL"]; + // Check XSS + $urlTests[] = [$urlKey, 'https://example.com/"><script/src="alert(\'1\')"><a/href/="', "The given {$urlName} is not a valid URL"]; + } + + return [ + ['name', str_repeat('a', 251), 'The given name is too long'], + ['slogan', str_repeat('a', 501), 'The given slogan is too long'], + ['primary_color', '0082C9', 'The given color is invalid'], + ['primary_color', '#0082Z9', 'The given color is invalid'], + ['primary_color', 'Nextcloud', 'The given color is invalid'], + ['background_color', '0082C9', 'The given color is invalid'], + ['background_color', '#0082Z9', 'The given color is invalid'], + ['background_color', 'Nextcloud', 'The given color is invalid'], + + ...$urlTests, + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataUpdateStylesheetError')] + public function testUpdateStylesheetError(string $setting, string $value, string $message): void { + $this->themingDefaults + ->expects($this->never()) + ->method('set') + ->with($setting, $value); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => $message, + ], + 'status' => 'error', + ], + Http::STATUS_BAD_REQUEST + ); + $this->assertEquals($expected, $this->themingController->updateStylesheet($setting, $value)); + } + + public function testUpdateLogoNoData(): void { + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('logo'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn(null); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => 'No file uploaded', + ], + 'status' => 'failure', + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public function testUploadInvalidUploadKey(): void { + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('invalid'); + $this->request + ->expects($this->never()) + ->method('getUploadedFile'); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => 'Invalid key', + ], + 'status' => 'failure', + ], + Http::STATUS_BAD_REQUEST + ); + + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + /** + * Checks that trying to upload an SVG favicon without imagemagick + * results in an unsupported media type response. + */ + public function testUploadSVGFaviconWithoutImagemagick(): void { + $this->imageManager + ->method('shouldReplaceIcons') + ->willReturn(false); + + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('favicon'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => __DIR__ . '/../../../../tests/data/testimagelarge.svg', + 'type' => 'image/svg', + 'name' => 'testimagelarge.svg', + 'error' => 0, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $this->imageManager->expects($this->once()) + ->method('updateImage') + ->willThrowException(new \Exception('Unsupported image type')); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => 'Unsupported image type', + ], + 'status' => 'failure' + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public function testUpdateLogoInvalidMimeType(): void { + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('logo'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => __DIR__ . '/../../../../tests/data/lorem.txt', + 'type' => 'application/pdf', + 'name' => 'logo.pdf', + 'error' => 0, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $this->imageManager->expects($this->once()) + ->method('updateImage') + ->willThrowException(new \Exception('Unsupported image type')); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => 'Unsupported image type', + ], + 'status' => 'failure' + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public static function dataUpdateImages(): array { + return [ + ['image/jpeg', false], + ['image/jpeg', true], + ['image/gif'], + ['image/png'], + ['image/svg+xml'], + ['image/svg'] + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataUpdateImages')] + public function testUpdateLogoNormalLogoUpload(string $mimeType, bool $folderExists = true): void { + $tmpLogo = Server::get(ITempManager::class)->getTemporaryFolder() . '/logo.svg'; + $destination = Server::get(ITempManager::class)->getTemporaryFolder(); + + touch($tmpLogo); + copy(__DIR__ . '/../../../../tests/data/testimage.png', $tmpLogo); + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('logo'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => $tmpLogo, + 'type' => $mimeType, + 'name' => 'logo.svg', + 'error' => 0, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $this->imageManager->expects($this->once()) + ->method('getImageUrl') + ->with('logo') + ->willReturn('imageUrl'); + + $this->imageManager->expects($this->once()) + ->method('updateImage'); + + $expected = new DataResponse( + [ + 'data' + => [ + 'name' => 'logo.svg', + 'message' => 'Saved', + 'url' => 'imageUrl', + ], + 'status' => 'success' + ] + ); + + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public function testUpdateLogoLoginScreenUpload(): void { + $tmpLogo = Server::get(ITempManager::class)->getTemporaryFolder() . 'logo.png'; + + touch($tmpLogo); + copy(__DIR__ . '/../../../../tests/data/desktopapp.png', $tmpLogo); + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('background'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => $tmpLogo, + 'type' => 'image/svg+xml', + 'name' => 'logo.svg', + 'error' => 0, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $this->imageManager->expects($this->once()) + ->method('updateImage'); + + $this->imageManager->expects($this->once()) + ->method('getImageUrl') + ->with('background') + ->willReturn('imageUrl'); + $expected = new DataResponse( + [ + 'data' + => [ + 'name' => 'logo.svg', + 'message' => 'Saved', + 'url' => 'imageUrl', + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public function testUpdateLogoLoginScreenUploadWithInvalidImage(): void { + $tmpLogo = Server::get(ITempManager::class)->getTemporaryFolder() . '/logo.svg'; + + touch($tmpLogo); + file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/data.zip')); + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('logo'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => $tmpLogo, + 'type' => 'foobar', + 'name' => 'logo.svg', + 'error' => 0, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $this->imageManager->expects($this->once()) + ->method('updateImage') + ->willThrowException(new \Exception('Unsupported image type')); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => 'Unsupported image type', + ], + 'status' => 'failure' + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public static function dataPhpUploadErrors(): array { + return [ + [UPLOAD_ERR_INI_SIZE, 'The uploaded file exceeds the upload_max_filesize directive in php.ini'], + [UPLOAD_ERR_FORM_SIZE, 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'], + [UPLOAD_ERR_PARTIAL, 'The file was only partially uploaded'], + [UPLOAD_ERR_NO_FILE, 'No file was uploaded'], + [UPLOAD_ERR_NO_TMP_DIR, 'Missing a temporary folder'], + [UPLOAD_ERR_CANT_WRITE, 'Could not write file to disk'], + [UPLOAD_ERR_EXTENSION, 'A PHP extension stopped the file upload'], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataPhpUploadErrors')] + public function testUpdateLogoLoginScreenUploadWithInvalidImageUpload(int $error, string $expectedErrorMessage): void { + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('background'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => '', + 'type' => 'image/svg+xml', + 'name' => 'logo.svg', + 'error' => $error, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => $expectedErrorMessage, + ], + 'status' => 'failure' + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataPhpUploadErrors')] + public function testUpdateLogoUploadWithInvalidImageUpload($error, $expectedErrorMessage): void { + $this->request + ->expects($this->once()) + ->method('getParam') + ->with('key') + ->willReturn('background'); + $this->request + ->expects($this->once()) + ->method('getUploadedFile') + ->with('image') + ->willReturn([ + 'tmp_name' => '', + 'type' => 'text/svg', + 'name' => 'logo.svg', + 'error' => $error, + ]); + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($str) { + return $str; + }); + + $expected = new DataResponse( + [ + 'data' + => [ + 'message' => $expectedErrorMessage + ], + 'status' => 'failure' + ], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + $this->assertEquals($expected, $this->themingController->uploadImage()); + } + + public function testUndo(): void { + $this->l10n + ->expects($this->once()) + ->method('t') + ->with('Saved') + ->willReturn('Saved'); + $this->themingDefaults + ->expects($this->once()) + ->method('undo') + ->with('MySetting') + ->willReturn('MyValue'); + + $expected = new DataResponse( + [ + 'data' + => [ + 'value' => 'MyValue', + 'message' => 'Saved' + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->undo('MySetting')); + } + + public static function dataUndoDelete(): array { + return [ + [ 'backgroundMime', 'background' ], + [ 'logoMime', 'logo' ] + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataUndoDelete')] + public function testUndoDelete(string $value, string $filename): void { + $this->l10n + ->expects($this->once()) + ->method('t') + ->with('Saved') + ->willReturn('Saved'); + $this->themingDefaults + ->expects($this->once()) + ->method('undo') + ->with($value) + ->willReturn($value); + + $expected = new DataResponse( + [ + 'data' + => [ + 'value' => $value, + 'message' => 'Saved', + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->undo($value)); + } + + + + public function testGetLogoNotExistent(): void { + $this->imageManager->method('getImage') + ->with($this->equalTo('logo')) + ->willThrowException(new NotFoundException()); + + $expected = new NotFoundResponse(); + $this->assertEquals($expected, $this->themingController->getImage('logo')); + } + + public function testGetLogo(): void { + $file = $this->createMock(ISimpleFile::class); + $file->method('getName')->willReturn('logo.svg'); + $file->method('getMTime')->willReturn(42); + $this->imageManager->expects($this->once()) + ->method('getImage') + ->willReturn($file); + $this->config + ->expects($this->any()) + ->method('getAppValue') + ->with('theming', 'logoMime', '') + ->willReturn('text/svg'); + + @$expected = new FileDisplayResponse($file); + $expected->cacheFor(3600); + $expected->addHeader('Content-Type', 'text/svg'); + $expected->addHeader('Content-Disposition', 'attachment; filename="logo"'); + $csp = new ContentSecurityPolicy(); + $csp->allowInlineStyle(); + $expected->setContentSecurityPolicy($csp); + @$this->assertEquals($expected, $this->themingController->getImage('logo')); + } + + + public function testGetLoginBackgroundNotExistent(): void { + $this->imageManager->method('getImage') + ->with($this->equalTo('background')) + ->willThrowException(new NotFoundException()); + $expected = new NotFoundResponse(); + $this->assertEquals($expected, $this->themingController->getImage('background')); + } + + public function testGetLoginBackground(): void { + $file = $this->createMock(ISimpleFile::class); + $file->method('getName')->willReturn('background.png'); + $file->method('getMTime')->willReturn(42); + $this->imageManager->expects($this->once()) + ->method('getImage') + ->willReturn($file); + + $this->config + ->expects($this->any()) + ->method('getAppValue') + ->with('theming', 'backgroundMime', '') + ->willReturn('image/png'); + + @$expected = new FileDisplayResponse($file); + $expected->cacheFor(3600); + $expected->addHeader('Content-Type', 'image/png'); + $expected->addHeader('Content-Disposition', 'attachment; filename="background"'); + $csp = new ContentSecurityPolicy(); + $csp->allowInlineStyle(); + $expected->setContentSecurityPolicy($csp); + @$this->assertEquals($expected, $this->themingController->getImage('background')); + } + + public static function dataGetManifest(): array { + return [ + [true], + [false], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetManifest')] + public function testGetManifest(bool $standalone): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->themingDefaults + ->expects($this->any()) + ->method('getName') + ->willReturn('Nextcloud'); + $this->urlGenerator + ->expects($this->once()) + ->method('getBaseUrl') + ->willReturn('localhost'); + $this->urlGenerator + ->expects($this->exactly(2)) + ->method('linkToRoute') + ->willReturnMap([ + ['theming.Icon.getTouchIcon', ['app' => 'core'], 'touchicon'], + ['theming.Icon.getFavicon', ['app' => 'core'], 'favicon'], + ]); + $this->config + ->expects($this->exactly(2)) + ->method('getSystemValueBool') + ->with('theming.standalone_window.enabled', true) + ->willReturn($standalone); + $response = new JSONResponse([ + 'name' => 'Nextcloud', + 'start_url' => 'localhost', + 'icons' + => [ + [ + 'src' => 'touchicon?v=0', + 'type' => 'image/png', + 'sizes' => '512x512' + ], + [ + 'src' => 'favicon?v=0', + 'type' => 'image/svg+xml', + 'sizes' => '16x16' + ] + ], + 'display_override' => [$standalone ? 'minimal-ui' : ''], + 'display' => $standalone ? 'standalone' : 'browser', + 'short_name' => 'Nextcloud', + 'theme_color' => null, + 'background_color' => null, + 'description' => null + ]); + $response->cacheFor(3600); + $this->assertEquals($response, $this->themingController->getManifest('core')); + } +} diff --git a/apps/theming/tests/Controller/UserThemeControllerTest.php b/apps/theming/tests/Controller/UserThemeControllerTest.php new file mode 100644 index 00000000000..9a8c1cd19aa --- /dev/null +++ b/apps/theming/tests/Controller/UserThemeControllerTest.php @@ -0,0 +1,124 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Controller; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Controller\UserThemeController; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\Themes\LightTheme; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSBadRequestException; +use OCP\IConfig; +use OCP\IRequest; +use OCP\IUser; +use OCP\IUserSession; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class UserThemeControllerTest extends TestCase { + private IRequest&MockObject $request; + private IConfig&MockObject $config; + private IUserSession&MockObject $userSession; + private ThemesService&MockObject $themesService; + private ThemingDefaults&MockObject $themingDefaults; + private BackgroundService&MockObject $backgroundService; + private UserThemeController $userThemeController; + + + /** @var ITheme[] */ + private array $themes; + + protected function setUp(): void { + $this->request = $this->createMock(IRequest::class); + $this->config = $this->createMock(IConfig::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->themesService = $this->createMock(ThemesService::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->backgroundService = $this->createMock(BackgroundService::class); + + $this->themes = [ + 'default' => $this->createMock(DefaultTheme::class), + 'light' => $this->createMock(LightTheme::class), + 'dark' => $this->createMock(DarkTheme::class), + 'light-highcontrast' => $this->createMock(HighContrastTheme::class), + 'dark-highcontrast' => $this->createMock(DarkHighContrastTheme::class), + 'opendyslexic' => $this->createMock(DyslexiaFont::class), + ]; + + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->userThemeController = new UserThemeController( + Application::APP_ID, + $this->request, + $this->config, + $this->userSession, + $this->themesService, + $this->themingDefaults, + $this->backgroundService, + ); + + parent::setUp(); + } + + public static function dataTestThemes(): array { + return [ + ['default'], + ['light'], + ['dark'], + ['light-highcontrast'], + ['dark-highcontrast'], + ['opendyslexic'], + ['', OCSBadRequestException::class], + ['badTheme', OCSBadRequestException::class], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestThemes')] + public function testEnableTheme(string $themeId, ?string $exception = null): void { + $this->themesService + ->expects($this->any()) + ->method('getThemes') + ->willReturn($this->themes); + + if ($exception) { + $this->expectException($exception); + } + + $expected = new DataResponse(); + $this->assertEquals($expected, $this->userThemeController->enableTheme($themeId)); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestThemes')] + public function testDisableTheme(string $themeId, ?string $exception = null): void { + $this->themesService + ->expects($this->any()) + ->method('getThemes') + ->willReturn($this->themes); + + if ($exception) { + $this->expectException($exception); + } + + $expected = new DataResponse(); + $this->assertEquals($expected, $this->userThemeController->disableTheme($themeId)); + } +} diff --git a/apps/theming/tests/IconBuilderTest.php b/apps/theming/tests/IconBuilderTest.php new file mode 100644 index 00000000000..d881e4eb75c --- /dev/null +++ b/apps/theming/tests/IconBuilderTest.php @@ -0,0 +1,177 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OC\Files\AppData\AppData; +use OCA\Theming\IconBuilder; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\NotFoundException; +use OCP\IConfig; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class IconBuilderTest extends TestCase { + protected IConfig&MockObject $config; + protected AppData&MockObject $appData; + protected ThemingDefaults&MockObject $themingDefaults; + protected ImageManager&MockObject $imageManager; + protected IAppManager&MockObject $appManager; + protected Util $util; + protected IconBuilder $iconBuilder; + + protected function setUp(): void { + parent::setUp(); + + $this->config = $this->createMock(IConfig::class); + $this->appData = $this->createMock(AppData::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->appManager = $this->createMock(IAppManager::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->util = new Util($this->createMock(ServerVersion::class), $this->config, $this->appManager, $this->appData, $this->imageManager); + $this->iconBuilder = new IconBuilder($this->themingDefaults, $this->util, $this->imageManager); + } + + private function checkImagick() { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + if (count($checkImagick->queryFormats('PNG')) < 1) { + $this->markTestSkipped('No PNG provider present.'); + } + } + + public static function dataRenderAppIcon(): array { + return [ + ['core', '#0082c9', 'touch-original.png'], + ['core', '#FF0000', 'touch-core-red.png'], + ['testing', '#FF0000', 'touch-testing-red.png'], + ['comments', '#0082c9', 'touch-comments.png'], + ['core', '#0082c9', 'touch-original-png.png'], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataRenderAppIcon')] + public function testRenderAppIcon(string $app, string $color, string $file): void { + $this->checkImagick(); + $this->themingDefaults->expects($this->once()) + ->method('getColorPrimary') + ->willReturn($color); + $this->appData->expects($this->once()) + ->method('getFolder') + ->with('global/images') + ->willThrowException(new NotFoundException()); + + $expectedIcon = new \Imagick(realpath(__DIR__) . '/data/' . $file); + $icon = $this->iconBuilder->renderAppIcon($app, 512); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(512, $icon->getImageWidth()); + $this->assertEquals(512, $icon->getImageHeight()); + $this->assertEquals($icon, $expectedIcon); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataRenderAppIcon')] + public function testGetTouchIcon(string $app, string $color, string $file): void { + $this->checkImagick(); + $this->themingDefaults->expects($this->once()) + ->method('getColorPrimary') + ->willReturn($color); + $this->appData->expects($this->once()) + ->method('getFolder') + ->with('global/images') + ->willThrowException(new NotFoundException()); + + $expectedIcon = new \Imagick(realpath(__DIR__) . '/data/' . $file); + $icon = new \Imagick(); + $icon->readImageBlob($this->iconBuilder->getTouchIcon($app)); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(512, $icon->getImageWidth()); + $this->assertEquals(512, $icon->getImageHeight()); + $this->assertEquals($icon, $expectedIcon); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataRenderAppIcon')] + public function testGetFavicon(string $app, string $color, string $file): void { + $this->checkImagick(); + $this->imageManager->expects($this->once()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $this->themingDefaults->expects($this->once()) + ->method('getColorPrimary') + ->willReturn($color); + $this->appData->expects($this->once()) + ->method('getFolder') + ->with('global/images') + ->willThrowException(new NotFoundException()); + + $expectedIcon = new \Imagick(realpath(__DIR__) . '/data/' . $file); + $actualIcon = $this->iconBuilder->getFavicon($app); + + $icon = new \Imagick(); + $icon->setFormat('ico'); + $icon->readImageBlob($actualIcon); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(128, $icon->getImageWidth()); + $this->assertEquals(128, $icon->getImageHeight()); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + public function testGetFaviconNotFound(): void { + $this->checkImagick(); + $util = $this->createMock(Util::class); + $iconBuilder = new IconBuilder($this->themingDefaults, $util, $this->imageManager); + $this->imageManager->expects($this->once()) + ->method('shouldReplaceIcons') + ->willReturn(true); + $util->expects($this->once()) + ->method('getAppIcon') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->getFavicon('noapp')); + } + + public function testGetTouchIconNotFound(): void { + $this->checkImagick(); + $util = $this->createMock(Util::class); + $iconBuilder = new IconBuilder($this->themingDefaults, $util, $this->imageManager); + $util->expects($this->once()) + ->method('getAppIcon') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->getTouchIcon('noapp')); + } + + public function testColorSvgNotFound(): void { + $this->checkImagick(); + $util = $this->createMock(Util::class); + $iconBuilder = new IconBuilder($this->themingDefaults, $util, $this->imageManager); + $util->expects($this->once()) + ->method('getAppImage') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->colorSvg('noapp', 'noimage')); + } +} diff --git a/apps/theming/tests/ImageManagerTest.php b/apps/theming/tests/ImageManagerTest.php new file mode 100644 index 00000000000..0c4d555cc00 --- /dev/null +++ b/apps/theming/tests/ImageManagerTest.php @@ -0,0 +1,383 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\ImageManager; +use OCA\Theming\Service\BackgroundService; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\ITempManager; +use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; +use Test\TestCase; + +class ImageManagerTest extends TestCase { + protected IConfig&MockObject $config; + protected IAppData&MockObject $appData; + private IURLGenerator&MockObject $urlGenerator; + private ICacheFactory&MockObject $cacheFactory; + private LoggerInterface&MockObject $logger; + private ITempManager&MockObject $tempManager; + private ISimpleFolder&MockObject $rootFolder; + protected ImageManager $imageManager; + + protected function setUp(): void { + parent::setUp(); + $this->config = $this->createMock(IConfig::class); + $this->appData = $this->createMock(IAppData::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->tempManager = $this->createMock(ITempManager::class); + $this->rootFolder = $this->createMock(ISimpleFolder::class); + $backgroundService = $this->createMock(BackgroundService::class); + $this->imageManager = new ImageManager( + $this->config, + $this->appData, + $this->urlGenerator, + $this->cacheFactory, + $this->logger, + $this->tempManager, + $backgroundService, + ); + $this->appData + ->expects($this->any()) + ->method('getFolder') + ->with('global') + ->willReturn($this->rootFolder); + } + + private function checkImagick() { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (empty($checkImagick->queryFormats('SVG'))) { + $this->markTestSkipped('No SVG provider present.'); + } + if (empty($checkImagick->queryFormats('PNG'))) { + $this->markTestSkipped('No PNG provider present.'); + } + } + + public function mockGetImage($key, $file) { + /** @var MockObject $folder */ + $folder = $this->createMock(ISimpleFolder::class); + if ($file === null) { + $folder->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willThrowException(new NotFoundException()); + } else { + $file->expects($this->once()) + ->method('getContent') + ->willReturn(file_get_contents(__DIR__ . '/../../../tests/data/testimage.png')); + $folder->expects($this->exactly(2)) + ->method('fileExists') + ->willReturnMap([ + ['logo', true], + ['logo.png', false], + ]); + $folder->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willReturn($file); + $newFile = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('newFile') + ->with('logo.png') + ->willReturn($newFile); + $newFile->expects($this->once()) + ->method('putContent'); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + } + } + + public function testGetImageUrl(): void { + $this->checkImagick(); + $this->config->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '0'], + ['theming', 'logoMime', '', '0'], + ]); + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->willReturn('url-to-image'); + $this->assertEquals('url-to-image?v=0', $this->imageManager->getImageUrl('logo', false)); + } + + public function testGetImageUrlDefault(): void { + $this->config->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '0'], + ['theming', 'logoMime', '', ''], + ]); + $this->urlGenerator->expects($this->once()) + ->method('imagePath') + ->with('core', 'logo/logo.png') + ->willReturn('logo/logo.png'); + $this->assertEquals('logo/logo.png?v=0', $this->imageManager->getImageUrl('logo')); + } + + public function testGetImageUrlAbsolute(): void { + $this->checkImagick(); + $this->config->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '0'], + ['theming', 'logoMime', '', ''], + ]); + $this->urlGenerator->expects($this->any()) + ->method('getAbsoluteUrl') + ->willReturn('url-to-image-absolute?v=0'); + $this->assertEquals('url-to-image-absolute?v=0', $this->imageManager->getImageUrlAbsolute('logo', false)); + } + + public function testGetImage(): void { + $this->checkImagick(); + $this->config->expects($this->once()) + ->method('getAppValue')->with('theming', 'logoMime', false) + ->willReturn('png'); + $file = $this->createMock(ISimpleFile::class); + $this->mockGetImage('logo', $file); + $this->assertEquals($file, $this->imageManager->getImage('logo', false)); + } + + + public function testGetImageUnset(): void { + $this->expectException(NotFoundException::class); + + $this->config->expects($this->once()) + ->method('getAppValue')->with('theming', 'logoMime', false) + ->willReturn(false); + $this->imageManager->getImage('logo'); + } + + public function testGetCacheFolder(): void { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('0') + ->willReturn($folder); + $this->assertEquals($folder, $this->imageManager->getCacheFolder()); + } + public function testGetCacheFolderCreate(): void { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->exactly(2)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->rootFolder->expects($this->exactly(2)) + ->method('getFolder') + ->with('0') + ->willReturnOnConsecutiveCalls( + $this->throwException(new NotFoundException()), + $folder, + ); + $this->rootFolder->expects($this->once()) + ->method('newFolder') + ->with('0') + ->willReturn($folder); + $this->rootFolder->expects($this->once()) + ->method('getDirectoryListing') + ->willReturn([]); + $this->assertEquals($folder, $this->imageManager->getCacheFolder()); + } + + public function testGetCachedImage(): void { + $expected = $this->createMock(ISimpleFile::class); + $folder = $this->setupCacheFolder(); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->willReturn($expected); + $this->assertEquals($expected, $this->imageManager->getCachedImage('filename')); + } + + + public function testGetCachedImageNotFound(): void { + $this->expectException(NotFoundException::class); + + $folder = $this->setupCacheFolder(); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->willThrowException(new NotFoundException()); + $image = $this->imageManager->getCachedImage('filename'); + } + + public function testSetCachedImage(): void { + $folder = $this->setupCacheFolder(); + $file = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('fileExists') + ->with('filename') + ->willReturn(true); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->willReturn($file); + $file->expects($this->once()) + ->method('putContent') + ->with('filecontent'); + $this->assertEquals($file, $this->imageManager->setCachedImage('filename', 'filecontent')); + } + + public function testSetCachedImageCreate(): void { + $folder = $this->setupCacheFolder(); + $file = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('fileExists') + ->with('filename') + ->willReturn(false); + $folder->expects($this->once()) + ->method('newFile') + ->with('filename') + ->willReturn($file); + $file->expects($this->once()) + ->method('putContent') + ->with('filecontent'); + $this->assertEquals($file, $this->imageManager->setCachedImage('filename', 'filecontent')); + } + + private function setupCacheFolder() { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('0') + ->willReturn($folder); + return $folder; + } + + public function testCleanup(): void { + $folders = [ + $this->createMock(ISimpleFolder::class), + $this->createMock(ISimpleFolder::class), + $this->createMock(ISimpleFolder::class) + ]; + foreach ($folders as $index => $folder) { + $folder->expects($this->any()) + ->method('getName') + ->willReturn("$index"); + } + $folders[0]->expects($this->once())->method('delete'); + $folders[1]->expects($this->once())->method('delete'); + $folders[2]->expects($this->never())->method('delete'); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('2'); + $this->rootFolder->expects($this->once()) + ->method('getDirectoryListing') + ->willReturn($folders); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('2') + ->willReturn($folders[2]); + $this->imageManager->cleanup(); + } + + + public static function dataUpdateImage(): array { + return [ + ['background', __DIR__ . '/../../../tests/data/testimage.png', true, false], + ['background', __DIR__ . '/../../../tests/data/testimage.png', false, false], + ['background', __DIR__ . '/../../../tests/data/testimage.jpg', true, false], + ['background', __DIR__ . '/../../../tests/data/testimage.webp', true, false], + ['background', __DIR__ . '/../../../tests/data/testimage-large.jpg', true, true], + ['background', __DIR__ . '/../../../tests/data/testimage-wide.png', true, true], + ['logo', __DIR__ . '/../../../tests/data/testimagelarge.svg', true, false], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataUpdateImage')] + public function testUpdateImage(string $key, string $tmpFile, bool $folderExists, bool $shouldConvert): void { + $file = $this->createMock(ISimpleFile::class); + $folder = $this->createMock(ISimpleFolder::class); + $oldFile = $this->createMock(ISimpleFile::class); + $folder->expects($this->any()) + ->method('getFile') + ->willReturn($oldFile); + + if ($folderExists) { + $this->rootFolder + ->expects($this->any()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + } else { + $this->rootFolder + ->expects($this->any()) + ->method('getFolder') + ->with('images') + ->willThrowException(new NotFoundException()); + $this->rootFolder + ->expects($this->any()) + ->method('newFolder') + ->with('images') + ->willReturn($folder); + } + + $folder->expects($this->once()) + ->method('newFile') + ->with($key) + ->willReturn($file); + + if ($shouldConvert) { + $this->tempManager->expects($this->once()) + ->method('getTemporaryFile') + ->willReturn('/tmp/randomtempfile-theming'); + } + + $this->imageManager->updateImage($key, $tmpFile); + } + + public function testUnsupportedImageType(): void { + $this->expectException(\Exception::class); + $this->expectExceptionMessage('Unsupported image type: text/plain'); + + $file = $this->createMock(ISimpleFile::class); + $folder = $this->createMock(ISimpleFolder::class); + $oldFile = $this->createMock(ISimpleFile::class); + + $folder->expects($this->any()) + ->method('getFile') + ->willReturn($oldFile); + + $this->rootFolder + ->expects($this->any()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + + $folder->expects($this->once()) + ->method('newFile') + ->with('favicon') + ->willReturn($file); + + $this->imageManager->updateImage('favicon', __DIR__ . '/../../../tests/data/lorem.txt'); + } +} diff --git a/apps/theming/tests/Migration/Version2006Date20240905111627Test.php b/apps/theming/tests/Migration/Version2006Date20240905111627Test.php new file mode 100644 index 00000000000..5f7458db11a --- /dev/null +++ b/apps/theming/tests/Migration/Version2006Date20240905111627Test.php @@ -0,0 +1,182 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Theming\Tests\Migration; + +use OCA\Theming\Migration\Version2006Date20240905111627; +use OCP\BackgroundJob\IJobList; +use OCP\Config\IUserConfig; +use OCP\IAppConfig; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Migration\IOutput; +use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +/** + * @group DB + */ +class Version2006Date20240905111627Test extends TestCase { + + private IAppConfig&MockObject $appConfig; + private IDBConnection&MockObject $connection; + private IJobList&MockObject $jobList; + private Version2006Date20240905111627 $migration; + + protected function setUp(): void { + parent::setUp(); + + $this->appConfig = $this->createMock(IAppConfig::class); + $this->connection = $this->createMock(IDBConnection::class); + $this->jobList = $this->createMock(IJobList::class); + $this->migration = new Version2006Date20240905111627( + $this->jobList, + $this->appConfig, + $this->connection, + ); + } + + public function testRestoreSystemColors(): void { + $this->appConfig->expects(self::once()) + ->method('getValueString') + ->with('theming', 'color', '') + ->willReturn('ffab00'); + $this->appConfig->expects(self::once()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn(true); + + // expect the color value to be deleted + $this->appConfig->expects(self::once()) + ->method('deleteKey') + ->with('theming', 'color'); + // expect the correct calls to setValueString (setting the new values) + $setValueCalls = []; + $this->appConfig->expects(self::exactly(2)) + ->method('setValueString') + ->willReturnCallback(function () use (&$setValueCalls) { + $setValueCalls[] = func_get_args(); + return true; + }); + + $output = $this->createMock(IOutput::class); + $this->migration->changeSchema($output, fn () => null, []); + + $this->assertEquals([ + ['theming', 'background_color', 'ffab00', false, false], + ['theming', 'primary_color', 'ffab00', false, false], + ], $setValueCalls); + } + + /** + * @group DB + */ + public function testRestoreUserColors(): void { + $this->appConfig->expects(self::once()) + ->method('getValueString') + ->with('theming', 'color', '') + ->willReturn(''); + $this->appConfig->expects(self::once()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn(false); + + // Create a user + $manager = Server::get(IUserManager::class); + $user = $manager->createUser('theming_legacy', 'theming_legacy'); + self::assertNotFalse($user); + // Set the users theming value to legacy key + $config = Server::get(IUserConfig::class); + $config->setValueString('theming_legacy', 'theming', 'background_color', 'ffab00'); + + // expect some output + $output = $this->createMock(IOutput::class); + $output->expects(self::exactly(3)) + ->method('info') + ->willReturnCallback(fn ($txt) => match($txt) { + 'No custom system color configured - skipping' => true, + 'Restoring user primary color' => true, + 'Primary color of users restored' => true, + default => self::fail('output.info called with unexpected argument: ' . $txt) + }); + // Create the migration class + $migration = new Version2006Date20240905111627( + $this->jobList, + $this->appConfig, + Server::get(IDBConnection::class), + ); + // Run the migration + $migration->changeSchema($output, fn () => null, []); + + // See new value + $config->clearCache('theming_legacy'); + $newValue = $config->getValueString('theming_legacy', 'theming', 'primary_color'); + self::assertEquals('ffab00', $newValue); + + // cleanup + $user->delete(); + } + + /** + * Ensure only users with background color but no primary color are migrated + * @group DB + */ + public function testRestoreUserColorsWithConflicts(): void { + $this->appConfig->expects(self::once()) + ->method('getValueString') + ->with('theming', 'color', '') + ->willReturn(''); + $this->appConfig->expects(self::once()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn(false); + + // Create a user + $manager = Server::get(IUserManager::class); + $legacyUser = $manager->createUser('theming_legacy', 'theming_legacy'); + self::assertNotFalse($legacyUser); + $user = $manager->createUser('theming_no_legacy', 'theming_no_legacy'); + self::assertNotFalse($user); + // Set the users theming value to legacy key + $config = Server::get(IUserConfig::class); + $config->setValueString($user->getUID(), 'theming', 'primary_color', '999999'); + $config->setValueString($user->getUID(), 'theming', 'background_color', '111111'); + $config->setValueString($legacyUser->getUID(), 'theming', 'background_color', 'ffab00'); + + // expect some output + $output = $this->createMock(IOutput::class); + $output->expects(self::exactly(3)) + ->method('info') + ->willReturnCallback(fn ($txt) => match($txt) { + 'No custom system color configured - skipping' => true, + 'Restoring user primary color' => true, + 'Primary color of users restored' => true, + default => self::fail('output.info called with unexpected argument: ' . $txt) + }); + // Create the migration class + $migration = new Version2006Date20240905111627( + $this->jobList, + $this->appConfig, + Server::get(IDBConnection::class), + ); + // Run the migration + $migration->changeSchema($output, fn () => null, []); + + // See new value of only the legacy user + $config->clearCacheAll(); + self::assertEquals('111111', $config->getValueString($user->getUID(), 'theming', 'background_color')); + self::assertEquals('999999', $config->getValueString($user->getUID(), 'theming', 'primary_color')); + self::assertEquals('ffab00', $config->getValueString($legacyUser->getUID(), 'theming', 'primary_color')); + + // cleanup + $legacyUser->delete(); + $user->delete(); + } +} diff --git a/apps/theming/tests/Service/ThemesServiceTest.php b/apps/theming/tests/Service/ThemesServiceTest.php new file mode 100644 index 00000000000..354ed1dec85 --- /dev/null +++ b/apps/theming/tests/Service/ThemesServiceTest.php @@ -0,0 +1,369 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Service; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\Themes\LightTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserSession; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; +use Test\TestCase; + +class ThemesServiceTest extends TestCase { + private IUserSession&MockObject $userSession; + private IConfig&MockObject $config; + private LoggerInterface&MockObject $logger; + + private ThemingDefaults&MockObject $themingDefaults; + private ThemesService $themesService; + + /** @var ITheme[] */ + private array $themes; + + protected function setUp(): void { + $this->userSession = $this->createMock(IUserSession::class); + $this->config = $this->createMock(IConfig::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + + $this->themingDefaults->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + + $this->initThemes(); + + $this->themesService = new ThemesService( + $this->userSession, + $this->config, + $this->logger, + ...array_values($this->themes) + ); + + parent::setUp(); + } + + public function testGetThemes(): void { + $expected = [ + 'default', + 'light', + 'dark', + 'light-highcontrast', + 'dark-highcontrast', + 'opendyslexic', + ]; + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } + + public function testGetThemesEnforced(): void { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('dark'); + $this->logger->expects($this->never()) + ->method('error'); + + $expected = [ + 'default', + 'dark', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } + + public function testGetThemesEnforcedInvalid(): void { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('invalid'); + $this->logger->expects($this->once()) + ->method('error') + ->with('Enforced theme not found', ['theme' => 'invalid']); + + $expected = [ + 'default', + 'light', + 'dark', + 'light-highcontrast', + 'dark-highcontrast', + 'opendyslexic', + ]; + + $this->assertEquals($expected, array_keys($this->themesService->getThemes())); + } + + public static function dataTestEnableTheme(): array { + return [ + ['default', ['default'], ['default']], + ['dark', ['default'], ['dark']], + ['dark', ['dark'], ['dark']], + ['opendyslexic', ['dark'], ['dark', 'opendyslexic']], + ['dark', ['light-highcontrast', 'opendyslexic'], ['opendyslexic', 'dark']], + ]; + } + + /** + * + * @param string[] $enabledThemes + * @param string[] $expectedEnabled + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestEnableTheme')] + public function testEnableTheme(string $toEnable, array $enabledThemes, array $expectedEnabled): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') + ->willReturn(json_encode($enabledThemes)); + + $this->assertEquals($expectedEnabled, $this->themesService->enableTheme($this->themes[$toEnable])); + } + + + public static function dataTestDisableTheme(): array { + return [ + ['dark', ['default'], ['default']], + ['dark', ['dark'], []], + ['opendyslexic', ['dark', 'opendyslexic'], ['dark'], ], + ['light-highcontrast', ['opendyslexic'], ['opendyslexic']], + ]; + } + + /** + * + * @param string[] $enabledThemes + * @param string[] $expectedEnabled + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestDisableTheme')] + public function testDisableTheme(string $toDisable, array $enabledThemes, array $expectedEnabled): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') + ->willReturn(json_encode($enabledThemes)); + + + $this->assertEquals($expectedEnabled, $this->themesService->disableTheme($this->themes[$toDisable])); + } + + + public static function dataTestIsEnabled(): array { + return [ + ['dark', [], false], + ['dark', ['dark'], true], + ['opendyslexic', ['dark', 'opendyslexic'], true], + ['light-highcontrast', ['opendyslexic'], false], + ]; + } + + /** + * @param string[] $enabledThemes + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestIsEnabled')] + public function testIsEnabled(string $themeId, array $enabledThemes, bool $expected): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') + ->willReturn(json_encode($enabledThemes)); + + + $this->assertEquals($expected, $this->themesService->isEnabled($this->themes[$themeId])); + } + + public function testGetEnabledThemes(): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') + ->willReturn(json_encode(['default'])); + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn(''); + + $this->assertEquals(['default'], $this->themesService->getEnabledThemes()); + } + + public function testGetEnabledThemesEnforced(): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', '["default"]') + ->willReturn(json_encode([])); + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn('light'); + + $this->assertEquals(['light'], $this->themesService->getEnabledThemes()); + } + + + public static function dataTestSetEnabledThemes(): array { + return [ + [[], []], + [['light'], ['light']], + [['dark'], ['dark']], + [['dark', 'dark', 'opendyslexic'], ['dark', 'opendyslexic']], + ]; + } + + /** + * + * @param string[] $enabledThemes + * @param string[] $expected + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestSetEnabledThemes')] + public function testSetEnabledThemes(array $enabledThemes, array $expected): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + + $this->config->expects($this->once()) + ->method('setUserValue') + ->with('user', Application::APP_ID, 'enabled-themes', json_encode($expected)); + + $this->invokePrivate($this->themesService, 'setEnabledThemes', [$enabledThemes]); + } + + private function initThemes() { + $util = $this->createMock(Util::class); + $urlGenerator = $this->createMock(IURLGenerator::class); + $imageManager = $this->createMock(ImageManager::class); + $l10n = $this->createMock(IL10N::class); + $appManager = $this->createMock(IAppManager::class); + + $this->themes = [ + 'default' => new DefaultTheme( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'light' => new LightTheme( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'dark' => new DarkTheme( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'light-highcontrast' => new HighContrastTheme( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'dark-highcontrast' => new DarkHighContrastTheme( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + 'opendyslexic' => new DyslexiaFont( + $util, + $this->themingDefaults, + $this->userSession, + $urlGenerator, + $imageManager, + $this->config, + $l10n, + $appManager, + null, + ), + ]; + } +} diff --git a/apps/theming/tests/ServicesTest.php b/apps/theming/tests/ServicesTest.php new file mode 100644 index 00000000000..3971c9b6698 --- /dev/null +++ b/apps/theming/tests/ServicesTest.php @@ -0,0 +1,70 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\Capabilities; +use OCA\Theming\Controller\ThemingController; +use OCA\Theming\Settings\Admin; +use OCA\Theming\Settings\PersonalSection; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\AppFramework\App; +use OCP\AppFramework\IAppContainer; +use OCP\Capabilities\ICapability; +use OCP\IL10N; +use OCP\Settings\IIconSection; +use OCP\Settings\ISettings; +use Test\TestCase; + +/** + * Class ServicesTest + * + * @group DB + * @package OCA\Theming\Tests + */ +class ServicesTest extends TestCase { + protected App $app; + + protected IAppContainer $container; + + protected function setUp(): void { + parent::setUp(); + $this->app = new App('theming'); + $this->container = $this->app->getContainer(); + } + + public static function queryData(): array { + return [ + [IL10N::class], + + // lib/ + [Capabilities::class], + [Capabilities::class, ICapability::class], + [ThemingDefaults::class], + [ThemingDefaults::class, \OC_Defaults::class], + [Util::class], + + // Controller + [ThemingController::class, ThemingController::class], + + // Settings + [Admin::class], + [Admin::class, ISettings::class], + [PersonalSection::class], + [PersonalSection::class, IIconSection::class], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('queryData')] + public function testContainerQuery(string $service, ?string $expected = null): void { + if ($expected === null) { + $expected = $service; + } + $this->assertInstanceOf($expected, $this->container->query($service)); + } +} diff --git a/apps/theming/tests/Settings/AdminSectionTest.php b/apps/theming/tests/Settings/AdminSectionTest.php new file mode 100644 index 00000000000..ecb889f264b --- /dev/null +++ b/apps/theming/tests/Settings/AdminSectionTest.php @@ -0,0 +1,60 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Settings; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\Settings\AdminSection; +use OCP\IL10N; +use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class AdminSectionTest extends TestCase { + private IURLGenerator&MockObject $url; + private IL10N&MockObject $l; + private AdminSection $section; + + protected function setUp(): void { + parent::setUp(); + $this->url = $this->createMock(IURLGenerator::class); + $this->l = $this->createMock(IL10N::class); + + $this->section = new AdminSection( + Application::APP_ID, + $this->url, + $this->l + ); + } + + public function testGetID(): void { + $this->assertSame('theming', $this->section->getID()); + } + + public function testGetName(): void { + $this->l + ->expects($this->once()) + ->method('t') + ->with('Theming') + ->willReturn('Theming'); + + $this->assertSame('Theming', $this->section->getName()); + } + + public function testGetPriority(): void { + $this->assertSame(30, $this->section->getPriority()); + } + + public function testGetIcon(): void { + $this->url->expects($this->once()) + ->method('imagePath') + ->with('theming', 'app-dark.svg') + ->willReturn('icon'); + + $this->assertSame('icon', $this->section->getIcon()); + } +} diff --git a/apps/theming/tests/Settings/AdminTest.php b/apps/theming/tests/Settings/AdminTest.php new file mode 100644 index 00000000000..277b94900a8 --- /dev/null +++ b/apps/theming/tests/Settings/AdminTest.php @@ -0,0 +1,137 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Settings; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\Settings\Admin; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class AdminTest extends TestCase { + private Admin $admin; + private IConfig&MockObject $config; + private ThemingDefaults&MockObject $themingDefaults; + private IInitialState&MockObject $initialState; + private IURLGenerator&MockObject $urlGenerator; + private ImageManager&MockObject $imageManager; + private IL10N&MockObject $l10n; + private INavigationManager&MockObject $navigationManager; + + protected function setUp(): void { + parent::setUp(); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->initialState = $this->createMock(IInitialState::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->navigationManager = $this->createMock(INavigationManager::class); + + $this->admin = new Admin( + Application::APP_ID, + $this->config, + $this->l10n, + $this->themingDefaults, + $this->initialState, + $this->urlGenerator, + $this->imageManager, + $this->navigationManager, + ); + } + + public function testGetFormNoErrors(): void { + $this->config + ->expects($this->once()) + ->method('getSystemValue') + ->with('theme', '') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) + ->method('getEntity') + ->willReturn('MyEntity'); + $this->themingDefaults + ->expects($this->once()) + ->method('getBaseUrl') + ->willReturn('https://example.com'); + $this->themingDefaults + ->expects($this->once()) + ->method('getImprintUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) + ->method('getPrivacyUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) + ->method('getSlogan') + ->willReturn('MySlogan'); + $this->themingDefaults + ->expects($this->once()) + ->method('getDefaultColorPrimary') + ->willReturn('#fff'); + + $expected = new TemplateResponse('theming', 'settings-admin'); + $this->assertEquals($expected, $this->admin->getForm()); + } + + public function testGetFormWithErrors(): void { + $this->config + ->expects($this->once()) + ->method('getSystemValue') + ->with('theme', '') + ->willReturn('MyCustomTheme'); + $this->l10n + ->expects($this->once()) + ->method('t') + ->with('You are already using a custom theme. Theming app settings might be overwritten by that.') + ->willReturn('You are already using a custom theme. Theming app settings might be overwritten by that.'); + $this->themingDefaults + ->expects($this->once()) + ->method('getEntity') + ->willReturn('MyEntity'); + $this->themingDefaults + ->expects($this->once()) + ->method('getBaseUrl') + ->willReturn('https://example.com'); + $this->themingDefaults + ->expects($this->once()) + ->method('getImprintUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) + ->method('getPrivacyUrl') + ->willReturn(''); + $this->themingDefaults + ->expects($this->once()) + ->method('getSlogan') + ->willReturn('MySlogan'); + $this->themingDefaults + ->expects($this->once()) + ->method('getDefaultColorPrimary') + ->willReturn('#fff'); + + $expected = new TemplateResponse('theming', 'settings-admin'); + $this->assertEquals($expected, $this->admin->getForm()); + } + + public function testGetSection(): void { + $this->assertSame('theming', $this->admin->getSection()); + } + + public function testGetPriority(): void { + $this->assertSame(5, $this->admin->getPriority()); + } +} diff --git a/apps/theming/tests/Settings/PersonalTest.php b/apps/theming/tests/Settings/PersonalTest.php new file mode 100644 index 00000000000..9216450ec9c --- /dev/null +++ b/apps/theming/tests/Settings/PersonalTest.php @@ -0,0 +1,236 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Settings; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Service\ThemesService; +use OCA\Theming\Settings\Personal; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\Themes\LightTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use OCP\IUserSession; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class PersonalTest extends TestCase { + private IConfig&MockObject $config; + private ThemesService&MockObject $themesService; + private IInitialState&MockObject $initialStateService; + private ThemingDefaults&MockObject $themingDefaults; + private INavigationManager&MockObject $navigationManager; + private Personal $admin; + + /** @var ITheme[] */ + private array $themes; + + protected function setUp(): void { + parent::setUp(); + $this->config = $this->createMock(IConfig::class); + $this->themesService = $this->createMock(ThemesService::class); + $this->initialStateService = $this->createMock(IInitialState::class); + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->navigationManager = $this->createMock(INavigationManager::class); + + $this->initThemes(); + + $this->themesService + ->expects($this->any()) + ->method('getThemes') + ->willReturn($this->themes); + + $this->admin = new Personal( + Application::APP_ID, + 'admin', + $this->config, + $this->themesService, + $this->initialStateService, + $this->themingDefaults, + $this->navigationManager, + ); + } + + public function dataTestGetForm(): array { + return [ + ['', [ + $this->formatThemeForm('default'), + $this->formatThemeForm('light'), + $this->formatThemeForm('dark'), + $this->formatThemeForm('light-highcontrast'), + $this->formatThemeForm('dark-highcontrast'), + $this->formatThemeForm('opendyslexic'), + ]], + ['dark', [ + $this->formatThemeForm('dark'), + $this->formatThemeForm('opendyslexic'), + ]], + ]; + } + + /** + * @param string[] $enabledThemes + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestGetForm')] + public function testGetForm(string $enforcedTheme, array $themesState): void { + $this->config->expects($this->once()) + ->method('getSystemValueString') + ->with('enforce_theme', '') + ->willReturn($enforcedTheme); + + $this->config->expects($this->any()) + ->method('getUserValue') + ->willReturnMap([ + ['admin', 'core', 'apporder', '[]', '[]'], + ['admin', 'theming', 'background_image', BackgroundService::BACKGROUND_DEFAULT], + ]); + + $this->navigationManager->expects($this->once()) + ->method('getDefaultEntryIdForUser') + ->willReturn('forced_id'); + + $this->initialStateService->expects($this->exactly(8)) + ->method('provideInitialState') + ->willReturnMap([ + ['shippedBackgrounds', BackgroundService::SHIPPED_BACKGROUNDS], + ['themingDefaults'], + ['enableBlurFilter', ''], + ['userBackgroundImage'], + ['themes', $themesState], + ['enforceTheme', $enforcedTheme], + ['isUserThemingDisabled', false], + ['navigationBar', ['userAppOrder' => [], 'enforcedDefaultApp' => 'forced_id']], + ]); + + $expected = new TemplateResponse('theming', 'settings-personal'); + $this->assertEquals($expected, $this->admin->getForm()); + } + + public function testGetSection(): void { + $this->assertSame('theming', $this->admin->getSection()); + } + + public function testGetPriority(): void { + $this->assertSame(40, $this->admin->getPriority()); + } + + private function initThemes() { + $util = $this->createMock(Util::class); + $themingDefaults = $this->createMock(ThemingDefaults::class); + $userSession = $this->createMock(IUserSession::class); + $urlGenerator = $this->createMock(IURLGenerator::class); + $imageManager = $this->createMock(ImageManager::class); + $config = $this->createMock(IConfig::class); + $l10n = $this->createMock(IL10N::class); + $appManager = $this->createMock(IAppManager::class); + + $themingDefaults->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $themingDefaults->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + + $this->themes = [ + 'default' => new DefaultTheme( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + 'light' => new LightTheme( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + 'dark' => new DarkTheme( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + 'light-highcontrast' => new HighContrastTheme( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + 'dark-highcontrast' => new DarkHighContrastTheme( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + 'opendyslexic' => new DyslexiaFont( + $util, + $themingDefaults, + $userSession, + $urlGenerator, + $imageManager, + $config, + $l10n, + $appManager, + null, + ), + ]; + } + + private function formatThemeForm(string $themeId): array { + $this->initThemes(); + + $theme = $this->themes[$themeId]; + return [ + 'id' => $theme->getId(), + 'type' => $theme->getType(), + 'title' => $theme->getTitle(), + 'enableLabel' => $theme->getEnableLabel(), + 'description' => $theme->getDescription(), + 'enabled' => false, + ]; + } +} diff --git a/apps/theming/tests/Themes/AccessibleThemeTestCase.php b/apps/theming/tests/Themes/AccessibleThemeTestCase.php new file mode 100644 index 00000000000..f516e1f5116 --- /dev/null +++ b/apps/theming/tests/Themes/AccessibleThemeTestCase.php @@ -0,0 +1,172 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Themes; + +use OCA\Theming\ITheme; +use OCA\Theming\Util; +use Test\TestCase; + +class AccessibleThemeTestCase extends TestCase { + protected ITheme $theme; + protected Util $util; + + /** + * Set to true to check for WCAG AAA level accessibility + */ + protected static bool $WCAGaaa = false; + + public static function dataAccessibilityPairs(): array { + $textContrast = self::$WCAGaaa ? 7.0 : 4.5; + $elementContrast = 3.0; + + return [ + 'primary-element on background' => [ + [ + '--color-primary-element', + '--color-primary-element-hover', + ], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + '--color-background-darker', + '--color-main-background-blur', + ], + $elementContrast, + ], + 'status color elements on background' => [ + [ + '--color-error', + '--color-error-hover', + '--color-warning', + '--color-warning-hover', + '--color-info', + '--color-info-hover', + '--color-success', + '--color-success-hover', + '--color-favorite', + ], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + '--color-background-darker', + '--color-main-background-blur', + ], + $elementContrast, + ], + 'border-colors' => [ + [ + '--color-border-maxcontrast', + ], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + '--color-main-background-blur', + ], + $elementContrast, + ], + // Those two colors are used for borders which will be `color-main-text` on focussed state, thus need 3:1 contrast to it + 'success-error-border-colors' => [ + [ + '--color-error', + '--color-success', + ], + [ + '--color-main-text', + ], + $elementContrast, + ], + 'primary-element-text' => [ + [ + '--color-primary-element-text', + '--color-primary-element-text-dark', + ], + [ + '--color-primary-element', + '--color-primary-element-hover', + ], + $textContrast, + ], + 'primary-element-light-text' => [ + ['--color-primary-element-light-text'], + [ + '--color-primary-element-light', + '--color-primary-element-light-hover', + ], + $textContrast, + ], + 'main-text' => [ + ['--color-main-text'], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + '--color-background-darker', + '--color-main-background-blur', + ], + $textContrast, + ], + 'max-contrast-text' => [ + ['--color-text-maxcontrast'], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + ], + $textContrast, + ], + 'max-contrast text-on blur' => [ + ['--color-text-maxcontrast-background-blur'], + [ + '--color-main-background-blur', + ], + $textContrast, + ], + 'status-text' => [ + [ + '--color-error-text', + '--color-warning-text', + '--color-success-text', + '--color-info-text', + ], + [ + '--color-main-background', + '--color-background-hover', + '--color-background-dark', + '--color-main-background-blur', + ], + $textContrast, + ], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataAccessibilityPairs')] + public function testAccessibilityOfVariables(array $mainColors, array $backgroundColors, float $minContrast): void { + if (!isset($this->theme)) { + $this->markTestSkipped('You need to setup $this->theme in your setUp function'); + } elseif (!isset($this->util)) { + $this->markTestSkipped('You need to setup $this->util in your setUp function'); + } + + $variables = $this->theme->getCSSVariables(); + + // Blur effect does not work so we mockup the color - worst supported case is the default "clouds" background image (on dark themes the clouds with white color are bad on bright themes the primary color as sky is bad) + $variables['--color-main-background-blur'] = $this->util->mix($variables['--color-main-background'], $this->util->isBrightColor($variables['--color-main-background']) ? '#000000' : '#ffffff', 75); + + foreach ($backgroundColors as $background) { + $this->assertStringStartsWith('#', $variables[$background], 'Is not a plain color variable - consider to remove or fix this test'); + foreach ($mainColors as $main) { + $this->assertStringStartsWith('#', $variables[$main], 'Is not a plain color variable - consider to remove or fix this test'); + $realContrast = $this->util->colorContrast($variables[$main], $variables[$background]); + $this->assertGreaterThanOrEqual($minContrast, $realContrast, "Contrast is not high enough for $main (" . $variables[$main] . ") on $background (" . $variables[$background] . ')'); + } + } + } +} diff --git a/apps/theming/tests/Themes/DarkHighContrastThemeTest.php b/apps/theming/tests/Themes/DarkHighContrastThemeTest.php new file mode 100644 index 00000000000..d03e8b13300 --- /dev/null +++ b/apps/theming/tests/Themes/DarkHighContrastThemeTest.php @@ -0,0 +1,130 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Themes; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Themes\DarkHighContrastTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; + +class DarkHighContrastThemeTest extends AccessibleThemeTestCase { + private ThemingDefaults&MockObject $themingDefaults; + private IUserSession&MockObject $userSession; + private IURLGenerator&MockObject $urlGenerator; + private ImageManager&MockObject $imageManager; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + + // !! important: Enable WCAG AAA tests + protected static bool $WCAGaaa = true; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->util = new Util( + $this->createMock(ServerVersion::class), + $this->config, + $this->appManager, + $this->createMock(IAppData::class), + $this->imageManager + ); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getColorBackground') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorBackground') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getBackground') + ->willReturn('/apps/' . Application::APP_ID . '/img/background/' . BackgroundService::DEFAULT_BACKGROUND_IMAGE); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->urlGenerator + ->expects($this->any()) + ->method('imagePath') + ->willReturnCallback(function ($app = 'core', $filename = '') { + return "/$app/img/$filename"; + }); + + $this->theme = new DarkHighContrastTheme( + $this->util, + $this->themingDefaults, + $this->userSession, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + $this->appManager, + null, + ); + + parent::setUp(); + } + + + public function testGetId(): void { + $this->assertEquals('dark-highcontrast', $this->theme->getId()); + } + + public function testGetType(): void { + $this->assertEquals(ITheme::TYPE_THEME, $this->theme->getType()); + } + + public function testGetTitle(): void { + $this->assertEquals('Dark theme with high contrast mode', $this->theme->getTitle()); + } + + public function testGetEnableLabel(): void { + $this->assertEquals('Enable dark high contrast mode', $this->theme->getEnableLabel()); + } + + public function testGetDescription(): void { + $this->assertEquals('Similar to the high contrast mode, but with dark colours.', $this->theme->getDescription()); + } + + public function testGetMediaQuery(): void { + $this->assertEquals('(prefers-color-scheme: dark) and (prefers-contrast: more)', $this->theme->getMediaQuery()); + } +} diff --git a/apps/theming/tests/Themes/DarkThemeTest.php b/apps/theming/tests/Themes/DarkThemeTest.php new file mode 100644 index 00000000000..656779b5b24 --- /dev/null +++ b/apps/theming/tests/Themes/DarkThemeTest.php @@ -0,0 +1,132 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Themes; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Themes\DarkTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; + +class DarkThemeTest extends AccessibleThemeTestCase { + private ThemingDefaults&MockObject $themingDefaults; + private IUserSession&MockObject $userSession; + private IURLGenerator&MockObject $urlGenerator; + private ImageManager&MockObject $imageManager; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->util = new Util( + $this->createMock(ServerVersion::class), + $this->config, + $this->appManager, + $this->createMock(IAppData::class), + $this->imageManager + ); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getColorBackground') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorBackground') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getBackground') + ->willReturn('/apps/' . Application::APP_ID . '/img/background/' . BackgroundService::DEFAULT_BACKGROUND_IMAGE); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->urlGenerator + ->expects($this->any()) + ->method('imagePath') + ->willReturnCallback(function ($app = 'core', $filename = '') { + return "/$app/img/$filename"; + }); + + $this->theme = new DarkTheme( + $this->util, + $this->themingDefaults, + $this->userSession, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + $this->appManager, + null, + ); + + parent::setUp(); + } + + + public function testGetId(): void { + $this->assertEquals('dark', $this->theme->getId()); + } + + public function testGetType(): void { + $this->assertEquals(ITheme::TYPE_THEME, $this->theme->getType()); + } + + public function testGetTitle(): void { + $this->assertEquals('Dark theme', $this->theme->getTitle()); + } + + public function testGetEnableLabel(): void { + $this->assertEquals('Enable dark theme', $this->theme->getEnableLabel()); + } + + public function testGetDescription(): void { + $this->assertEquals('A dark theme to ease your eyes by reducing the overall luminosity and brightness.', $this->theme->getDescription()); + } + + public function testGetMediaQuery(): void { + $this->assertEquals('(prefers-color-scheme: dark)', $this->theme->getMediaQuery()); + } + + public function testGetCustomCss(): void { + $this->assertEquals('', $this->theme->getCustomCss()); + } +} diff --git a/apps/theming/tests/Themes/DefaultThemeTest.php b/apps/theming/tests/Themes/DefaultThemeTest.php new file mode 100644 index 00000000000..d2606ffc275 --- /dev/null +++ b/apps/theming/tests/Themes/DefaultThemeTest.php @@ -0,0 +1,157 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Themes; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Themes\DefaultTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; + +class DefaultThemeTest extends AccessibleThemeTestCase { + private ThemingDefaults&MockObject $themingDefaults; + private IUserSession&MockObject $userSession; + private IURLGenerator&MockObject $urlGenerator; + private ImageManager&MockObject $imageManager; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->util = new Util( + $this->createMock(ServerVersion::class), + $this->config, + $this->appManager, + $this->createMock(IAppData::class), + $this->imageManager + ); + + $defaultBackground = BackgroundService::SHIPPED_BACKGROUNDS[BackgroundService::DEFAULT_BACKGROUND_IMAGE]; + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn($defaultBackground['primary_color']); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorBackground') + ->willReturn($defaultBackground['background_color']); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn($defaultBackground['primary_color']); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorBackground') + ->willReturn($defaultBackground['background_color']); + + $this->themingDefaults + ->expects($this->any()) + ->method('getBackground') + ->willReturn('/apps/' . Application::APP_ID . '/img/background/' . BackgroundService::DEFAULT_BACKGROUND_IMAGE); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->urlGenerator + ->expects($this->any()) + ->method('imagePath') + ->willReturnCallback(function ($app = 'core', $filename = '') { + return "/$app/img/$filename"; + }); + + $this->theme = new DefaultTheme( + $this->util, + $this->themingDefaults, + $this->userSession, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + $this->appManager, + null, + ); + + parent::setUp(); + } + + + public function testGetId(): void { + $this->assertEquals('default', $this->theme->getId()); + } + + public function testGetType(): void { + $this->assertEquals(ITheme::TYPE_THEME, $this->theme->getType()); + } + + public function testGetTitle(): void { + $this->assertEquals('System default theme', $this->theme->getTitle()); + } + + public function testGetEnableLabel(): void { + $this->assertEquals('Enable the system default', $this->theme->getEnableLabel()); + } + + public function testGetDescription(): void { + $this->assertEquals('Using the default system appearance.', $this->theme->getDescription()); + } + + public function testGetMediaQuery(): void { + $this->assertEquals('', $this->theme->getMediaQuery()); + } + + public function testGetCustomCss(): void { + $this->assertEquals('', $this->theme->getCustomCss()); + } + + /** + * Ensure parity between the default theme and the static generated file + * @see ThemingController.php:313 + */ + public function testThemindDisabledFallbackCss(): void { + // Generate variables + $variables = ''; + foreach ($this->theme->getCSSVariables() as $variable => $value) { + $variables .= " $variable: $value;" . PHP_EOL; + }; + + $css = "\n:root {" . PHP_EOL . "$variables}" . PHP_EOL; + $fallbackCss = file_get_contents(__DIR__ . '/../../css/default.css'); + // Remove comments + $fallbackCss = preg_replace('/\s*\/\*[\s\S]*?\*\//m', '', $fallbackCss); + // Remove blank lines + $fallbackCss = preg_replace('/\s*\n\n/', "\n", $fallbackCss); + + $this->assertEquals($css, $fallbackCss); + } +} diff --git a/apps/theming/tests/Themes/DyslexiaFontTest.php b/apps/theming/tests/Themes/DyslexiaFontTest.php new file mode 100644 index 00000000000..7d56fb4b1be --- /dev/null +++ b/apps/theming/tests/Themes/DyslexiaFontTest.php @@ -0,0 +1,163 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Service; + +use OC\Route\Router; +use OC\URLGenerator; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Themes\DyslexiaFont; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class DyslexiaFontTest extends TestCase { + private ThemingDefaults&MockObject $themingDefaults; + private IUserSession&MockObject $userSession; + private IURLGenerator $urlGenerator; + private ImageManager&MockObject $imageManager; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + + private DyslexiaFont $dyslexiaFont; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(IAppManager::class); + + $util = new Util( + $this->createMock(ServerVersion::class), + $this->config, + $this->appManager, + $this->createMock(IAppData::class), + $this->imageManager + ); + + $userSession = $this->createMock(IUserSession::class); + $cacheFactory = $this->createMock(ICacheFactory::class); + $request = $this->createMock(IRequest::class); + $router = $this->createMock(Router::class); + $this->urlGenerator = new URLGenerator( + $this->config, + $userSession, + $cacheFactory, + $request, + $router + ); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorBackground') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorBackground') + ->willReturn('#0082c9'); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->dyslexiaFont = new DyslexiaFont( + $util, + $this->themingDefaults, + $this->userSession, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + $this->appManager, + null, + ); + + parent::setUp(); + } + + + public function testGetId(): void { + $this->assertEquals('opendyslexic', $this->dyslexiaFont->getId()); + } + + public function testGetType(): void { + $this->assertEquals(ITheme::TYPE_FONT, $this->dyslexiaFont->getType()); + } + + public function testGetTitle(): void { + $this->assertNotEmpty($this->dyslexiaFont->getTitle()); + } + + public function testGetEnableLabel(): void { + $this->assertNotEmpty($this->dyslexiaFont->getEnableLabel()); + } + + public function testGetDescription(): void { + $this->assertNotEmpty($this->dyslexiaFont->getDescription()); + } + + public function testGetMediaQuery(): void { + $this->assertEquals('', $this->dyslexiaFont->getMediaQuery()); + } + + public function testGetCSSVariables(): void { + $this->assertStringStartsWith('OpenDyslexic', $this->dyslexiaFont->getCSSVariables()['--font-face']); + } + + public static function dataTestGetCustomCss(): array { + return [ + ['', true], + ['', false], + ['/subfolder', true], + ['/subfolder', false], + ]; + } + + /** + * Ensure the fonts are always loaded from the web root + * despite having url rewriting enabled or not + */ + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestGetCustomCss')] + public function testGetCustomCss(string $webRoot, bool $prettyUrlsEnabled): void { + \OC::$WEBROOT = $webRoot; + $this->config->expects($this->any()) + ->method('getSystemValue') + ->with('htaccess.IgnoreFrontController', false) + ->willReturn($prettyUrlsEnabled); + + $this->assertStringContainsString("'$webRoot/apps/theming/fonts/OpenDyslexic-Regular.otf'", $this->dyslexiaFont->getCustomCss()); + $this->assertStringNotContainsString('index.php', $this->dyslexiaFont->getCustomCss()); + } +} diff --git a/apps/theming/tests/Themes/HighContrastThemeTest.php b/apps/theming/tests/Themes/HighContrastThemeTest.php new file mode 100644 index 00000000000..94f87d7433b --- /dev/null +++ b/apps/theming/tests/Themes/HighContrastThemeTest.php @@ -0,0 +1,131 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests\Themes; + +use OCA\Theming\AppInfo\Application; +use OCA\Theming\ImageManager; +use OCA\Theming\ITheme; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\Themes\HighContrastTheme; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\IUserSession; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; + +class HighContrastThemeTest extends AccessibleThemeTestCase { + private ThemingDefaults&MockObject $themingDefaults; + private IUserSession&MockObject $userSession; + private IURLGenerator&MockObject $urlGenerator; + private ImageManager&MockObject $imageManager; + private IConfig&MockObject $config; + private IL10N&MockObject $l10n; + private IAppManager&MockObject $appManager; + + // !! important: Enable WCAG AAA tests + protected static bool $WCAGaaa = true; + + protected function setUp(): void { + $this->themingDefaults = $this->createMock(ThemingDefaults::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(IAppManager::class); + + $this->util = new Util( + $this->createMock(ServerVersion::class), + $this->config, + $this->appManager, + $this->createMock(IAppData::class), + $this->imageManager + ); + + $this->themingDefaults + ->expects($this->any()) + ->method('getColorPrimary') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorPrimary') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getColorBackground') + ->willReturn('#0082c9'); + $this->themingDefaults + ->expects($this->any()) + ->method('getDefaultColorBackground') + ->willReturn('#0082c9'); + + $this->themingDefaults + ->expects($this->any()) + ->method('getBackground') + ->willReturn('/apps/' . Application::APP_ID . '/img/background/' . BackgroundService::DEFAULT_BACKGROUND_IMAGE); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + }); + + $this->urlGenerator + ->expects($this->any()) + ->method('imagePath') + ->willReturnCallback(function ($app = 'core', $filename = '') { + return "/$app/img/$filename"; + }); + + $this->theme = new HighContrastTheme( + $this->util, + $this->themingDefaults, + $this->userSession, + $this->urlGenerator, + $this->imageManager, + $this->config, + $this->l10n, + $this->appManager, + null, + ); + + parent::setUp(); + } + + + public function testGetId(): void { + $this->assertEquals('light-highcontrast', $this->theme->getId()); + } + + public function testGetType(): void { + $this->assertEquals(ITheme::TYPE_THEME, $this->theme->getType()); + } + + public function testGetTitle(): void { + $this->assertEquals('High contrast mode', $this->theme->getTitle()); + } + + public function testGetEnableLabel(): void { + $this->assertEquals('Enable high contrast mode', $this->theme->getEnableLabel()); + } + + public function testGetDescription(): void { + $this->assertEquals('A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased.', $this->theme->getDescription()); + } + + public function testGetMediaQuery(): void { + $this->assertEquals('(prefers-contrast: more)', $this->theme->getMediaQuery()); + } +} diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php new file mode 100644 index 00000000000..1acd12f12fa --- /dev/null +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -0,0 +1,814 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\ImageManager; +use OCA\Theming\Service\BackgroundService; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\NotFoundException; +use OCP\IAppConfig; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IConfig; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\IUserSession; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class ThemingDefaultsTest extends TestCase { + private IAppConfig&MockObject $appConfig; + private IConfig&MockObject $config; + private \OC_Defaults $defaults; + private IL10N|MockObject $l10n; + private IUserSession&MockObject $userSession; + private IURLGenerator&MockObject $urlGenerator; + private ICacheFactory&MockObject $cacheFactory; + private Util&MockObject $util; + private ICache&MockObject $cache; + private IAppManager&MockObject $appManager; + private ImageManager&MockObject $imageManager; + private INavigationManager&MockObject $navigationManager; + private BackgroundService&MockObject $backgroundService; + private ThemingDefaults $template; + + protected function setUp(): void { + parent::setUp(); + $this->appConfig = $this->createMock(IAppConfig::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->cache = $this->createMock(ICache::class); + $this->util = $this->createMock(Util::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->appManager = $this->createMock(IAppManager::class); + $this->navigationManager = $this->createMock(INavigationManager::class); + $this->backgroundService = $this->createMock(BackgroundService::class); + $this->defaults = new \OC_Defaults(); + $this->urlGenerator + ->expects($this->any()) + ->method('getBaseUrl') + ->willReturn(''); + $this->template = new ThemingDefaults( + $this->config, + $this->appConfig, + $this->l10n, + $this->userSession, + $this->urlGenerator, + $this->cacheFactory, + $this->util, + $this->imageManager, + $this->appManager, + $this->navigationManager, + $this->backgroundService, + ); + } + + public function testGetNameWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('Nextcloud'); + + $this->assertEquals('Nextcloud', $this->template->getName()); + } + + public function testGetNameWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('MyCustomCloud'); + + $this->assertEquals('MyCustomCloud', $this->template->getName()); + } + + public function testGetHTMLNameWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('Nextcloud'); + + $this->assertEquals('Nextcloud', $this->template->getHTMLName()); + } + + public function testGetHTMLNameWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('MyCustomCloud'); + + $this->assertEquals('MyCustomCloud', $this->template->getHTMLName()); + } + + public function testGetTitleWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('Nextcloud'); + + $this->assertEquals('Nextcloud', $this->template->getTitle()); + } + + public function testGetTitleWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('MyCustomCloud'); + + $this->assertEquals('MyCustomCloud', $this->template->getTitle()); + } + + + public function testGetEntityWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('Nextcloud'); + + $this->assertEquals('Nextcloud', $this->template->getEntity()); + } + + public function testGetEntityWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'name', 'Nextcloud') + ->willReturn('MyCustomCloud'); + + $this->assertEquals('MyCustomCloud', $this->template->getEntity()); + } + + public function testGetBaseUrlWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'url', $this->defaults->getBaseUrl()) + ->willReturn($this->defaults->getBaseUrl()); + + $this->assertEquals($this->defaults->getBaseUrl(), $this->template->getBaseUrl()); + } + + public function testGetBaseUrlWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'url', $this->defaults->getBaseUrl()) + ->willReturn('https://example.com/'); + + $this->assertEquals('https://example.com/', $this->template->getBaseUrl()); + } + + public static function legalUrlProvider(): array { + return [ + [''], + ['https://example.com/legal.html'], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('legalUrlProvider')] + public function testGetImprintURL(string $imprintUrl): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'imprintUrl', '') + ->willReturn($imprintUrl); + + $this->assertEquals($imprintUrl, $this->template->getImprintUrl()); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('legalUrlProvider')] + public function testGetPrivacyURL(string $privacyUrl): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'privacyUrl', '') + ->willReturn($privacyUrl); + + $this->assertEquals($privacyUrl, $this->template->getPrivacyUrl()); + } + + public function testGetSloganWithDefault(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'slogan', $this->defaults->getSlogan()) + ->willReturn($this->defaults->getSlogan()); + + $this->assertEquals($this->defaults->getSlogan(), $this->template->getSlogan()); + } + + public function testGetSloganWithCustom(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'slogan', $this->defaults->getSlogan()) + ->willReturn('My custom Slogan'); + + $this->assertEquals('My custom Slogan', $this->template->getSlogan()); + } + + public function testGetShortFooter(): void { + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', ''], + ['theming', 'privacyUrl', '', ''], + ]); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter()); + } + + public function testGetShortFooterEmptyUrl(): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), ''], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', ''], + ['theming', 'privacyUrl', '', ''], + ]); + + $this->assertEquals('<span class="entity-name">Name</span> – Slogan', $this->template->getShortFooter()); + } + + public function testGetShortFooterEmptySlogan(): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), ''], + ['theming', 'imprintUrl', '', ''], + ['theming', 'privacyUrl', '', ''], + ]); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a>', $this->template->getShortFooter()); + } + + public function testGetShortFooterImprint(): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', 'https://example.com/imprint'], + ['theming', 'privacyUrl', '', ''], + ]); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnArgument(0); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan<br/><span class="footer__legal-links"><a href="https://example.com/imprint" class="legal" target="_blank" rel="noreferrer noopener">Legal notice</a></span>', $this->template->getShortFooter()); + } + + public function testGetShortFooterPrivacy(): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', ''], + ['theming', 'privacyUrl', '', 'https://example.com/privacy'], + ]); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnArgument(0); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan<br/><span class="footer__legal-links"><a href="https://example.com/privacy" class="legal" target="_blank" rel="noreferrer noopener">Privacy policy</a></span>', $this->template->getShortFooter()); + } + + public function testGetShortFooterAllLegalLinks(): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', 'https://example.com/imprint'], + ['theming', 'privacyUrl', '', 'https://example.com/privacy'], + ]); + + $this->l10n + ->expects($this->any()) + ->method('t') + ->willReturnArgument(0); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan<br/><span class="footer__legal-links"><a href="https://example.com/imprint" class="legal" target="_blank" rel="noreferrer noopener">Legal notice</a> · <a href="https://example.com/privacy" class="legal" target="_blank" rel="noreferrer noopener">Privacy policy</a></span>', $this->template->getShortFooter()); + } + + public static function invalidLegalUrlProvider(): array { + return [ + ['example.com/legal'], # missing scheme + ['https:///legal'], # missing host + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('invalidLegalUrlProvider')] + public function testGetShortFooterInvalidImprint(string $invalidImprintUrl): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', $invalidImprintUrl], + ['theming', 'privacyUrl', '', ''], + ]); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter()); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('invalidLegalUrlProvider')] + public function testGetShortFooterInvalidPrivacy(string $invalidPrivacyUrl): void { + $this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]); + $this->config + ->expects($this->exactly(5)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'url', $this->defaults->getBaseUrl(), 'url'], + ['theming', 'name', 'Nextcloud', 'Name'], + ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'], + ['theming', 'imprintUrl', '', ''], + ['theming', 'privacyUrl', '', $invalidPrivacyUrl], + ]); + + $this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter()); + } + + public function testGetColorPrimaryWithDefault(): void { + $this->appConfig + ->expects(self::once()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn(false); + $this->appConfig + ->expects(self::once()) + ->method('getValueString') + ->with('theming', 'primary_color', '') + ->willReturn($this->defaults->getColorPrimary()); + + $this->assertEquals($this->defaults->getColorPrimary(), $this->template->getColorPrimary()); + } + + public function testGetColorPrimaryWithCustom(): void { + $this->appConfig + ->expects(self::once()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn(false); + $this->appConfig + ->expects(self::once()) + ->method('getValueString') + ->with('theming', 'primary_color', '') + ->willReturn('#fff'); + + $this->assertEquals('#fff', $this->template->getColorPrimary()); + } + + public static function dataGetColorPrimary(): array { + return [ + 'with fallback default' => [ + 'disableTheming' => false, + 'primaryColor' => '', + 'userPrimaryColor' => '', + 'expected' => BackgroundService::DEFAULT_COLOR, + ], + 'with custom admin primary' => [ + 'disableTheming' => false, + 'primaryColor' => '#aaa', + 'userPrimaryColor' => '', + 'expected' => '#aaa', + ], + 'with custom invalid admin primary' => [ + 'disableTheming' => false, + 'primaryColor' => 'invalid', + 'userPrimaryColor' => '', + 'expected' => BackgroundService::DEFAULT_COLOR, + ], + 'with custom invalid user primary' => [ + 'disableTheming' => false, + 'primaryColor' => '', + 'userPrimaryColor' => 'invalid-name', + 'expected' => BackgroundService::DEFAULT_COLOR, + ], + 'with custom user primary' => [ + 'disableTheming' => false, + 'primaryColor' => '', + 'userPrimaryColor' => '#bbb', + 'expected' => '#bbb', + ], + 'with disabled user theming primary' => [ + 'disableTheming' => true, + 'primaryColor' => '#aaa', + 'userPrimaryColor' => '#bbb', + 'expected' => '#aaa', + ], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetColorPrimary')] + public function testGetColorPrimary(bool $disableTheming, string $primaryColor, string $userPrimaryColor, string $expected): void { + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $user->expects($this->any()) + ->method('getUID') + ->willReturn('user'); + $this->appConfig + ->expects(self::any()) + ->method('getValueBool') + ->with('theming', 'disable-user-theming') + ->willReturn($disableTheming); + $this->appConfig + ->expects(self::any()) + ->method('getValueString') + ->with('theming', 'primary_color', '') + ->willReturn($primaryColor); + $this->config + ->expects($this->any()) + ->method('getUserValue') + ->with('user', 'theming', 'primary_color', '') + ->willReturn($userPrimaryColor); + + $this->assertEquals($expected, $this->template->getColorPrimary()); + } + + public function testSet(): void { + $expectedCalls = [ + ['theming', 'MySetting', 'MyValue'], + ['theming', 'cachebuster', 16], + ]; + $i = 0; + $this->config + ->expects($this->exactly(2)) + ->method('setAppValue') + ->willReturnCallback(function () use ($expectedCalls, &$i): void { + $this->assertEquals($expectedCalls[$i], func_get_args()); + $i++; + }); + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('15'); + $this->cacheFactory + ->expects($this->exactly(2)) + ->method('createDistributed') + ->willReturnMap([ + ['theming-', $this->cache], + ['imagePath', $this->cache], + ]); + $this->cache + ->expects($this->any()) + ->method('clear') + ->with(''); + $this->template->set('MySetting', 'MyValue'); + } + + public function testUndoName(): void { + $this->config + ->expects($this->once()) + ->method('deleteAppValue') + ->with('theming', 'name'); + $this->config + ->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '15'], + ['theming', 'name', 'Nextcloud', 'Nextcloud'], + ]); + $this->config + ->expects($this->once()) + ->method('setAppValue') + ->with('theming', 'cachebuster', 16); + + $this->assertSame('Nextcloud', $this->template->undo('name')); + } + + public function testUndoBaseUrl(): void { + $this->config + ->expects($this->once()) + ->method('deleteAppValue') + ->with('theming', 'url'); + $this->config + ->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '15'], + ['theming', 'url', $this->defaults->getBaseUrl(), $this->defaults->getBaseUrl()], + ]); + $this->config + ->expects($this->once()) + ->method('setAppValue') + ->with('theming', 'cachebuster', 16); + + $this->assertSame($this->defaults->getBaseUrl(), $this->template->undo('url')); + } + + public function testUndoSlogan(): void { + $this->config + ->expects($this->once()) + ->method('deleteAppValue') + ->with('theming', 'slogan'); + $this->config + ->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '15'], + ['theming', 'slogan', $this->defaults->getSlogan(), $this->defaults->getSlogan()], + ]); + $this->config + ->expects($this->once()) + ->method('setAppValue') + ->with('theming', 'cachebuster', 16); + + $this->assertSame($this->defaults->getSlogan(), $this->template->undo('slogan')); + } + + public function testUndoPrimaryColor(): void { + $this->config + ->expects($this->once()) + ->method('deleteAppValue') + ->with('theming', 'primary_color'); + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('15'); + $this->config + ->expects($this->once()) + ->method('setAppValue') + ->with('theming', 'cachebuster', 16); + + $this->assertSame($this->defaults->getColorPrimary(), $this->template->undo('primary_color')); + } + + public function testUndoDefaultAction(): void { + $this->config + ->expects($this->once()) + ->method('deleteAppValue') + ->with('theming', 'defaultitem'); + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('15'); + $this->config + ->expects($this->once()) + ->method('setAppValue') + ->with('theming', 'cachebuster', 16); + + $this->assertSame('', $this->template->undo('defaultitem')); + } + + public function testGetBackground(): void { + $this->imageManager + ->expects($this->once()) + ->method('getImageUrl') + ->with('background') + ->willReturn('custom-background?v=0'); + $this->assertEquals('custom-background?v=0', $this->template->getBackground()); + } + + private function getLogoHelper($withName, $useSvg) { + $this->imageManager->expects($this->any()) + ->method('getImage') + ->with('logo') + ->willThrowException(new NotFoundException()); + $this->config + ->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'logoMime', '', ''], + ['theming', 'cachebuster', '0', '0'], + ]); + $this->urlGenerator->expects($this->once()) + ->method('imagePath') + ->with('core', $withName) + ->willReturn('core-logo'); + $this->assertEquals('core-logo?v=0', $this->template->getLogo($useSvg)); + } + + public function testGetLogoDefaultWithSvg(): void { + $this->getLogoHelper('logo/logo.svg', true); + } + + public function testGetLogoDefaultWithoutSvg(): void { + $this->getLogoHelper('logo/logo.png', false); + } + + public function testGetLogoCustom(): void { + $this->config + ->expects($this->exactly(2)) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'logoMime', '', 'image/svg+xml'], + ['theming', 'cachebuster', '0', '0'], + ]); + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('theming.Theming.getImage') + ->willReturn('custom-logo?v=0'); + $this->assertEquals('custom-logo' . '?v=0', $this->template->getLogo()); + } + + public function testGetScssVariablesCached(): void { + $this->config->expects($this->any())->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('1'); + $this->cacheFactory->expects($this->once()) + ->method('createDistributed') + ->with('theming-1-') + ->willReturn($this->cache); + $this->cache->expects($this->once())->method('get')->with('getScssVariables')->willReturn(['foo' => 'bar']); + $this->assertEquals(['foo' => 'bar'], $this->template->getScssVariables()); + } + + public function testGetScssVariables(): void { + $this->config + ->expects($this->any()) + ->method('getAppValue') + ->willReturnMap([ + ['theming', 'cachebuster', '0', '0'], + ['theming', 'logoMime', '', 'jpeg'], + ['theming', 'backgroundMime', '', 'jpeg'], + ['theming', 'logoheaderMime', '', 'jpeg'], + ['theming', 'faviconMime', '', 'jpeg'], + ]); + + $this->appConfig + ->expects(self::atLeastOnce()) + ->method('getValueString') + ->willReturnMap([ + ['theming', 'primary_color', '', false, $this->defaults->getColorPrimary()], + ['theming', 'primary_color', $this->defaults->getColorPrimary(), false, $this->defaults->getColorPrimary()], + ]); + + $this->util->expects($this->any())->method('invertTextColor')->with($this->defaults->getColorPrimary())->willReturn(false); + $this->util->expects($this->any())->method('elementColor')->with($this->defaults->getColorPrimary())->willReturn('#aaaaaa'); + $this->cacheFactory->expects($this->once()) + ->method('createDistributed') + ->with('theming-0-') + ->willReturn($this->cache); + $this->cache->expects($this->once())->method('get')->with('getScssVariables')->willReturn(null); + $this->imageManager->expects($this->exactly(4)) + ->method('getImageUrl') + ->willReturnMap([ + ['logo', 'custom-logo?v=0'], + ['logoheader', 'custom-logoheader?v=0'], + ['favicon', 'custom-favicon?v=0'], + ['background', 'custom-background?v=0'], + ]); + + $expected = [ + 'theming-cachebuster' => '\'0\'', + 'theming-logo-mime' => '\'jpeg\'', + 'theming-background-mime' => '\'jpeg\'', + 'image-logo' => "url('custom-logo?v=0')", + 'image-login-background' => "url('custom-background?v=0')", + 'color-primary' => $this->defaults->getColorPrimary(), + 'color-primary-text' => '#ffffff', + 'image-login-plain' => 'false', + 'color-primary-element' => '#aaaaaa', + 'theming-logoheader-mime' => '\'jpeg\'', + 'theming-favicon-mime' => '\'jpeg\'', + 'image-logoheader' => "url('custom-logoheader?v=0')", + 'image-favicon' => "url('custom-favicon?v=0')", + 'has-legal-links' => 'false' + ]; + $this->assertEquals($expected, $this->template->getScssVariables()); + } + + public function testGetDefaultAndroidURL(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client') + ->willReturn('https://play.google.com/store/apps/details?id=com.nextcloud.client'); + + $this->assertEquals('https://play.google.com/store/apps/details?id=com.nextcloud.client', $this->template->getAndroidClientUrl()); + } + + public function testGetCustomAndroidURL(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client') + ->willReturn('https://play.google.com/store/apps/details?id=com.mycloud.client'); + + $this->assertEquals('https://play.google.com/store/apps/details?id=com.mycloud.client', $this->template->getAndroidClientUrl()); + } + + public function testGetDefaultiOSURL(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8') + ->willReturn('https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8'); + + $this->assertEquals('https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8', $this->template->getiOSClientUrl()); + } + + public function testGetCustomiOSURL(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8') + ->willReturn('https://geo.itunes.apple.com/us/app/nextcloud/id1234567890?mt=8'); + + $this->assertEquals('https://geo.itunes.apple.com/us/app/nextcloud/id1234567890?mt=8', $this->template->getiOSClientUrl()); + } + + public function testGetDefaultiTunesAppId(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'iTunesAppId', '1125420102') + ->willReturn('1125420102'); + + $this->assertEquals('1125420102', $this->template->getiTunesAppId()); + } + + public function testGetCustomiTunesAppId(): void { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'iTunesAppId', '1125420102') + ->willReturn('1234567890'); + + $this->assertEquals('1234567890', $this->template->getiTunesAppId()); + } + + public static function dataReplaceImagePath(): array { + return [ + ['core', 'test.png', false], + ['core', 'manifest.json'], + ['core', 'favicon.ico'], + ['core', 'favicon-touch.png'] + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataReplaceImagePath')] + public function testReplaceImagePath(string $app, string $image, string|bool $result = 'themingRoute?v=1234abcd'): void { + $this->cache->expects($this->any()) + ->method('get') + ->with('shouldReplaceIcons') + ->willReturn(true); + $this->config + ->expects($this->any()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->urlGenerator + ->expects($this->any()) + ->method('linkToRoute') + ->willReturn('themingRoute'); + if ($result) { + $this->util + ->expects($this->once()) + ->method('getCacheBuster') + ->willReturn('1234abcd'); + } + $this->assertEquals($result, $this->template->replaceImagePath($app, $image)); + } +} diff --git a/apps/theming/tests/UtilTest.php b/apps/theming/tests/UtilTest.php new file mode 100644 index 00000000000..1e944027e32 --- /dev/null +++ b/apps/theming/tests/UtilTest.php @@ -0,0 +1,229 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\ImageManager; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IConfig; +use OCP\Server; +use OCP\ServerVersion; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class UtilTest extends TestCase { + + protected Util $util; + protected IConfig&MockObject $config; + protected IAppData&MockObject $appData; + protected IAppManager $appManager; + protected ImageManager&MockObject $imageManager; + + protected function setUp(): void { + parent::setUp(); + $this->config = $this->createMock(IConfig::class); + $this->appData = $this->createMock(IAppData::class); + $this->appManager = Server::get(IAppManager::class); + $this->imageManager = $this->createMock(ImageManager::class); + $this->util = new Util($this->createMock(ServerVersion::class), $this->config, $this->appManager, $this->appData, $this->imageManager); + } + + public static function dataColorContrast(): array { + return [ + ['#ffffff', '#FFFFFF', 1], + ['#000000', '#000000', 1], + ['#ffffff', '#000000', 21], + ['#000000', '#FFFFFF', 21], + ['#9E9E9E', '#353535', 4.578], + ['#353535', '#9E9E9E', 4.578], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataColorContrast')] + public function testColorContrast(string $color1, string $color2, int|float $contrast): void { + $this->assertEqualsWithDelta($contrast, $this->util->colorContrast($color1, $color2), .001); + } + + public static function dataInvertTextColor(): array { + return [ + ['#ffffff', true], + ['#000000', false], + ['#00679e', false], + ['#ffff00', true], + ]; + } + #[\PHPUnit\Framework\Attributes\DataProvider('dataInvertTextColor')] + public function testInvertTextColor(string $color, bool $expected): void { + $invert = $this->util->invertTextColor($color); + $this->assertEquals($expected, $invert); + } + + public function testCalculateLuminanceLight(): void { + $luminance = $this->util->calculateLuminance('#ffffff'); + $this->assertEquals(1, $luminance); + } + + public function testCalculateLuminanceDark(): void { + $luminance = $this->util->calculateLuminance('#000000'); + $this->assertEquals(0, $luminance); + } + + public function testCalculateLuminanceLightShorthand(): void { + $luminance = $this->util->calculateLuminance('#fff'); + $this->assertEquals(1, $luminance); + } + + public function testCalculateLuminanceDarkShorthand(): void { + $luminance = $this->util->calculateLuminance('#000'); + $this->assertEquals(0, $luminance); + } + + public function testInvertTextColorInvalid(): void { + $this->expectException(\Exception::class); + $this->util->invertTextColor('aaabbbcccddd123'); + } + + public function testInvertTextColorEmpty(): void { + $this->expectException(\Exception::class); + $this->util->invertTextColor(''); + } + + public function testElementColorDefaultBlack(): void { + $elementColor = $this->util->elementColor('#000000'); + $this->assertEquals('#4d4d4d', $elementColor); + } + + public function testElementColorDefaultWhite(): void { + $elementColor = $this->util->elementColor('#ffffff'); + $this->assertEquals('#b3b3b3', $elementColor); + } + + public function testElementColorBlackOnDarkBackground(): void { + $elementColor = $this->util->elementColor('#000000', false); + $this->assertEquals('#4d4d4d', $elementColor); + } + + public function testElementColorBlackOnBrightBackground(): void { + $elementColor = $this->util->elementColor('#000000', true); + $this->assertEquals('#000000', $elementColor); + } + + public function testElementColorWhiteOnBrightBackground(): void { + $elementColor = $this->util->elementColor('#ffffff', true); + $this->assertEquals('#b3b3b3', $elementColor); + } + + public function testElementColorWhiteOnDarkBackground(): void { + $elementColor = $this->util->elementColor('#ffffff', false); + $this->assertEquals('#ffffff', $elementColor); + } + + public function testGenerateRadioButtonWhite(): void { + $button = $this->util->generateRadioButton('#ffffff'); + $expected = 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+PHBhdGggZD0iTTggMWE3IDcgMCAwIDAtNyA3IDcgNyAwIDAgMCA3IDcgNyA3IDAgMCAwIDctNyA3IDcgMCAwIDAtNy03em0wIDFhNiA2IDAgMCAxIDYgNiA2IDYgMCAwIDEtNiA2IDYgNiAwIDAgMS02LTYgNiA2IDAgMCAxIDYtNnptMCAyYTQgNCAwIDEgMCAwIDggNCA0IDAgMCAwIDAtOHoiIGZpbGw9IiNmZmZmZmYiLz48L3N2Zz4='; + $this->assertEquals($expected, $button); + } + + public function testGenerateRadioButtonBlack(): void { + $button = $this->util->generateRadioButton('#000000'); + $expected = 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+PHBhdGggZD0iTTggMWE3IDcgMCAwIDAtNyA3IDcgNyAwIDAgMCA3IDcgNyA3IDAgMCAwIDctNyA3IDcgMCAwIDAtNy03em0wIDFhNiA2IDAgMCAxIDYgNiA2IDYgMCAwIDEtNiA2IDYgNiAwIDAgMS02LTYgNiA2IDAgMCAxIDYtNnptMCAyYTQgNCAwIDEgMCAwIDggNCA0IDAgMCAwIDAtOHoiIGZpbGw9IiMwMDAwMDAiLz48L3N2Zz4='; + $this->assertEquals($expected, $button); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetAppIcon')] + public function testGetAppIcon(string $app, string $expected): void { + $this->appData->expects($this->any()) + ->method('getFolder') + ->with('global/images') + ->willThrowException(new NotFoundException()); + $icon = $this->util->getAppIcon($app); + $this->assertEquals($expected, $icon); + } + + public static function dataGetAppIcon(): array { + return [ + ['user_ldap', Server::get(IAppManager::class)->getAppPath('user_ldap') . '/img/app.svg'], + ['noapplikethis', \OC::$SERVERROOT . '/core/img/logo/logo.svg'], + ['comments', Server::get(IAppManager::class)->getAppPath('comments') . '/img/comments.svg'], + ]; + } + + public function testGetAppIconThemed(): void { + $file = $this->createMock(ISimpleFile::class); + $folder = $this->createMock(ISimpleFolder::class); + $folder->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willReturn($file); + $this->appData->expects($this->once()) + ->method('getFolder') + ->with('global/images') + ->willReturn($folder); + $icon = $this->util->getAppIcon('noapplikethis'); + $this->assertEquals($file, $icon); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetAppImage')] + public function testGetAppImage(string $app, string $image, string|bool $expected): void { + $this->assertEquals($expected, $this->util->getAppImage($app, $image)); + } + + public static function dataGetAppImage(): array { + return [ + ['core', 'logo/logo.svg', \OC::$SERVERROOT . '/core/img/logo/logo.svg'], + ['files', 'folder', \OC::$SERVERROOT . '/apps/files/img/folder.svg'], + ['files', 'folder.svg', \OC::$SERVERROOT . '/apps/files/img/folder.svg'], + ['noapplikethis', 'foobar.svg', false], + ]; + } + + public function testColorizeSvg(): void { + $input = '#0082c9 #0082C9 #000000 #FFFFFF'; + $expected = '#AAAAAA #AAAAAA #000000 #FFFFFF'; + $result = $this->util->colorizeSvg($input, '#AAAAAA'); + $this->assertEquals($expected, $result); + } + + public function testIsAlreadyThemedFalse(): void { + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with('theme', '') + ->willReturn(''); + $actual = $this->util->isAlreadyThemed(); + $this->assertFalse($actual); + } + + public function testIsAlreadyThemedTrue(): void { + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with('theme', '') + ->willReturn('example'); + $actual = $this->util->isAlreadyThemed(); + $this->assertTrue($actual); + } + + public static function dataIsBackgroundThemed(): array { + return [ + ['', false], + ['png', true], + ['backgroundColor', false], + ]; + } + #[\PHPUnit\Framework\Attributes\DataProvider('dataIsBackgroundThemed')] + public function testIsBackgroundThemed(string $backgroundMime, bool $expected): void { + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'backgroundMime', '') + ->willReturn($backgroundMime); + $this->assertEquals($expected, $this->util->isBackgroundThemed()); + } +} diff --git a/apps/theming/tests/data/favicon-original.ico b/apps/theming/tests/data/favicon-original.ico Binary files differnew file mode 100644 index 00000000000..fab2f7f0231 --- /dev/null +++ b/apps/theming/tests/data/favicon-original.ico diff --git a/apps/theming/tests/data/touch-comments.png b/apps/theming/tests/data/touch-comments.png Binary files differnew file mode 100644 index 00000000000..c4dc68d8238 --- /dev/null +++ b/apps/theming/tests/data/touch-comments.png diff --git a/apps/theming/tests/data/touch-core-red.png b/apps/theming/tests/data/touch-core-red.png Binary files differnew file mode 100644 index 00000000000..95e9a292e6e --- /dev/null +++ b/apps/theming/tests/data/touch-core-red.png diff --git a/apps/theming/tests/data/touch-original-png.png b/apps/theming/tests/data/touch-original-png.png Binary files differnew file mode 100644 index 00000000000..a619accae0f --- /dev/null +++ b/apps/theming/tests/data/touch-original-png.png diff --git a/apps/theming/tests/data/touch-original.png b/apps/theming/tests/data/touch-original.png Binary files differnew file mode 100644 index 00000000000..079e555d39d --- /dev/null +++ b/apps/theming/tests/data/touch-original.png diff --git a/apps/theming/tests/data/touch-testing-red.png b/apps/theming/tests/data/touch-testing-red.png Binary files differnew file mode 100644 index 00000000000..352b74fba24 --- /dev/null +++ b/apps/theming/tests/data/touch-testing-red.png |