aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzotlabs <mike@macgirvin.com>2018-11-07 01:43:43 -0800
committerzotlabs <mike@macgirvin.com>2018-11-07 01:43:43 -0800
commitd2aa2c080f166e23c4aaaefd09ed7c948a1c3cce (patch)
tree12b6e8cef5d347f249479968d08d8f82a9c6e5ff
parenta5483a03c90967eea58f5a0db17c59c4ec3ff2ff (diff)
parent714831195319bcb5359511ce6cd9c5dccc6099dd (diff)
downloadvolse-hubzilla-d2aa2c080f166e23c4aaaefd09ed7c948a1c3cce.tar.gz
volse-hubzilla-d2aa2c080f166e23c4aaaefd09ed7c948a1c3cce.tar.bz2
volse-hubzilla-d2aa2c080f166e23c4aaaefd09ed7c948a1c3cce.zip
Merge branch 'master' into zvi
-rw-r--r--CHANGELOG14
-rw-r--r--Zotlabs/Lib/PConfig.php107
-rw-r--r--Zotlabs/Module/Network.php6
-rw-r--r--Zotlabs/Module/Photo.php36
-rw-r--r--Zotlabs/Module/Ping.php2
-rw-r--r--Zotlabs/Update/_1225.php26
-rwxr-xr-xboot.php4
-rw-r--r--include/config.php4
-rw-r--r--include/zot.php37
-rw-r--r--vendor/composer/autoload_static.php1
-rw-r--r--view/de-de/hmessages.po2
-rw-r--r--view/es-es/hmessages.po2
-rw-r--r--view/fr/hmessages.po2
-rw-r--r--view/he/hmessages.po2
-rw-r--r--view/it/hmessages.po2
-rw-r--r--view/nb-no/hmessages.po2
-rw-r--r--view/nl/hmessages.po2
-rw-r--r--view/pt-br/hmessages.po2
-rw-r--r--view/sv/hmessages.po2
19 files changed, 208 insertions, 47 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 272f839fb..c3e280963 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,17 @@
+Hubzilla 3.8.3 (2018-11-05)
+ - Do not count likes in forum notifications if likes notifications are disabled
+ - Fix typo in spanish translation which broke javascript
+ - Improve linkinfo charset handling and image detection
+ - Fix wrong image resize for some external images
+ - Move blueimp upload lib to composer and update to version 9.25
+ - Remove primary/clone counts from admin summary until we have a mechanism to update the fixed counts
+ - Fix html2markdown() and re-enable previously failing tests
+ - Improve look of oembed content for Hubzilla links
+ - Fix forum notifications count not correct
+ - Fix gallery addon which broke mod apps in some situations
+ - Fix wiki_list widget not working on every page respectively level
+
+
Hubzilla 3.8.2 (2018-10-29)
- Merge unmerged changes from dev into master
- Fix issues with forum handling in mod network and ping
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index ec0792ce1..b9384cf6b 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -57,6 +57,7 @@ class PConfig {
\App::$config[$uid][$c]['config_loaded'] = true;
}
\App::$config[$uid][$c][$k] = $rr['v'];
+ \App::$config[$uid][$c]['pcfgud:'.$k] = $rr['updated'];
}
}
}
@@ -113,7 +114,7 @@ class PConfig {
* The value to store
* @return mixed Stored $value or false
*/
- static public function Set($uid, $family, $key, $value) {
+ static public function Set($uid, $family, $key, $value, $updated=NULL) {
// this catches subtle errors where this function has been called
// with local_channel() when not logged in (which returns false)
@@ -130,29 +131,74 @@ class PConfig {
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+ if (! $updated) {
+ $updated = datetime_convert();
+ }
+
+ $hash = hash('sha256',$family.':'.$key);
+
+ if (self::Get($uid, 'hz_delpconfig', $hash) !== false) {
+ if (Get($uid, 'hz_delpconfig', $hash) > $updated) {
+ logger('Refusing to update pconfig with outdated info (Item deleted more recently).', LOGGER_NORMAL, LOG_ERR);
+ return self::Get($uid,$family,$key);
+ } else {
+ self::Delete($uid,'hz_delpconfig',$hash);
+ }
+ }
+
if(self::Get($uid, $family, $key) === false) {
if(! array_key_exists($uid, \App::$config))
\App::$config[$uid] = array();
if(! array_key_exists($family, \App::$config[$uid]))
\App::$config[$uid][$family] = array();
- $ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
+
+ $ret = q("INSERT INTO pconfig ( uid, cat, k, v, updated ) VALUES ( %d, '%s', '%s', '%s', '%s' ) ",
intval($uid),
dbesc($family),
dbesc($key),
- dbesc($dbvalue)
+ dbesc($dbvalue),
+ dbesc($updated)
);
+
+ // There is a possible race condition if another process happens
+ // to insert something after this thread has Loaded and now. We should
+ // at least make a note of it if it happens.
+
+ if (!$ret) {
+ logger("Error: Insert to pconfig failed.",LOGGER_NORMAL, LOG_ERR);
+ }
+
+ \App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
+
}
else {
+ $new = (\App::$config[$uid][$family]['pcfgud:'.$key] < $updated);
- $ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s'",
- dbesc($dbvalue),
- intval($uid),
- dbesc($family),
- dbesc($key)
- );
+ if ($new) {
+
+ // @NOTE There is still a possible race condition under limited circumstances
+ // where a value will be updated by another thread with more current data than
+ // we have. At this point there is no easy way to test for it, so we update
+ // and hope for the best.
+
+ $ret = q("UPDATE pconfig SET v = '%s', updated = '%s' WHERE uid = %d and cat = '%s' AND k = '%s' ",
+ dbesc($dbvalue),
+ dbesc($updated),
+ intval($uid),
+ dbesc($family),
+ dbesc($key)
+ );
+
+ \App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
+
+ } else {
+ logger('Refusing to update pconfig with outdated info.', LOGGER_NORMAL, LOG_ERR);
+ return self::Get($uid, $family, $key);
+ }
}
+
// keep a separate copy for all variables which were
// set in the life of this page. We need this to
// synchronise channel clones.
@@ -163,7 +209,11 @@ class PConfig {
\App::$config[$uid]['transient'][$family] = array();
\App::$config[$uid][$family][$key] = $value;
- \App::$config[$uid]['transient'][$family][$key] = $value;
+
+ if ($new) {
+ \App::$config[$uid]['transient'][$family][$key] = $value;
+ \App::$config[$uid]['transient'][$family]['pcfgud:'.$key] = $updated;
+ }
if($ret)
return $value;
@@ -186,18 +236,29 @@ class PConfig {
* The configuration key to delete
* @return mixed
*/
- static public function Delete($uid, $family, $key) {
+ static public function Delete($uid, $family, $key, $updated = NULL) {
if(is_null($uid) || $uid === false)
return false;
+ $updated = ($updated) ? $updated : datetime_convert();
+
+ $newer = (\App::$config[$uid][$family]['pcfgud:'.$key] < $updated);
+
+ if (! $newer) {
+ logger('Refusing to delete pconfig with outdated delete request.', LOGGER_NORMAL, LOG_ERR);
+ return false;
+ }
+
$ret = false;
- if(array_key_exists($uid,\App::$config)
- && is_array(\App::$config['uid'])
- && array_key_exists($family,\App::$config['uid'])
- && array_key_exists($key, \App::$config[$uid][$family]))
+ if (isset(\App::$config[$uid][$family][$key])) {
unset(\App::$config[$uid][$family][$key]);
+ }
+
+ if (isset(\App::$config[$uid][$family]['pcfgud:'.$key])) {
+ unset(\App::$config[$uid][$family]['pcfgud:'.$key]);
+ }
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
intval($uid),
@@ -205,6 +266,22 @@ class PConfig {
dbesc($key)
);
+ if ($family != 'hz_delpconfig') {
+ $hash = hash('sha256',$family.':'.$key);
+ set_pconfig($uid,'hz_delpconfig',$hash,$updated);
+ }
+
+ // Synchronize delete with clones.
+
+ if(! array_key_exists('transient', \App::$config[$uid]))
+ \App::$config[$uid]['transient'] = array();
+ if(! array_key_exists($family, \App::$config[$uid]['transient']))
+ \App::$config[$uid]['transient'][$family] = array();
+
+ if ($new) {
+ \App::$config[$uid]['transient'][$family]['pcfgdel:'.$key] = $updated;
+ }
+
return $ret;
}
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 294e11c52..b93faa612 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -258,6 +258,10 @@ class Network extends \Zotlabs\Web\Controller {
}
elseif($pf && $unseen && $nouveau) {
+ $vnotify = get_pconfig(local_channel(), 'system', 'vnotify');
+ if(! ($vnotify & VNOTIFY_LIKE))
+ $likes_sql = " AND verb NOT IN ('" . dbesc(ACTIVITY_LIKE) . "', '" . dbesc(ACTIVITY_DISLIKE) . "') ";
+
// This is for nouveau view public forum cid queries (if a forum notification is clicked)
$p = q("SELECT oid AS parent FROM term WHERE uid = %d AND ttype = %d AND term = '%s'",
intval(local_channel()),
@@ -269,7 +273,7 @@ class Network extends \Zotlabs\Web\Controller {
if($p_str)
$p_sql = " OR item.parent IN ( $p_str ) ";
- $sql_extra = " AND ( owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' OR owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' $p_sql ) AND item_unseen = 1 ";
+ $sql_extra = " AND ( owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' OR owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' $p_sql ) AND item_unseen = 1 $likes_sql ";
}
else {
// This is for threaded view cid queries (e.g. if a forum is selected from the forum filter)
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 8efc00707..d76fca278 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -33,25 +33,24 @@ class Photo extends \Zotlabs\Web\Controller {
$observer_xchan = get_observer_hash();
- $default = z_root() . '/' . get_default_profile_photo();
-
if(isset($type)) {
/**
* Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.
*
*/
-
+
+ $default = get_default_profile_photo();
+
if($type === 'profile') {
switch($res) {
-
case 'm':
$resolution = 5;
- $default = z_root() . '/' . get_default_profile_photo(80);
+ $default = get_default_profile_photo(80);
break;
case 's':
$resolution = 6;
- $default = z_root() . '/' . get_default_profile_photo(48);
+ $default = get_default_profile_photo(48);
break;
case 'l':
default:
@@ -60,6 +59,8 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
+ $modified = filemtime($default);
+ $default = z_root() . '/' . $default;
$uid = $person;
$d = [ 'imgscale' => $resolution, 'channel_id' => $uid, 'default' => $default, 'data' => '', 'mimetype' => '' ];
@@ -78,6 +79,7 @@ class Photo extends \Zotlabs\Web\Controller {
intval(PHOTO_PROFILE)
);
if($r) {
+ $modified = strtotime($r[0]['edited']);
$data = dbunescbin($r[0]['content']);
$mimetype = $r[0]['mimetype'];
}
@@ -164,9 +166,9 @@ class Photo extends \Zotlabs\Web\Controller {
if($exists && $allowed) {
$data = dbunescbin($e[0]['content']);
$mimetype = $e[0]['mimetype'];
- if(intval($e[0]['os_storage'])) {
+ $modified = strtotime($e[0]['edited']);
+ if(intval($e[0]['os_storage']))
$streaming = $data;
- }
}
else {
if(! $allowed) {
@@ -183,7 +185,6 @@ class Photo extends \Zotlabs\Web\Controller {
if(! isset($data)) {
if(isset($resolution)) {
switch($resolution) {
-
case 4:
$data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(),$mimetype);
break;
@@ -210,10 +211,14 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
+ // @FIXME Seems never invoked
// Writing in cachefile
- if (isset($cachefile) && $cachefile != '')
+ if (isset($cachefile) && $cachefile != '') {
file_put_contents($cachefile, $data);
-
+ $modified = filemtime($cachefile);
+ }
+
+
if(function_exists('header_remove')) {
header_remove('Pragma');
header_remove('pragma');
@@ -240,15 +245,16 @@ class Photo extends \Zotlabs\Web\Controller {
// This has performance considerations but we highly recommend you
// leave it alone.
- $cache = get_config('system','photo_cache_time');
- if(! $cache)
- $cache = (3600 * 24); // 1 day
-
+ $cache = get_config('system','photo_cache_time', 86400); // 1 day by default
+
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $cache) . " GMT");
header("Cache-Control: max-age=" . $cache);
}
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modified) . " GMT");
+ header("Content-Length: " . strlen($data));
+
// If it's a file resource, stream it.
if($streaming && $channel) {
diff --git a/Zotlabs/Module/Ping.php b/Zotlabs/Module/Ping.php
index cf5b2e004..f660c3b55 100644
--- a/Zotlabs/Module/Ping.php
+++ b/Zotlabs/Module/Ping.php
@@ -650,7 +650,7 @@ class Ping extends \Zotlabs\Web\Controller {
$p_sql = (($p_str) ? "OR parent IN ( $p_str )" : '');
$r = q("select count(id) as unseen from item
- where uid = %d and ( owner_xchan = '%s' OR author_xchan = '%s' $p_sql ) and item_unseen = 1 $item_normal",
+ where uid = %d and ( owner_xchan = '%s' OR author_xchan = '%s' $p_sql ) and item_unseen = 1 $item_normal $sql_extra",
intval(local_channel()),
dbesc($forums[$x]['xchan_hash']),
dbesc($forums[$x]['xchan_hash'])
diff --git a/Zotlabs/Update/_1225.php b/Zotlabs/Update/_1225.php
new file mode 100644
index 000000000..a7d866154
--- /dev/null
+++ b/Zotlabs/Update/_1225.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Zotlabs\Update;
+
+class _1225 {
+
+ function run() {
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("ALTER TABLE pconfig ADD updated timestamp NOT NULL DEFAULT '0001-01-01 00:00:00' ");
+ $r2 = q("create index \"pconfig_updated_idx\" on pconfig (\"updated\")");
+
+ $r = ($r1 && $r2);
+ }
+ else {
+ $r = q("ALTER TABLE `pconfig` ADD `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' ,
+ ADD INDEX `pconfig_updated` (`updated`)");
+ }
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+ }
+
+}
diff --git a/boot.php b/boot.php
index 9b6047fc0..612654820 100755
--- a/boot.php
+++ b/boot.php
@@ -50,11 +50,11 @@ require_once('include/attach.php');
require_once('include/bbcode.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '3.9.3' );
+define ( 'STD_VERSION', '3.9.4' );
define ( 'ZOT_REVISION', '6.0a' );
-define ( 'DB_UPDATE_VERSION', 1224 );
+define ( 'DB_UPDATE_VERSION', 1225 );
define ( 'PROJECT_BASE', __DIR__ );
diff --git a/include/config.php b/include/config.php
index 0be791715..ec3547a82 100644
--- a/include/config.php
+++ b/include/config.php
@@ -59,8 +59,8 @@ function set_pconfig($uid, $family, $key, $value) {
return Zlib\PConfig::Set($uid,$family,$key,$value);
}
-function del_pconfig($uid, $family, $key) {
- return Zlib\PConfig::Delete($uid,$family,$key);
+function del_pconfig($uid, $family, $key, $updated = NULL) {
+ return Zlib\PConfig::Delete($uid,$family,$key,$updated);
}
function load_xconfig($xchan) {
diff --git a/include/zot.php b/include/zot.php
index 1a632cf87..49fc89e33 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -3507,8 +3507,41 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(array_key_exists('config',$arr) && is_array($arr['config']) && count($arr['config'])) {
foreach($arr['config'] as $cat => $k) {
- foreach($arr['config'][$cat] as $k => $v)
- set_pconfig($channel['channel_id'],$cat,$k,$v);
+
+ $pconfig_updated = [];
+ $pconfig_del = [];
+
+ foreach($arr['config'][$cat] as $k => $v) {
+
+ if (strpos($k,'pcfgud:')===0) {
+
+ $realk = substr($k,7);
+ $pconfig_updated[$realk] = $v;
+ unset($arr['config'][$cat][$k]);
+
+ }
+
+ if (strpos($k,'pcfgdel:')===0) {
+ $realk = substr($k,8);
+ $pconfig_del[$realk] = datetime_convert();
+ unset($arr['config'][$cat][$k]);
+ }
+ }
+
+ foreach($arr['config'][$cat] as $k => $v) {
+
+ if (!isset($pconfig_updated[$k])) {
+ $pconfig_updated[$k] = NULL;
+ }
+
+ set_pconfig($channel['channel_id'],$cat,$k,$v,$pconfig_updated[$k]);
+
+ }
+
+ foreach($pconfig_del as $k => $updated) {
+ del_pconfig($channel['channel_id'],$cat,$k,$updated);
+ }
+
}
}
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index d55227eb1..ce0232306 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -1505,6 +1505,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Update\\_1222' => __DIR__ . '/../..' . '/Zotlabs/Update/_1222.php',
'Zotlabs\\Update\\_1223' => __DIR__ . '/../..' . '/Zotlabs/Update/_1223.php',
'Zotlabs\\Update\\_1224' => __DIR__ . '/../..' . '/Zotlabs/Update/_1224.php',
+ 'Zotlabs\\Update\\_1225' => __DIR__ . '/../..' . '/Zotlabs/Update/_1225.php',
'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php',
'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php',
diff --git a/view/de-de/hmessages.po b/view/de-de/hmessages.po
index 8af9dce6b..4eaec3629 100644
--- a/view/de-de/hmessages.po
+++ b/view/de-de/hmessages.po
@@ -35,7 +35,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index f2c1ccf79..3b42394b1 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -22,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_ES\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
diff --git a/view/fr/hmessages.po b/view/fr/hmessages.po
index c5263c2df..0c89da139 100644
--- a/view/fr/hmessages.po
+++ b/view/fr/hmessages.po
@@ -22,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Plural-Forms: nplurals=2; plural=(n > 1 ? 1 : 0);\n"
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
diff --git a/view/he/hmessages.po b/view/he/hmessages.po
index 991b7f64f..837dfabd0 100644
--- a/view/he/hmessages.po
+++ b/view/he/hmessages.po
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: he\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:239
msgid "parent"
diff --git a/view/it/hmessages.po b/view/it/hmessages.po
index 94911bc20..8c1dc08d7 100644
--- a/view/it/hmessages.po
+++ b/view/it/hmessages.po
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
diff --git a/view/nb-no/hmessages.po b/view/nb-no/hmessages.po
index bcb926d90..0f7f2e8c5 100644
--- a/view/nb-no/hmessages.po
+++ b/view/nb-no/hmessages.po
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb_NO\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:239
msgid "parent"
diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
index c98121122..c672e534e 100644
--- a/view/nl/hmessages.po
+++ b/view/nl/hmessages.po
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
diff --git a/view/pt-br/hmessages.po b/view/pt-br/hmessages.po
index 029642f9b..2645cc9bd 100644
--- a/view/pt-br/hmessages.po
+++ b/view/pt-br/hmessages.po
@@ -25,7 +25,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Plural-Forms: nplurals=2; plural=(n > 1 ? 1 : 0);\n"
#: ../../include/dba/dba_driver.php:50
#, php-format
diff --git a/view/sv/hmessages.po b/view/sv/hmessages.po
index 4486a8630..249dbd8be 100644
--- a/view/sv/hmessages.po
+++ b/view/sv/hmessages.po
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
#: ../../include/dba/dba_driver.php:142
#, php-format