+ $default_circle = 0;
+ }
+
+ return $default_circle;
+ }
+
+ /**
+ * Returns the default circle for groups for a given user
+ *
+ * @param int $uid User id
+ *
+ * @return int circle id
+ * @throws Exception
+ */
+ public static function getDefaultGroupCircle(int $uid): int
+ {
+ $default_circle = DI::pConfig()->get($uid, 'system', 'default-group-gid');
+ if (empty($default_circle)) {
+ $default_circle = self::getDefaultCircle($uid);
+ }
+
+ return $default_circle;
+ }
+
+ /**
+ * Fetch the language code from the given user. If the code is invalid, return the system language
+ *
+ * @param integer $uid User-Id
+ * @return string
+ */
+ public static function getLanguageCode(int $uid): string
+ {
+ $owner = self::getOwnerDataById($uid);
+ $language = DI::l10n()->toISO6391($owner['language']);
+ if (in_array($language, array_keys(DI::l10n()->getLanguageCodes()))) {
+ return $language;
+ }
+ return DI::l10n()->toISO6391(DI::config()->get('system', 'language'));
+ }
+
+ /**
+ * Fetch the wanted languages for a given user
+ *
+ * @param integer $uid
+ * @return array
+ */
+ public static function getWantedLanguages(int $uid): array
+ {
+ return DI::pConfig()->get($uid, 'channel', 'languages', [User::getLanguageCode($uid)]) ?? [];
+ }
+
+ /**
+ * Get a list of all languages that are used by the users
+ *
+ * @return array
+ */
+ public static function getLanguages(): array
+ {
+ $cachekey = 'user:getLanguages';
+ $languages = DI::cache()->get($cachekey);
+ if (!is_null($languages)) {
+ return $languages;
+ }
+
+ $supported = array_keys(DI::l10n()->getLanguageCodes());
+ $languages = [];
+ $uids = [];
+
+ $condition = ["`verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired` AND `uid` > ?", 0];
+
+ $abandon_days = intval(DI::config()->get('system', 'account_abandon_days'));
+ if (!empty($abandon_days)) {
+ $condition = DBA::mergeConditions($condition, ["`last-activity` > ?", DateTimeFormat::utc('now - ' . $abandon_days . ' days')]);
+ }
+
+ $users = DBA::select('user', ['uid', 'language'], $condition);
+ while ($user = DBA::fetch($users)) {
+ $uids[] = $user['uid'];
+ $code = DI::l10n()->toISO6391($user['language']);
+ if (!in_array($code, $supported)) {
+ continue;
+ }
+ $languages[$code] = $code;
+ }
+ DBA::close($users);
+
+ $channels = DBA::select('pconfig', ['uid', 'v'], ["`cat` = ? AND `k` = ? AND `v` != ?", 'channel', 'languages', '']);
+ while ($channel = DBA::fetch($channels)) {
+ if (!in_array($channel['uid'], $uids)) {
+ continue;
+ }
+ $values = unserialize($channel['v']);
+ if (!empty($values) && is_array($values)) {
+ foreach ($values as $language) {
+ $language = DI::l10n()->toISO6391($language);
+ $languages[$language] = $language;
+ }
+ }