Merge pull request #1586 from nextcloud/issue-1466-fix-multi-translation-names-and-descriptions

Allow multiple names and description
This commit is contained in:
Lukas Reschke 2016-10-05 19:06:22 +02:00 committed by GitHub
commit da0d0d82c8
2 changed files with 74 additions and 7 deletions

View file

@ -662,15 +662,16 @@ class OC_App {
* Read all app metadata from the info.xml file
*
* @param string $appId id of the app or the path of the info.xml file
* @param boolean $path (optional)
* @param bool $path
* @param string $lang
* @return array|null
* @note all data is read from info.xml, not just pre-defined fields
*/
public static function getAppInfo($appId, $path = false) {
public static function getAppInfo($appId, $path = false, $lang = null) {
if ($path) {
$file = $appId;
} else {
if (isset(self::$appInfo[$appId])) {
if ($lang === null && isset(self::$appInfo[$appId])) {
return self::$appInfo[$appId];
}
$appPath = self::getAppPath($appId);
@ -684,7 +685,7 @@ class OC_App {
$data = $parser->parse($file);
if (is_array($data)) {
$data = OC_App::parseAppInfo($data);
$data = OC_App::parseAppInfo($data, $lang);
}
if(isset($data['ocsid'])) {
$storedId = \OC::$server->getConfig()->getAppValue($appId, 'ocsid');
@ -693,7 +694,9 @@ class OC_App {
}
}
self::$appInfo[$appId] = $data;
if ($lang === null) {
self::$appInfo[$appId] = $data;
}
return $data;
}
@ -843,11 +846,12 @@ class OC_App {
//we don't want to show configuration for these
$blacklist = \OC::$server->getAppManager()->getAlwaysEnabledApps();
$appList = array();
$langCode = \OC::$server->getL10N('core')->getLanguageCode();
foreach ($installedApps as $app) {
if (array_search($app, $blacklist) === false) {
$info = OC_App::getAppInfo($app);
$info = OC_App::getAppInfo($app, false, $langCode);
if (!is_array($info)) {
\OCP\Util::writeLog('core', 'Could not read app info file for app "' . $app . '"', \OCP\Util::ERROR);
continue;
@ -1327,13 +1331,69 @@ class OC_App {
}
}
protected static function findBestL10NOption($options, $lang) {
$fallback = $similarLangFallback = $englishFallback = false;
$lang = strtolower($lang);
$similarLang = $lang;
if (strpos($similarLang, '_')) {
// For "de_DE" we want to find "de" and the other way around
$similarLang = substr($lang, 0, strpos($lang, '_'));
}
foreach ($options as $option) {
if (is_array($option)) {
if ($fallback === false) {
$fallback = $option['@value'];
}
if (!isset($option['@attributes']['lang'])) {
continue;
}
$attributeLang = strtolower($option['@attributes']['lang']);
if ($attributeLang === $lang) {
return $option['@value'];
}
if ($attributeLang === $similarLang) {
$similarLangFallback = $option['@value'];
} else if (strpos($attributeLang, $similarLang . '_') === 0) {
if ($similarLangFallback === false) {
$similarLangFallback = $option['@value'];
}
}
} else {
$englishFallback = $option;
}
}
if ($similarLangFallback !== false) {
return $similarLangFallback;
} else if ($englishFallback !== false) {
return $englishFallback;
}
return (string) $fallback;
}
/**
* parses the app data array and enhanced the 'description' value
*
* @param array $data the app data
* @param string $lang
* @return array improved app data
*/
public static function parseAppInfo(array $data) {
public static function parseAppInfo(array $data, $lang = null) {
if ($lang && isset($data['name']) && is_array($data['name'])) {
$data['name'] = self::findBestL10NOption($data['name'], $lang);
}
if ($lang && isset($data['summary']) && is_array($data['summary'])) {
$data['summary'] = self::findBestL10NOption($data['summary'], $lang);
}
if ($lang && isset($data['description']) && is_array($data['description'])) {
$data['description'] = self::findBestL10NOption($data['description'], $lang);
}
// just modify the description if it is available
// otherwise this will create a $data element with an empty 'description'

View file

@ -183,6 +183,10 @@ OC.Settings.Apps = OC.Settings.Apps || {
app.previewAsIcon = true;
}
if (_.isArray(app.author)) {
app.author = app.author.join(', ');
}
var html = template(app);
if (selector) {
selector.html(html);
@ -513,6 +517,9 @@ OC.Settings.Apps = OC.Settings.Apps || {
// Author Name
apps = apps.concat(_.filter(OC.Settings.Apps.State.apps, function (app) {
if (_.isArray(app.author)) {
return app.author.join(', ').toLowerCase().indexOf(query) !== -1;
}
return app.author.toLowerCase().indexOf(query) !== -1;
}));