common: Move locale utils to their own small translation unit

This reduces the size of flatpak-utils and flatpak-dir, which are both
too large.

Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
Simon McVittie committed 2023-11-14 18:39:22 +00:00
1 parent eb858fb8c7
commit 9bf3620aef
9 files changed
+437 -378

No files matched your search

+2
View File
@@ -160,6 +160,8 @@ libflatpak_common_la_SOURCES = \
common/flatpak-json-oci.c \
common/flatpak-json-private.h \
common/flatpak-json.c \
common/flatpak-locale-utils-private.h \
common/flatpak-locale-utils.c \
common/flatpak-metadata-private.h \
common/flatpak-oci-registry-private.h \
common/flatpak-oci-registry.c \
-16
View File
@@ -1053,20 +1053,4 @@ char ** flatpak_dir_list_unused_refs (Fla
GCancellable *cancellable,
GError **error);
const GPtrArray *flatpak_get_system_locales (void);
const GPtrArray *flatpak_get_user_locales (void);
/* Only for regression tests, should not be used directly */
GDBusProxy *flatpak_locale_get_localed_dbus_proxy (void);
void flatpak_get_locale_langs_from_localed_dbus (GDBusProxy *proxy,
GPtrArray *langs);
GDBusProxy *flatpak_locale_get_accounts_dbus_proxy (void);
gboolean flatpak_get_all_langs_from_accounts_dbus (GDBusProxy *proxy,
GPtrArray *langs);
void flatpak_get_locale_langs_from_accounts_dbus (GDBusProxy *proxy,
GPtrArray *langs);
void flatpak_get_locale_langs_from_accounts_dbus_for_user (GDBusProxy *proxy,
GPtrArray *langs,
guint uid);
#endif /* __FLATPAK_DIR_H__ */
+1 -296
View File
@@ -50,6 +50,7 @@
#include "flatpak-appdata-private.h"
#include "flatpak-dir-private.h"
#include "flatpak-error.h"
#include "flatpak-locale-utils-private.h"
#include "flatpak-oci-registry-private.h"
#include "flatpak-ref.h"
#include "flatpak-run-private.h"
@@ -16096,243 +16097,6 @@ flatpak_dir_get_remote_auto_install_authenticator_ref (FlatpakDir *self,
return g_steal_pointer (&ref);
}
GDBusProxy *
flatpak_locale_get_localed_dbus_proxy (void)
{
const char *localed_bus_name = "org.freedesktop.locale1";
const char *localed_object_path = "/org/freedesktop/locale1";
const char *localed_interface_name = localed_bus_name;
return g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
localed_bus_name,
localed_object_path,
localed_interface_name,
NULL,
NULL);
}
void
flatpak_get_locale_langs_from_localed_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
g_autoptr(GVariant) locale_variant = NULL;
g_autofree const gchar **strv = NULL;
gsize i, j;
locale_variant = g_dbus_proxy_get_cached_property (proxy, "Locale");
if (locale_variant == NULL)
return;
strv = g_variant_get_strv (locale_variant, NULL);
for (i = 0; strv[i]; i++)
{
const gchar *locale = NULL;
g_autofree char *lang = NULL;
const char * const *categories = flatpak_get_locale_categories ();
for (j = 0; categories[j]; j++)
{
g_autofree char *prefix = g_strdup_printf ("%s=", categories[j]);
if (g_str_has_prefix (strv[i], prefix))
{
locale = strv[i] + strlen (prefix);
break;
}
}
if (locale == NULL || strcmp (locale, "") == 0)
continue;
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
GDBusProxy *
flatpak_locale_get_accounts_dbus_proxy (void)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_object_path = "/org/freedesktop/Accounts";
const char *accounts_interface_name = accounts_bus_name;
return g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
accounts_object_path,
accounts_interface_name,
NULL,
NULL);
}
gboolean
flatpak_get_all_langs_from_accounts_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
g_auto(GStrv) all_langs = NULL;
int i;
g_autoptr(GVariant) ret = NULL;
g_autoptr(GError) error = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"GetUsersLanguages",
g_variant_new ("()"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (!ret)
{
g_debug ("Failed to get languages for all users: %s", error->message);
return FALSE;
}
g_variant_get (ret,
"(^as)",
&all_langs);
if (all_langs != NULL)
{
for (i = 0; all_langs[i] != NULL; i++)
{
g_autofree char *lang = NULL;
lang = flatpak_get_lang_from_locale (all_langs[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
return TRUE;
}
void
flatpak_get_locale_langs_from_accounts_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_interface_name = "org.freedesktop.Accounts.User";
g_auto(GStrv) object_paths = NULL;
int i;
g_autoptr(GVariant) ret = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"ListCachedUsers",
g_variant_new ("()"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL);
if (ret != NULL)
g_variant_get (ret,
"(^ao)",
&object_paths);
if (object_paths != NULL)
{
for (i = 0; object_paths[i] != NULL; i++)
{
g_autoptr(GDBusProxy) accounts_proxy = NULL;
g_autoptr(GVariant) value = NULL;
accounts_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
object_paths[i],
accounts_interface_name,
NULL,
NULL);
if (accounts_proxy)
{
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Language");
if (value != NULL)
{
const char *locale = g_variant_get_string (value, NULL);
g_autofree char *lang = NULL;
if (strcmp (locale, "") == 0)
continue; /* This user wants the system default locale */
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
}
}
}
void
flatpak_get_locale_langs_from_accounts_dbus_for_user (GDBusProxy *proxy, GPtrArray *langs, guint uid)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_interface_name = "org.freedesktop.Accounts.User";
g_autofree char *object_path = NULL;
g_autoptr(GVariant) ret = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"FindUserById",
g_variant_new ("(x)", uid),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL);
if (ret != NULL)
g_variant_get (ret, "(o)", &object_path);
if (object_path != NULL)
{
g_autoptr(GDBusProxy) accounts_proxy = NULL;
g_autoptr(GVariant) value = NULL;
accounts_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
object_path,
accounts_interface_name,
NULL,
NULL);
if (!accounts_proxy)
return;
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Languages");
if (value != NULL)
{
const char **locales = g_variant_get_strv (value, NULL);
guint i;
for (i = 0; locales != NULL && locales[i] != NULL; i++)
{
g_autofree char *lang = NULL;
lang = flatpak_get_lang_from_locale (locales[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
else
{
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Language");
if (value != NULL)
{
const char *locale = g_variant_get_string (value, NULL);
g_autofree char *lang = NULL;
if (strcmp (locale, "") != 0)
{
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
}
}
}
static int
cmpstringp (const void *p1, const void *p2)
{
@@ -16363,65 +16127,6 @@ flatpak_dir_get_config_strv (FlatpakDir *self, char *key)
return NULL;
}
const GPtrArray *
flatpak_get_system_locales (void)
{
static GPtrArray *cached = NULL;
if (g_once_init_enter (&cached))
{
GPtrArray *langs = g_ptr_array_new_with_free_func (g_free);
g_autoptr(GDBusProxy) accounts_proxy = NULL;
accounts_proxy = flatpak_locale_get_accounts_dbus_proxy ();
if (accounts_proxy == NULL
|| !flatpak_get_all_langs_from_accounts_dbus (accounts_proxy, langs))
{
g_autoptr(GDBusProxy) localed_proxy = NULL;
/* Get the system default locales */
localed_proxy = flatpak_locale_get_localed_dbus_proxy ();
if (localed_proxy != NULL)
flatpak_get_locale_langs_from_localed_dbus (localed_proxy, langs);
/* Now add the user account locales from AccountsService. If accounts_proxy is
* not NULL, it means that AccountsService exists */
if (accounts_proxy != NULL)
flatpak_get_locale_langs_from_accounts_dbus (accounts_proxy, langs);
}
g_ptr_array_add (langs, NULL);
g_once_init_leave (&cached, langs);
}
return (const GPtrArray *)cached;
}
const GPtrArray *
flatpak_get_user_locales (void)
{
static GPtrArray *cached = NULL;
if (g_once_init_enter (&cached))
{
GPtrArray *langs = g_ptr_array_new_with_free_func (g_free);
g_autoptr(GDBusProxy) accounts_proxy = NULL;
accounts_proxy = flatpak_locale_get_accounts_dbus_proxy ();
if (accounts_proxy != NULL)
flatpak_get_locale_langs_from_accounts_dbus_for_user (accounts_proxy, langs, getuid ());
g_ptr_array_add (langs, NULL);
g_once_init_leave (&cached, langs);
}
return (const GPtrArray *)cached;
}
char **
flatpak_dir_get_default_locales (FlatpakDir *self)
{
+44
View File
@@ -0,0 +1,44 @@
/*
* Copyright © 2014 Red Hat, Inc
* Copyright © 2023 Collabora Ltd.
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Alexander Larsson <alexl@redhat.com>
*/
#pragma once
#include <gio/gio.h>
const char * const *flatpak_get_locale_categories (void);
char *flatpak_get_lang_from_locale (const char *locale);
char **flatpak_get_current_locale_langs (void);
const GPtrArray *flatpak_get_system_locales (void);
const GPtrArray *flatpak_get_user_locales (void);
/* Only for regression tests, should not be used directly */
GDBusProxy *flatpak_locale_get_localed_dbus_proxy (void);
void flatpak_get_locale_langs_from_localed_dbus (GDBusProxy *proxy,
GPtrArray *langs);
GDBusProxy *flatpak_locale_get_accounts_dbus_proxy (void);
gboolean flatpak_get_all_langs_from_accounts_dbus (GDBusProxy *proxy,
GPtrArray *langs);
void flatpak_get_locale_langs_from_accounts_dbus (GDBusProxy *proxy,
GPtrArray *langs);
void flatpak_get_locale_langs_from_accounts_dbus_for_user (GDBusProxy *proxy,
GPtrArray *langs,
guint uid);
+388
View File
@@ -0,0 +1,388 @@
/* vi:set et sw=2 sts=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e-s:
* Copyright © 2014-2019 Red Hat, Inc
* Copyright © 2017 Endless Mobile, Inc.
* Copyright © 2023 Collabora Ltd.
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Alexander Larsson <alexl@redhat.com>
* Philip Withnall <withnall@endlessm.com>
* Matthew Leeds <matthew.leeds@endlessm.com>
*/
#include "config.h"
#include "flatpak-locale-utils-private.h"
#include <glib.h>
#include "libglnx.h"
#include "flatpak-utils-private.h"
const char * const *
flatpak_get_locale_categories (void)
{
/* See locale(7) for these categories */
static const char * const categories[] = {
"LANG", "LC_ALL", "LC_MESSAGES", "LC_ADDRESS", "LC_COLLATE", "LC_CTYPE",
"LC_IDENTIFICATION", "LC_MONETARY", "LC_MEASUREMENT", "LC_NAME", "LC_NUMERIC",
"LC_PAPER", "LC_TELEPHONE", "LC_TIME",
NULL
};
return categories;
}
char *
flatpak_get_lang_from_locale (const char *locale)
{
g_autofree char *lang = g_strdup (locale);
char *c;
c = strchr (lang, '@');
if (c != NULL)
*c = 0;
c = strchr (lang, '_');
if (c != NULL)
*c = 0;
c = strchr (lang, '.');
if (c != NULL)
*c = 0;
if (strcmp (lang, "C") == 0)
return NULL;
return g_steal_pointer (&lang);
}
char **
flatpak_get_current_locale_langs (void)
{
const char * const *categories = flatpak_get_locale_categories ();
GPtrArray *langs = g_ptr_array_new ();
int i;
for (; categories != NULL && *categories != NULL; categories++)
{
const gchar * const *locales = g_get_language_names_with_category (*categories);
for (i = 0; locales[i] != NULL; i++)
{
g_autofree char *lang = flatpak_get_lang_from_locale (locales[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
g_ptr_array_sort (langs, flatpak_strcmp0_ptr);
g_ptr_array_add (langs, NULL);
return (char **) g_ptr_array_free (langs, FALSE);
}
GDBusProxy *
flatpak_locale_get_localed_dbus_proxy (void)
{
const char *localed_bus_name = "org.freedesktop.locale1";
const char *localed_object_path = "/org/freedesktop/locale1";
const char *localed_interface_name = localed_bus_name;
return g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
localed_bus_name,
localed_object_path,
localed_interface_name,
NULL,
NULL);
}
void
flatpak_get_locale_langs_from_localed_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
g_autoptr(GVariant) locale_variant = NULL;
g_autofree const gchar **strv = NULL;
gsize i, j;
locale_variant = g_dbus_proxy_get_cached_property (proxy, "Locale");
if (locale_variant == NULL)
return;
strv = g_variant_get_strv (locale_variant, NULL);
for (i = 0; strv[i]; i++)
{
const gchar *locale = NULL;
g_autofree char *lang = NULL;
const char * const *categories = flatpak_get_locale_categories ();
for (j = 0; categories[j]; j++)
{
g_autofree char *prefix = g_strdup_printf ("%s=", categories[j]);
if (g_str_has_prefix (strv[i], prefix))
{
locale = strv[i] + strlen (prefix);
break;
}
}
if (locale == NULL || strcmp (locale, "") == 0)
continue;
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
GDBusProxy *
flatpak_locale_get_accounts_dbus_proxy (void)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_object_path = "/org/freedesktop/Accounts";
const char *accounts_interface_name = accounts_bus_name;
return g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
accounts_object_path,
accounts_interface_name,
NULL,
NULL);
}
gboolean
flatpak_get_all_langs_from_accounts_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
g_auto(GStrv) all_langs = NULL;
int i;
g_autoptr(GVariant) ret = NULL;
g_autoptr(GError) error = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"GetUsersLanguages",
g_variant_new ("()"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (!ret)
{
g_debug ("Failed to get languages for all users: %s", error->message);
return FALSE;
}
g_variant_get (ret,
"(^as)",
&all_langs);
if (all_langs != NULL)
{
for (i = 0; all_langs[i] != NULL; i++)
{
g_autofree char *lang = NULL;
lang = flatpak_get_lang_from_locale (all_langs[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
return TRUE;
}
void
flatpak_get_locale_langs_from_accounts_dbus (GDBusProxy *proxy, GPtrArray *langs)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_interface_name = "org.freedesktop.Accounts.User";
g_auto(GStrv) object_paths = NULL;
int i;
g_autoptr(GVariant) ret = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"ListCachedUsers",
g_variant_new ("()"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL);
if (ret != NULL)
g_variant_get (ret,
"(^ao)",
&object_paths);
if (object_paths != NULL)
{
for (i = 0; object_paths[i] != NULL; i++)
{
g_autoptr(GDBusProxy) accounts_proxy = NULL;
g_autoptr(GVariant) value = NULL;
accounts_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
object_paths[i],
accounts_interface_name,
NULL,
NULL);
if (accounts_proxy)
{
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Language");
if (value != NULL)
{
const char *locale = g_variant_get_string (value, NULL);
g_autofree char *lang = NULL;
if (strcmp (locale, "") == 0)
continue; /* This user wants the system default locale */
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
}
}
}
void
flatpak_get_locale_langs_from_accounts_dbus_for_user (GDBusProxy *proxy, GPtrArray *langs, guint uid)
{
const char *accounts_bus_name = "org.freedesktop.Accounts";
const char *accounts_interface_name = "org.freedesktop.Accounts.User";
g_autofree char *object_path = NULL;
g_autoptr(GVariant) ret = NULL;
ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
"FindUserById",
g_variant_new ("(x)", uid),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
NULL);
if (ret != NULL)
g_variant_get (ret, "(o)", &object_path);
if (object_path != NULL)
{
g_autoptr(GDBusProxy) accounts_proxy = NULL;
g_autoptr(GVariant) value = NULL;
accounts_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
accounts_bus_name,
object_path,
accounts_interface_name,
NULL,
NULL);
if (!accounts_proxy)
return;
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Languages");
if (value != NULL)
{
const char **locales = g_variant_get_strv (value, NULL);
guint i;
for (i = 0; locales != NULL && locales[i] != NULL; i++)
{
g_autofree char *lang = NULL;
lang = flatpak_get_lang_from_locale (locales[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
else
{
value = g_dbus_proxy_get_cached_property (accounts_proxy, "Language");
if (value != NULL)
{
const char *locale = g_variant_get_string (value, NULL);
g_autofree char *lang = NULL;
if (strcmp (locale, "") != 0)
{
lang = flatpak_get_lang_from_locale (locale);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
}
}
}
const GPtrArray *
flatpak_get_system_locales (void)
{
static GPtrArray *cached = NULL;
if (g_once_init_enter (&cached))
{
GPtrArray *langs = g_ptr_array_new_with_free_func (g_free);
g_autoptr(GDBusProxy) accounts_proxy = NULL;
accounts_proxy = flatpak_locale_get_accounts_dbus_proxy ();
if (accounts_proxy == NULL
|| !flatpak_get_all_langs_from_accounts_dbus (accounts_proxy, langs))
{
g_autoptr(GDBusProxy) localed_proxy = NULL;
/* Get the system default locales */
localed_proxy = flatpak_locale_get_localed_dbus_proxy ();
if (localed_proxy != NULL)
flatpak_get_locale_langs_from_localed_dbus (localed_proxy, langs);
/* Now add the user account locales from AccountsService. If accounts_proxy is
* not NULL, it means that AccountsService exists */
if (accounts_proxy != NULL)
flatpak_get_locale_langs_from_accounts_dbus (accounts_proxy, langs);
}
g_ptr_array_add (langs, NULL);
g_once_init_leave (&cached, langs);
}
return (const GPtrArray *)cached;
}
const GPtrArray *
flatpak_get_user_locales (void)
{
static GPtrArray *cached = NULL;
if (g_once_init_enter (&cached))
{
GPtrArray *langs = g_ptr_array_new_with_free_func (g_free);
g_autoptr(GDBusProxy) accounts_proxy = NULL;
accounts_proxy = flatpak_locale_get_accounts_dbus_proxy ();
if (accounts_proxy != NULL)
flatpak_get_locale_langs_from_accounts_dbus_for_user (accounts_proxy, langs, getuid ());
g_ptr_array_add (langs, NULL);
g_once_init_leave (&cached, langs);
}
return (const GPtrArray *)cached;
}
-4
View File
@@ -107,10 +107,6 @@ char **flatpak_strv_merge (char **strv1,
char **flatpak_subpaths_merge (char **subpaths1,
char **subpaths2);
const char * const *flatpak_get_locale_categories (void);
char *flatpak_get_lang_from_locale (const char *locale);
char **flatpak_get_current_locale_langs (void);
GBytes * flatpak_read_stream (GInputStream * in,
gboolean null_terminate,
GError **error);
-61
View File
@@ -7401,42 +7401,6 @@ flatpak_subpaths_merge (char **subpaths1,
return res;
}
const char * const *
flatpak_get_locale_categories (void)
{
/* See locale(7) for these categories */
static const char * const categories[] = {
"LANG", "LC_ALL", "LC_MESSAGES", "LC_ADDRESS", "LC_COLLATE", "LC_CTYPE",
"LC_IDENTIFICATION", "LC_MONETARY", "LC_MEASUREMENT", "LC_NAME", "LC_NUMERIC",
"LC_PAPER", "LC_TELEPHONE", "LC_TIME",
NULL
};
return categories;
}
char *
flatpak_get_lang_from_locale (const char *locale)
{
g_autofree char *lang = g_strdup (locale);
char *c;
c = strchr (lang, '@');
if (c != NULL)
*c = 0;
c = strchr (lang, '_');
if (c != NULL)
*c = 0;
c = strchr (lang, '.');
if (c != NULL)
*c = 0;
if (strcmp (lang, "C") == 0)
return NULL;
return g_steal_pointer (&lang);
}
gboolean
flatpak_g_ptr_array_contains_string (GPtrArray *array, const char *str)
{
@@ -7450,31 +7414,6 @@ flatpak_g_ptr_array_contains_string (GPtrArray *array, const char *str)
return FALSE;
}
char **
flatpak_get_current_locale_langs (void)
{
const char * const *categories = flatpak_get_locale_categories ();
GPtrArray *langs = g_ptr_array_new ();
int i;
for (; categories != NULL && *categories != NULL; categories++)
{
const gchar * const *locales = g_get_language_names_with_category (*categories);
for (i = 0; locales[i] != NULL; i++)
{
g_autofree char *lang = flatpak_get_lang_from_locale (locales[i]);
if (lang != NULL && !flatpak_g_ptr_array_contains_string (langs, lang))
g_ptr_array_add (langs, g_steal_pointer (&lang));
}
}
g_ptr_array_sort (langs, flatpak_strcmp0_ptr);
g_ptr_array_add (langs, NULL);
return (char **) g_ptr_array_free (langs, FALSE);
}
void
flatpak_log_dir_access (FlatpakDir *dir)
{
+1
View File
@@ -176,6 +176,7 @@ sources = [
'flatpak-instance.c',
'flatpak-json-oci.c',
'flatpak-json.c',
'flatpak-locale-utils.c',
'flatpak-oci-registry.c',
'flatpak-portal-error.c',
'flatpak-progress.c',
+1 -1
View File
@@ -9,7 +9,7 @@
#include "libglnx.h"
#include "flatpak.h"
#include "flatpak-utils-private.h"
#include "flatpak-locale-utils-private.h"
#include "tests/testlib.h"