Compare commits

..

No commits in common. "main" and "0.10.5" have entirely different histories.
main ... 0.10.5

51 changed files with 3481 additions and 3463 deletions

View file

@ -7,7 +7,7 @@ cache:
- _ccache/
variables:
DEBIAN_IMAGE: "registry.freedesktop.org/pwithnall/malcontent/debian-unstable:v4"
DEBIAN_IMAGE: "registry.freedesktop.org/pwithnall/malcontent/debian-unstable:v1"
MESON_TEST_TIMEOUT_MULTIPLIER: 2
G_MESSAGES_DEBUG: all
MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload"

View file

@ -1,20 +1,17 @@
FROM debian:unstable
RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \
desktop-file-utils \
gettext \
git \
gtk-doc-tools \
lcov \
libadwaita-1-dev \
libaccountsservice-dev \
libappstream-dev \
libdbus-1-dev \
libappstream-glib-dev \
libflatpak-dev \
libgirepository1.0-dev \
libglib2.0-dev \
libglib-testing-0-dev \
libgtk-4-dev \
libgtk-3-dev \
libpam0g-dev \
libpolkit-gobject-1-dev \
libxml2-utils \
@ -30,7 +27,7 @@ RUN locale-gen C.UTF-8 && /usr/sbin/update-locale LANG=C.UTF-8
ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8
RUN pip3 install meson==0.59.4
RUN pip3 install meson==0.54.3
ARG HOST_USER_ID=5555
ENV HOST_USER_ID ${HOST_USER_ID}

36
NEWS
View file

@ -1,39 +1,3 @@
Overview of changes in malcontent 0.11.1
========================================
* Bugs fixed:
- !147 0.11.0
- !148 build: Switch to Mesons gnome.post_install function
- !149 po: add Georgian translation
- !150 Update Hungarian translation
- !151 Update Hindi (hi) translation
- !152 doc: Add Turkish Translation
* Translation updates:
- Georgian (NorwayFun)
- Hindi (Hemish)
- Hungarian (Balázs Úr)
- Turkish (Sabri Unal)
Overview of changes in malcontent 0.11.0
========================================
* libmalcontent-ui, and the malcontent-control application, now use
libappstream rather than appstream-glib. (#51)
* libmalcontent-ui, and the malcontent-control application, now use GTK 4 and
libadwaita rather than GTK+ 3. (!141)
* As a result of these changes, the pkg-config name has been bumped to
libmalcontent-ui-1, and the gobject-introspection name to MalcontentUi-1.
* Improve keyboard navigation of the malcontent-control application. (#52)
* Translation updates:
- Italian
- Russian
Overview of changes in malcontent 0.10.5
========================================

View file

@ -115,15 +115,14 @@ Dependencies
------------
* accounts-service
* appstream
* appstream-glib
* dbus-daemon
* flatpak
* gio-2.0 ≥ 2.60
* gio-unix-2.0 ≥ 2.60
* glib-2.0 ≥ 2.60
* gobject-2.0 ≥ 2.60
* gtk4
* libadwaita
* gtk+-3.0
* polkit-gobject-1
Licensing

View file

@ -0,0 +1,18 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import subprocess
install_prefix = os.environ['MESON_INSTALL_PREFIX']
if not os.environ.get('DESTDIR'):
icon_cache_dir = os.path.join(install_prefix, 'share', 'icons', 'hicolor')
if os.path.exists(icon_cache_dir):
print('Updating icon cache…')
subprocess.call(['gtk-update-icon-cache', '-qtf', icon_cache_dir])
desktop_database_dir = os.path.join(install_prefix, 'share', 'applications')
if os.path.exists(desktop_database_dir):
print('Updating desktop database…')
subprocess.call(['update-desktop-database', '-q', desktop_database_dir])

View file

@ -2,12 +2,9 @@
da
de
es
hu
id
it
pl
pt_BR
ru
sv
tr
uk

View file

@ -1,441 +0,0 @@
# Hungarian translation for malcontent.
# Copyright (C) 2022 Free Software Foundation, Inc.
# This file is distributed under the same license as the malcontent package.
#
# Balázs Úr <ur.balazs at fsf dot hu>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: malcontent main\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2022-09-21 15:25+0000\n"
"PO-Revision-Date: 2022-09-22 23:43+0200\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 19.12.3\n"
#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
msgctxt "_"
msgid "translator-credits"
msgstr "Úr Balázs <ur dot balazs at fsf dot hu>, 2022."
#. (itstool) path: info/desc
#: C/creating-a-child-user.page:6
msgid "Creating a child user on the computer."
msgstr "Gyermekfelhasználó létrehozása a számítógépen."
#. (itstool) path: page/title
#: C/creating-a-child-user.page:9
msgid "Creating a Child User"
msgstr "Gyermekfelhasználó létrehozása"
#. (itstool) path: page/p
#: C/creating-a-child-user.page:11
msgid ""
"Parental controls can only be applied to non-administrator accounts. Such an "
"account may have been created when the computer was initially set up. If "
"not, a new child user may be created from the <app>Parental Controls</app> "
"application if no child users already exist; and otherwise may be created "
"from the <app>Control Center</app>."
msgstr ""
"A szülői felügyelet csak a nem rendszergazdai fiókokra alkalmazható. Ilyen "
"fiókot esetleg a számítógép kezdeti beállításakor hozhattak létre. Ha nem, "
"akkor új gyermekfelhasználó hozható létre a <app>Szülői felügyelet</app> "
"alkalmazásból, ha még nem létezik gyermekfelhasználó, egyébként pedig a "
"<app>Vezérlőközpont</app> alkalmazásból hozható létre."
#. (itstool) path: page/p
#: C/creating-a-child-user.page:17
msgid ""
"To create a new child user, see <link type=\"guide\" xref=\"help:gnome-help/"
"user-add\">Add a new user account</link>. As soon as the new user is "
"created, it will appear in the <app>Parental Controls</app> window so that "
"its parental controls settings can be configured."
msgstr ""
"Új gyermekfelhasználó létrehozásához nézze meg az <link type=\"guide\" xref="
"\"help:gnome-help/user-add\">Új felhasználói fiók hozzáadása</link> "
"fejezetet. Amint az új felhasználó létrejött, megjelenik a <app>Szülői "
"felügyelet</app> ablakban, így a szülői felügyeleti beállításai "
"konfigurálhatók."
#. (itstool) path: credit/name
#: C/index.page:6
msgid "Philip Withnall"
msgstr "Philip Withnall"
#. (itstool) path: credit/years
#: C/index.page:8
msgid "2020"
msgstr "2020"
#. (itstool) path: page/title
#: C/index.page:12
msgid "Parental Controls Help"
msgstr "Szülői felügyelet súgó"
#. (itstool) path: section/title
#: C/index.page:15
msgid "Introduction &amp; Setup"
msgstr "Bevezetés és beállítás"
#. (itstool) path: section/title
#: C/index.page:19
msgid "Controls to Apply"
msgstr "Alkalmazandó szabályozások"
#. (itstool) path: info/desc
#: C/internet.page:6
msgid "Restricting a child users access to the internet."
msgstr "Egy gyermekfelhasználó internet-hozzáférésének korlátozása."
#. (itstool) path: page/title
#: C/internet.page:9
msgid "Restricting Access to the Internet"
msgstr "Internet-hozzáférés korlátozása"
#. (itstool) path: page/p
#: C/internet.page:11
msgid ""
"You can restrict a users access to the internet. This will prevent them "
"using a web browser, but it will not prevent them using the internet (in "
"potentially more limited forms) through other applications. For example, it "
"will not prevent access to e-mail accounts using <app>Evolution</app>, and "
"it will not prevent software updates being downloaded and applied."
msgstr ""
"Korlátozhatja egy felhasználó internet-hozzáférését. Ez megakadályozza őt a "
"webböngésző használatában, de nem akadályozza meg abban, hogy az internetet "
"(esetleg korlátozottabb formában) más alkalmazásokon keresztül használja. "
"Például nem akadályozza meg az e-mail fiókokhoz való hozzáférést az "
"<app>Evolution</app> használatával, és nem akadályozza meg a "
"szoftverfrissítések letöltését és alkalmazását."
#. (itstool) path: page/p
#: C/internet.page:17
msgid "To restrict a users access to the internet:"
msgstr "Egy felhasználó internet-hozzáférésének korlátozásához:"
#. (itstool) path: item/p
#: C/internet.page:19 C/restricting-applications.page:20
#: C/software-installation.page:28 C/software-installation.page:54
msgid "Open the <app>Parental Controls</app> application."
msgstr "Nyissa meg a <app>Szülői felügyelet</app> alkalmazást."
#. (itstool) path: item/p
#: C/internet.page:20 C/restricting-applications.page:21
#: C/software-installation.page:29 C/software-installation.page:55
msgid "Select the user in the tabs at the top."
msgstr "Válassza ki a felhasználót a fenti lapokon."
#. (itstool) path: item/p
#: C/internet.page:21
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Web Browsers</gui> checkbox."
msgstr ""
"Jelölje be a <gui style=\"checkbox\">Webböngészők korlátozása</gui> "
"jelölőnégyzetet."
#. (itstool) path: info/desc
#: C/introduction.page:6
msgid ""
"Overview of parental controls, the <app>Parental Controls</app> application "
"and its use in other situations where access restrictions are needed on a "
"user."
msgstr ""
"A szülői felügyelet áttekintése, a <app>Szülői felügyelet</app> alkalmazás "
"és annak használata olyan egyéb helyzetekben, amikor egy felhasználó "
"hozzáférésének korlátozásai szükségesek."
#. (itstool) path: page/title
#: C/introduction.page:12
msgid "Introduction to Parental Controls"
msgstr "Bevezetés a szülői felügyeletbe"
#. (itstool) path: page/p
#: C/introduction.page:14
msgid ""
"Parental controls are a way to restrict what non-administrator accounts can "
"do on the computer, with the aim of allowing parents to restrict what their "
"children can do when using the computer unsupervised or under limited "
"supervision."
msgstr ""
"A szülői felügyelet segítségével korlátozható, hogy a nem rendszergazdai "
"fiókok mit tehetnek a számítógépen, azzal a céllal, hogy a szülők "
"korlátozhassák, hogy mit tehetnek a gyermekeik, amikor felügyelet nélkül "
"vagy korlátozott felügyelet mellett használják a számítógépet."
#. (itstool) path: page/p
#: C/introduction.page:18
msgid ""
"This functionality can be used in other situations ­ such as other carer/"
"caree relationships but is labelled as parental controls so that its "
"easy to find, as thats what most people will be looking for."
msgstr ""
"Ez a funkció más helyzetekben is használható például egyéb gondozó-"
"gondozott kapcsolatokban , de „szülői felügyelet” címkével van ellátva, "
"hogy könnyen megtalálható legyen, mivel a legtöbb ember ezt keresi."
#. (itstool) path: page/p
#: C/introduction.page:21
msgid ""
"The parental controls for any user can be queried and set using the "
"<app>Parental Controls</app> application. This lists the non-administrator "
"accounts in tabs along its top bar, and shows their current parental "
"controls settings below. Changes to the parental controls apply immediately."
msgstr ""
"A szülői felügyelet bármely felhasználóhoz lekérdezhető és beállítható a "
"<app>Szülői felügyelet</app> alkalmazás használatával. Ez a felső sávjában "
"lévő lapokon felsorolja a nem rendszergazdai fiókokat, és alatta megjeleníti "
"az aktuális szülői felügyeleti beállításokat. A szülői felügyelet "
"változtatásai azonnal érvénybe lépnek."
#. (itstool) path: page/p
#: C/introduction.page:25
msgid ""
"Restrictions on using the computer can only be applied to non-administrator "
"accounts. The parental controls settings for a user can only be changed by "
"an administrator, although the administrator can do so from the users "
"account by entering their password when prompted by the <app>Parental "
"Controls</app> application."
msgstr ""
"A számítógép használatára vonatkozó korlátozások csak a nem rendszergazdai "
"fiókokra alkalmazhatók. Egy felhasználó szülői felügyeleti beállításait csak "
"egy rendszergazda változtathatja meg, bár a rendszergazda ezt a felhasználó "
"fiókjából is megteheti a jelszavának megadásával, amikor a <app>Szülői "
"felügyelet</app> alkalmazás erre kéri."
#. (itstool) path: p/link
#: C/legal.xml:4
msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
msgstr "Creative Commons Nevezd meg! - Így add tovább! 3.0 átíratlan licenc"
#. (itstool) path: license/p
#: C/legal.xml:3
msgid "This work is licensed under a <_:link-1/>."
msgstr "Ez a mű a <_:link-1/> szerint licencelt."
#. (itstool) path: info/desc
#: C/restricting-applications.page:6
msgid "Restricting a child user from running already-installed applications."
msgstr ""
"Egy gyermekfelhasználó korlátozása a már telepített alkalmazások "
"futtatásában."
#. (itstool) path: page/title
#: C/restricting-applications.page:9
msgid "Restricting Access to Installed Applications"
msgstr "A telepített alkalmazásokhoz való hozzáférés korlátozása"
#. (itstool) path: page/p
#: C/restricting-applications.page:11
msgid ""
"You can prevent a user from running specific applications which are already "
"installed on the computer. This could be useful if other users need those "
"applications but they are not appropriate for a child."
msgstr ""
"Megakadályozhatja, hogy egy felhasználó a számítógépre már telepített "
"bizonyos alkalmazásokat futtasson. Ez akkor lehet hasznos, ha más "
"felhasználóknak szükségük van ezekre az alkalmazásokra, de egy gyermek "
"számára nem megfelelőek."
#. (itstool) path: page/p
#: C/restricting-applications.page:14
msgid ""
"When installing additional software, you should consider whether that needs "
"to be restricted for some users — newly installed software is usable by all "
"users by default."
msgstr ""
"További szoftverek telepítésekor meg kell fontolnia, hogy nem kell-e "
"korlátozni azokat egyes felhasználók számára, ugyanis az újonnan telepített "
"szoftverek alapértelmezetten minden felhasználó számára használhatóak."
#. (itstool) path: page/p
#: C/restricting-applications.page:18
msgid "To restrict a users access to a specific application:"
msgstr ""
"Egy felhasználó adott alkalmazáshoz való hozzáférésének korlátozásához:"
#. (itstool) path: item/p
#: C/restricting-applications.page:22
msgid "Press the <gui style=\"button\">Restrict Applications</gui> button."
msgstr ""
"Nyomja meg az <gui style=\"button\">Alkalmazások korlátozása</gui> gombot."
#. (itstool) path: item/p
#: C/restricting-applications.page:23
msgid ""
"Enable the switch in the row for each application you would like to restrict "
"the user from accessing."
msgstr ""
"Kapcsolja be a kapcsolót minden olyan alkalmazás sorában, amelyhez a "
"felhasználó hozzáférését korlátozni szeretné."
#. (itstool) path: item/p
#: C/restricting-applications.page:24
msgid "Close the <gui>Restrict Applications</gui> window."
msgstr "Zárja be az <gui>Alkalmazások korlátozása</gui> ablakot."
#. (itstool) path: page/p
#: C/restricting-applications.page:27
msgid ""
"Restricting access to specific applications is often used in conjunction "
"with <link xref=\"software-installation\"/> to prevent a user from "
"installing additional software which has not been vetted."
msgstr ""
"Bizonyos alkalmazásokhoz való hozzáférés korlátozását gyakran használják a "
"<link xref=\"software-installation\"/> korlátozással együtt, hogy "
"megakadályozzanak egy felhasználót a további, nem ellenőrzött szoftverek "
"telepítésében."
#. (itstool) path: info/desc
#: C/software-installation.page:6
msgid ""
"Restricting the software a child user can install, or preventing them "
"installing additional software entirely."
msgstr ""
"Egy gyermekfelhasználó által telepíthető szoftverek korlátozása, vagy "
"további szoftverek telepítésének teljes megakadályozása."
#. (itstool) path: page/title
#: C/software-installation.page:9
msgid "Restricting Software Installation"
msgstr "Szoftvertelepítés korlátozása"
#. (itstool) path: page/p
#: C/software-installation.page:11
msgid ""
"You can prevent a user from installing additional software on the system. "
"They will still be able to search for new software to install, but will need "
"an administrator to authorize the installation when they try to install an "
"application. This applies whether they are trying to install the application "
"system-wide (for all users) or just for themselves."
msgstr ""
"Megakadályozhat egy felhasználót abban, hogy további szoftvereket telepítsen "
"a rendszerre. A felhasználó továbbra is kereshet új telepítendő szoftvert, "
"de rendszergazdára lesz szüksége a telepítés felhatalmazásához, amikor "
"megpróbál telepíteni egy alkalmazást. Ez arra is vonatkozik, hogy az "
"alkalmazást rendszerszinten (minden felhasználónak) vagy csak saját magának "
"próbálja telepíteni."
#. (itstool) path: page/p
#: C/software-installation.page:17
msgid ""
"Additionally, you can restrict which software a user can browse or search "
"for in the <app>Software</app> catalog by age categories."
msgstr ""
"Ezenkívül azt is korlátozhatja az életkor kategória alapján, hogy egy "
"felhasználó milyen szoftvereket böngészhet vagy kereshet a <app>Szoftver</"
"app> katalógusában."
#. (itstool) path: page/p
#: C/software-installation.page:20
msgid ""
"To prevent a user from running an application which has already been "
"installed, see <link xref=\"restricting-applications\"/>."
msgstr ""
"Annak megakadályozásához, hogy egy felhasználó egy már telepített "
"alkalmazást futtasson, nézze meg az <link xref=\"restricting-applications\"/"
"> fejezetet."
#. (itstool) path: section/title
#: C/software-installation.page:24
msgid "Preventing Software Installation"
msgstr "Szoftvertelepítés megakadályozása"
#. (itstool) path: section/p
#: C/software-installation.page:26
msgid "To prevent a user from installing additional software:"
msgstr ""
"Annak megakadályozásához, hogy a felhasználó további szoftvereket telepítsen:"
#. (itstool) path: item/p
#: C/software-installation.page:30
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Application Installation</gui> "
"checkbox."
msgstr ""
"Jelölje be az <gui style=\"checkbox\">Alkalmazástelepítés korlátozása</gui> "
"jelölőnégyzetet."
#. (itstool) path: section/title
#: C/software-installation.page:35
msgid "Restricting Software Installation by Age"
msgstr "Szoftvertelepítés korlátozása életkor alapján"
#. (itstool) path: section/p
#: C/software-installation.page:37
msgid ""
"Applications in the <app>Software</app> catalog have information about "
"content they contain which might be inappropriate for some ages — for "
"example, various forms of violence, unmoderated chat with other people on "
"the internet, or the possibility of spending money."
msgstr ""
"A <app>Szoftver</app> katalógusában található alkalmazások információval "
"rendelkeznek az általuk tartalmazott tartalommal kapcsolatban, hogy melyek "
"lehetnek bizonyos korosztályok számára nem megfelelőek például az erőszak "
"különböző formái, moderálatlan csevegés az interneten más emberekkel, vagy a "
"pénzköltés lehetősége."
#. (itstool) path: section/p
#: C/software-installation.page:41
msgid ""
"For each application, this information is summarized as the minimum age "
"child it is typically suitable to be used by — for example, “suitable for "
"ages 7+”. These age ratings are presented in region-specific schemes which "
"can be compared with the ratings schemes used for films and games."
msgstr ""
"Minden egyes alkalmazás esetében ez az információ összefoglalja, hogy az "
"adott alkalmazás jellemzően legalább milyen korú gyermek számára alkalmas "
"például „7 év felettiek számára alkalmas”. Ezek a korhatár-besorolások régió-"
"specifikus sémákban jelennek meg, amelyek összehasonlíthatók a filmek és "
"játékok esetében használt besorolási sémákkal."
#. (itstool) path: section/p
#: C/software-installation.page:45
msgid ""
"The applications shown to a user in the <app>Software</app> catalog can be "
"filtered by their age suitability. Applications which are not suitable for "
"the user will be hidden, and will not be installable by that user. They will "
"be installable by other users (if their age suitability is set high enough)."
msgstr ""
"A <app>Szoftver</app> katalógusában egy felhasználó számára megjelenített "
"alkalmazások szűrhetők az életkori alkalmasságuk alapján. A felhasználó "
"számára nem megfelelő alkalmazások el lesznek rejtve, és nem lesznek "
"telepíthetők az adott felhasználó számára. Más felhasználók számára "
"telepíthetők lesznek (ha az életkori alkalmasságuk elég magasra van állítva)."
#. (itstool) path: section/p
#: C/software-installation.page:51
msgid ""
"To filter the applications seen by a user in the <app>Software</app> catalog "
"to only those suitable for a certain age:"
msgstr ""
"A <app>Szoftver</app> katalógusában egy felhasználó által látott "
"alkalmazások szűréséhez, hogy csak egy bizonyos korosztály számára legyenek "
"alkalmasak:"
#. (itstool) path: item/p
#: C/software-installation.page:56
msgid ""
"In the <gui>Application Suitability</gui> list, select the age which "
"applications should be suitable for."
msgstr ""
"Az <gui>Alkalmazás alkalmassága</gui> listából válassza ki azt az életkort, "
"amelyre az alkalmazásoknak alkalmasnak kell lenniük."
#. (itstool) path: note/p
#: C/software-installation.page:60
msgid ""
"The users actual age is not stored, so the <gui>Application Suitability</"
"gui> is not automatically updated over time as the child grows older. You "
"must periodically re-assess the appropriate <gui>Application Suitability</"
"gui> for each user."
msgstr ""
"A felhasználó tényleges életkora nem kerül tárolásra, így az <gui>Alkalmazás "
"alkalmassága</gui> nem frissül automatikusan az idő múlásával, ahogy a "
"gyermek idősebbé válik. Rendszeresen újra kell értékelnie a megfelelő "
"<gui>Alkalmazás alkalmassága</gui> értéket minden egyes felhasználónál."

View file

@ -447,4 +447,4 @@ msgstr ""
"Poiché l'età dell'utente non viene memorizzata, l' <gui>Idoneità dell'applicazione</"
"gui> non viene aggiornata automaticamente man mano che il minore cresce. Si dovrebbe "
"rivalutare periodicamente il livello appropriato di <gui>Idoneità dell'applicazione</"
"gui> per ciascuno degli account."
"</gui> per ciascuno degli account."

View file

@ -1,435 +0,0 @@
# Russian translation for malcontent.
# Copyright (C) 2022 malcontent's COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
# Sergej A. <sw@atrus.ru>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: malcontent main\n"
"POT-Creation-Date: 2022-06-04 15:25+0000\n"
"PO-Revision-Date: 2022-06-05 11:41+1000\n"
"Last-Translator: Ser82-png <sw@atrus.ru>\n"
"Language-Team: Russian <gnome-cyr@gnome.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.3\n"
#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
msgctxt "_"
msgid "translator-credits"
msgstr "Ser82-png <sw@atrus.ru>, 2022"
#. (itstool) path: info/desc
#: C/creating-a-child-user.page:6
msgid "Creating a child user on the computer."
msgstr "Создание записи пользователя-ребёнка на компьютере."
#. (itstool) path: page/title
#: C/creating-a-child-user.page:9
msgid "Creating a Child User"
msgstr "Создание записи пользователя-ребёнка"
#. (itstool) path: page/p
#: C/creating-a-child-user.page:11
msgid ""
"Parental controls can only be applied to non-administrator accounts. Such an "
"account may have been created when the computer was initially set up. If "
"not, a new child user may be created from the <app>Parental Controls</app> "
"application if no child users already exist; and otherwise may be created "
"from the <app>Control Center</app>."
msgstr ""
"Родительский контроль можно применять только к учётным записям без "
"административных прав. Такая учётная запись могла быть создана при "
"первоначальной настройке системы. Если этого не было сделано, можно создать "
"новую детскую учётную запись с помощью приложения <app>Родительский "
"контроль</app>. Кроме того, такую учётную запись можно создать с помощью "
"<app>Центра управления</app>."
#. (itstool) path: page/p
#: C/creating-a-child-user.page:17
msgid ""
"To create a new child user, see <link type=\"guide\" xref=\"help:gnome-help/"
"user-add\">Add a new user account</link>. As soon as the new user is "
"created, it will appear in the <app>Parental Controls</app> window so that "
"its parental controls settings can be configured."
msgstr ""
"Чтобы создать нового пользователя ребёнка, смотрите <link type=\"guide\" "
"xref=\"help:gnome-help/user-add\">Добавление новой учётной записи "
"пользователя</link>. Как только новый пользователь будет создан, он появится "
"в окне <app>Родительский контроль</app>, чтобы можно было для него настроить "
"параметры родительского контроля."
#. (itstool) path: credit/name
#: C/index.page:6
msgid "Philip Withnall"
msgstr "Philip Withnall"
#. (itstool) path: credit/years
#: C/index.page:8
msgid "2020"
msgstr "2020"
#. (itstool) path: page/title
#: C/index.page:12
msgid "Parental Controls Help"
msgstr "Справка по родительскому контролю"
#. (itstool) path: section/title
#: C/index.page:15
msgid "Introduction &amp; Setup"
msgstr "Введение &amp; Настройка"
#. (itstool) path: section/title
#: C/index.page:19
msgid "Controls to Apply"
msgstr "Средства контроля, которые можно применить"
#. (itstool) path: info/desc
#: C/internet.page:6
msgid "Restricting a child users access to the internet."
msgstr "Ограничение доступа ребёнка к интернету."
#. (itstool) path: page/title
#: C/internet.page:9
msgid "Restricting Access to the Internet"
msgstr "Ограничение доступа к интернету"
#. (itstool) path: page/p
#: C/internet.page:11
msgid ""
"You can restrict a users access to the internet. This will prevent them "
"using a web browser, but it will not prevent them using the internet (in "
"potentially more limited forms) through other applications. For example, it "
"will not prevent access to e-mail accounts using <app>Evolution</app>, and "
"it will not prevent software updates being downloaded and applied."
msgstr ""
"Вы можете ограничить доступ пользователя к интернету. Этим способом можно "
"запретить пользователю использовать веб-браузер, но доступ к сети интернет "
"будет сохранён (в потенциально более ограниченной форме) с помощью других "
"приложений. Например, пользователь будет иметь доступ к учётным записям "
"электронной почты с помощью <app>Evolution</app>, а также не будет "
"ограничений для загрузки и обновления программного обеспечения."
#. (itstool) path: page/p
#: C/internet.page:17
msgid "To restrict a users access to the internet:"
msgstr "Чтобы ограничить доступ пользователя к интернету:"
#. (itstool) path: item/p
#: C/internet.page:19 C/restricting-applications.page:20
#: C/software-installation.page:28 C/software-installation.page:54
msgid "Open the <app>Parental Controls</app> application."
msgstr "Откройте приложение <app>Родительский контроль</app>."
#. (itstool) path: item/p
#: C/internet.page:20 C/restricting-applications.page:21
#: C/software-installation.page:29 C/software-installation.page:55
msgid "Select the user in the tabs at the top."
msgstr "Выберите пользователя во вкладках верхней части окна."
#. (itstool) path: item/p
#: C/internet.page:21
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Web Browsers</gui> checkbox."
msgstr ""
"Установите флажок <gui style=\"checkbox\">Ограничить доступ к Веб-браузерам</"
"gui>."
#. (itstool) path: info/desc
#: C/introduction.page:6
msgid ""
"Overview of parental controls, the <app>Parental Controls</app> application "
"and its use in other situations where access restrictions are needed on a "
"user."
msgstr ""
"Обзор родительского контроля, приложения <app>Родительский контроль</app> и "
"его использования в различных ситуациях, когда необходимо ограничить доступ "
"для пользователя."
#. (itstool) path: page/title
#: C/introduction.page:12
msgid "Introduction to Parental Controls"
msgstr "Введение в родительский контроль"
#. (itstool) path: page/p
#: C/introduction.page:14
msgid ""
"Parental controls are a way to restrict what non-administrator accounts can "
"do on the computer, with the aim of allowing parents to restrict what their "
"children can do when using the computer unsupervised or under limited "
"supervision."
msgstr ""
"Родительский контроль — это способ ограничить перечень возможных действий на "
"компьютере пользователям не имеющим учётных записей администратора. Целью "
"является ограничение родителями действий детей при работе на компьютере, "
"находящихся без присмотра или под ограниченным присмотром."
#. (itstool) path: page/p
#: C/introduction.page:18
msgid ""
"This functionality can be used in other situations ­ such as other carer/"
"caree relationships but is labelled as parental controls so that its "
"easy to find, as thats what most people will be looking for."
msgstr ""
"Эту функцию также можно использовать и в других ситуациях, например, в "
"отношениях «сиделка/пациент», но она помечена как «родительский контроль» "
"только для удобства поиска, поскольку именно это будут искать большинство "
"пользователей."
#. (itstool) path: page/p
#: C/introduction.page:21
msgid ""
"The parental controls for any user can be queried and set using the "
"<app>Parental Controls</app> application. This lists the non-administrator "
"accounts in tabs along its top bar, and shows their current parental "
"controls settings below. Changes to the parental controls apply immediately."
msgstr ""
"Для любого пользователя можно просмотреть и установить родительский контроль "
"с помощью приложения <app>Родительский контроль</app>. В окне программы на "
"вкладках вдоль верхней панели перечислены учётные записи без прав "
"администратора, а ниже показаны их текущие настройки родительского контроля. "
"Изменения в родительском контроле вступают в силу немедленно."
#. (itstool) path: page/p
#: C/introduction.page:25
msgid ""
"Restrictions on using the computer can only be applied to non-administrator "
"accounts. The parental controls settings for a user can only be changed by "
"an administrator, although the administrator can do so from the users "
"account by entering their password when prompted by the <app>Parental "
"Controls</app> application."
msgstr ""
"Ограничения на использование компьютера могут применяться только к учётным "
"записям без прав администратора. Настройки родительского контроля для "
"пользователя может изменить только администратор, хотя он может сделать это "
"из учётной записи пользователя, введя свой пароль при запросе приложения "
"<app>Родительский контроль</app>."
#. (itstool) path: p/link
#: C/legal.xml:4
msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
#. (itstool) path: license/p
#: C/legal.xml:3
msgid "This work is licensed under a <_:link-1/>."
msgstr "Данная работа находится под лицензией <_:link-1/>."
#. (itstool) path: info/desc
#: C/restricting-applications.page:6
msgid "Restricting a child user from running already-installed applications."
msgstr "Запретить ребёнку запускать уже установленные приложения."
#. (itstool) path: page/title
#: C/restricting-applications.page:9
msgid "Restricting Access to Installed Applications"
msgstr "Ограничение доступа к установленным приложениям"
#. (itstool) path: page/p
#: C/restricting-applications.page:11
msgid ""
"You can prevent a user from running specific applications which are already "
"installed on the computer. This could be useful if other users need those "
"applications but they are not appropriate for a child."
msgstr ""
"Вы можете запретить пользователю запускать определённые приложения, уже "
"установленные на компьютере. Это может быть полезно, если эти приложения "
"необходимы другим пользователям, но не подходят для ребёнка."
#. (itstool) path: page/p
#: C/restricting-applications.page:14
msgid ""
"When installing additional software, you should consider whether that needs "
"to be restricted for some users — newly installed software is usable by all "
"users by default."
msgstr ""
"При установке дополнительного программного обеспечения вам следует "
"учитывать, нужно ли ограничивать доступ для некоторых пользователей — новое "
"установленное программное обеспечение по умолчанию может использоваться "
"всеми пользователями."
#. (itstool) path: page/p
#: C/restricting-applications.page:18
msgid "To restrict a users access to a specific application:"
msgstr "Чтобы ограничить доступ пользователя к определенному приложению:"
#. (itstool) path: item/p
#: C/restricting-applications.page:22
msgid "Press the <gui style=\"button\">Restrict Applications</gui> button."
msgstr ""
"Нажмите кнопку <gui style=\"button\">Ограничить доступ к приложениям</gui>."
#. (itstool) path: item/p
#: C/restricting-applications.page:23
msgid ""
"Enable the switch in the row for each application you would like to restrict "
"the user from accessing."
msgstr ""
"Измените положение переключателя в строке для каждого приложения, к которому "
"вы хотите ограничить доступ пользователя."
#. (itstool) path: item/p
#: C/restricting-applications.page:24
msgid "Close the <gui>Restrict Applications</gui> window."
msgstr "Закройте окно <gui>Ограничить доступ к приложениям</gui>."
#. (itstool) path: page/p
#: C/restricting-applications.page:27
msgid ""
"Restricting access to specific applications is often used in conjunction "
"with <link xref=\"software-installation\"/> to prevent a user from "
"installing additional software which has not been vetted."
msgstr ""
"Ограничение доступа к определённым приложениям часто используется в "
"сочетании с <link xref=\"software-installation\"/>, чтобы запретить "
"пользователю устанавливать непроверенное программное обеспечение."
#. (itstool) path: info/desc
#: C/software-installation.page:6
msgid ""
"Restricting the software a child user can install, or preventing them "
"installing additional software entirely."
msgstr ""
"Ограничение перечная программного обеспечения, которое ребёнок может "
"установить, или полный запрет на его установку."
#. (itstool) path: page/title
#: C/software-installation.page:9
msgid "Restricting Software Installation"
msgstr "Ограничения на установку программного обеспечения по возрасту"
#. (itstool) path: page/p
#: C/software-installation.page:11
msgid ""
"You can prevent a user from installing additional software on the system. "
"They will still be able to search for new software to install, but will need "
"an administrator to authorize the installation when they try to install an "
"application. This applies whether they are trying to install the application "
"system-wide (for all users) or just for themselves."
msgstr ""
"Вы можете запретить пользователям устанавливать дополнительное программное "
"обеспечение. Хотя они по-прежнему смогут искать программное обеспечение для "
"установки, но при попытке установить приложение им потребуется разрешение "
"администратора. Это не зависит от того, пытаются ли установить приложение в "
"масштабах всей системы (для всех пользователей) или только для себя."
#. (itstool) path: page/p
#: C/software-installation.page:17
msgid ""
"Additionally, you can restrict which software a user can browse or search "
"for in the <app>Software</app> catalog by age categories."
msgstr ""
"Кроме того, вы можете ограничить по возрастному критерию, какое программное "
"обеспечение пользователь может просматривать или искать в <app>Центре "
"приложений</app>."
#. (itstool) path: page/p
#: C/software-installation.page:20
msgid ""
"To prevent a user from running an application which has already been "
"installed, see <link xref=\"restricting-applications\"/>."
msgstr ""
"Чтобы запретить пользователю запускать уже установленное приложение, "
"смотрите раздел <link xref=\"restricting-applications\"/>."
#. (itstool) path: section/title
#: C/software-installation.page:24
msgid "Preventing Software Installation"
msgstr "Предотвращение установки программного обеспечения"
#. (itstool) path: section/p
#: C/software-installation.page:26
msgid "To prevent a user from installing additional software:"
msgstr ""
"Чтобы запретить пользователю устанавливать дополнительное программное "
"обеспечение:"
#. (itstool) path: item/p
#: C/software-installation.page:30
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Application Installation</gui> "
"checkbox."
msgstr ""
"Установите флажок <gui style=\"checkbox\">Ограничить установку приложений</"
"gui>."
#. (itstool) path: section/title
#: C/software-installation.page:35
msgid "Restricting Software Installation by Age"
msgstr "Ограничения на установку программного обеспечения по возрасту"
#. (itstool) path: section/p
#: C/software-installation.page:37
msgid ""
"Applications in the <app>Software</app> catalog have information about "
"content they contain which might be inappropriate for some ages — for "
"example, various forms of violence, unmoderated chat with other people on "
"the internet, or the possibility of spending money."
msgstr ""
"В описании к приложениям из каталога <app>Центра приложений</app> содержатся "
"сведения, которые могут быть неприемлемыми для определённых возрастных групп "
"— например, различные формы насилия, неограниченные возможности по общению с "
"другими людьми в интернете или возможность расходовать деньги."
#. (itstool) path: section/p
#: C/software-installation.page:41
msgid ""
"For each application, this information is summarized as the minimum age "
"child it is typically suitable to be used by — for example, “suitable for "
"ages 7+”. These age ratings are presented in region-specific schemes which "
"can be compared with the ratings schemes used for films and games."
msgstr ""
"Для каждого приложения в этих сведениях содержится информация о минимальном "
"возрасте ребенка, с которого его можно допустить к использованию данного "
"приложения. Например, «подходит для возраста 7+». Эти возрастные оценки "
"представлены в виде специфических для региона схем, сопоставимых со схемами "
"рейтингов для фильмов и видеоигр."
#. (itstool) path: section/p
#: C/software-installation.page:45
msgid ""
"The applications shown to a user in the <app>Software</app> catalog can be "
"filtered by their age suitability. Applications which are not suitable for "
"the user will be hidden, and will not be installable by that user. They will "
"be installable by other users (if their age suitability is set high enough)."
msgstr ""
"Приложения, показанные в каталоге <app>Центра приложений</app>, могут быть "
"отфильтрованы по возрастным критериям. Приложения, которые не подходят для "
"конкретного пользователя, будут скрыты и не смогут быть установлены. Но для "
"других пользователей они будут доступны (если пользователи будут "
"соответствовать установленным возрастным критериям)."
#. (itstool) path: section/p
#: C/software-installation.page:51
msgid ""
"To filter the applications seen by a user in the <app>Software</app> catalog "
"to only those suitable for a certain age:"
msgstr ""
"Чтобы отфильтровать приложения, представленные пользователю в каталоге "
"<app>Центра приложений</app>, по возрастному критерию:"
#. (itstool) path: item/p
#: C/software-installation.page:56
msgid ""
"In the <gui>Application Suitability</gui> list, select the age which "
"applications should be suitable for."
msgstr ""
"В списке <gui>Пригодность приложений</gui> выберите возраст, для которого "
"должны быть подходящими приложения."
#. (itstool) path: note/p
#: C/software-installation.page:60
msgid ""
"The users actual age is not stored, so the <gui>Application Suitability</"
"gui> is not automatically updated over time as the child grows older. You "
"must periodically re-assess the appropriate <gui>Application Suitability</"
"gui> for each user."
msgstr ""
"Возраст пользователя в системе не сохраняется, поэтому <gui>Пригодность "
"приложений</gui> по мере взросления ребёнка автоматически не обновляется. Вы "
"должны периодически пересматривать соответствующую для каждого пользователя "
"<gui>Пригодность приложений</gui>."

View file

@ -1,427 +0,0 @@
# Turkish translation for malcontent.
# Copyright (C) 2023 malcontent's COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
#
# Sabri Ünal <libreajans@gmail.com>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: malcontent main\n"
"POT-Creation-Date: 2023-03-08 15:25+0000\n"
"PO-Revision-Date: 2023-03-09 03:38+0300\n"
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
"Language-Team: Turkish <tr@li.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.1.1\n"
#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
msgctxt "_"
msgid "translator-credits"
msgstr "Sabri Ünal <libreajans@gmail.com>, 2023."
#. (itstool) path: info/desc
#: C/creating-a-child-user.page:6
msgid "Creating a child user on the computer."
msgstr "Bilgisayarda çocuk kullanıcı oluşturmak."
#. (itstool) path: page/title
#: C/creating-a-child-user.page:9
msgid "Creating a Child User"
msgstr "Çocuk Kullanıcı Oluşturmak"
# Control Center için ayarlar çevirisini kullanıyoruz. Burada eski adı kullanılmış.
#. (itstool) path: page/p
#: C/creating-a-child-user.page:11
msgid ""
"Parental controls can only be applied to non-administrator accounts. Such an "
"account may have been created when the computer was initially set up. If "
"not, a new child user may be created from the <app>Parental Controls</app> "
"application if no child users already exist; and otherwise may be created "
"from the <app>Control Center</app>."
msgstr ""
"Ebeveyn denetimleri yalnızca yönetici olmayan hesaplara uygulanabilir. Bu "
"tip hesap, bilgisayar ilk kurulduğunda oluşturulmuş olabilir. Değilse, hiç "
"çocuk kullanıcı yoksa, <app>Ebeveyn Denetimleri</app> uygulamasından yeni "
"çocuk kullanıcı oluşturulabilir; aksi halde <app>Ayarlar</app>ʼdan "
"oluşturulabilir."
#. (itstool) path: page/p
#: C/creating-a-child-user.page:17
msgid ""
"To create a new child user, see <link type=\"guide\" xref=\"help:gnome-help/"
"user-add\">Add a new user account</link>. As soon as the new user is "
"created, it will appear in the <app>Parental Controls</app> window so that "
"its parental controls settings can be configured."
msgstr ""
"Yeni çocuk kullanıcı oluşturmak için <link type=\"guide\" xref=\"help:gnome-"
"help/user-add\">Yeni kullanıcı hesabı ekle</link>ʼye bakın. Yeni kullanıcı "
"oluşturulunca, ebeveyn denetimleri ayarlarının yapılandırılabilmesi için "
"<app>Ebeveyn Denetimleri</app> penceresi görünecektir."
#. (itstool) path: credit/name
#: C/index.page:6
msgid "Philip Withnall"
msgstr "Philip Withnall"
#. (itstool) path: credit/years
#: C/index.page:8
msgid "2020"
msgstr "2020"
#. (itstool) path: page/title
#: C/index.page:12
msgid "Parental Controls Help"
msgstr "Ebeveyn Denetimleri Yardım"
#. (itstool) path: section/title
#: C/index.page:15
msgid "Introduction &amp; Setup"
msgstr "Giriş ve Kurulum"
#. (itstool) path: section/title
#: C/index.page:19
msgid "Controls to Apply"
msgstr "Uygulanacak Denetimler"
#. (itstool) path: info/desc
#: C/internet.page:6
msgid "Restricting a child users access to the internet."
msgstr "Çocuk kullanıcının internete erişimini kısıtlamak."
#. (itstool) path: page/title
#: C/internet.page:9
msgid "Restricting Access to the Internet"
msgstr "İnternet Erişimini Kısıtlama"
#. (itstool) path: page/p
#: C/internet.page:11
msgid ""
"You can restrict a users access to the internet. This will prevent them "
"using a web browser, but it will not prevent them using the internet (in "
"potentially more limited forms) through other applications. For example, it "
"will not prevent access to e-mail accounts using <app>Evolution</app>, and "
"it will not prevent software updates being downloaded and applied."
msgstr ""
"Kullanıcının internete erişimini kısıtlayabilirsiniz. Bu, web tarayıcısı "
"kullanmalarını engelleyecektir, ancak diğer uygulamalar aracılığıyla "
"(muhtemelen daha sınırlı biçimlerde) interneti kullanmalarını "
"engellemeyecektir. Örneğin, <app>Evolution</app> kullanarak e-posta "
"hesaplarına erişimi engellemez ve yazılım güncellemelerinin indirilip "
"uygulanmasını engellemez."
#. (itstool) path: page/p
#: C/internet.page:17
msgid "To restrict a users access to the internet:"
msgstr "Kullanıcının internet erişimini kısıtlamak için:"
#. (itstool) path: item/p
#: C/internet.page:19 C/restricting-applications.page:20
#: C/software-installation.page:28 C/software-installation.page:54
msgid "Open the <app>Parental Controls</app> application."
msgstr "<app>Ebeveyn Denetimleri</app> uygulamasınıın."
#. (itstool) path: item/p
#: C/internet.page:20 C/restricting-applications.page:21
#: C/software-installation.page:29 C/software-installation.page:55
msgid "Select the user in the tabs at the top."
msgstr "Üstteki sekmelerde kullanıcıyı seçin."
#. (itstool) path: item/p
#: C/internet.page:21
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Web Browsers</gui> checkbox."
msgstr ""
"<gui style=\"checkbox\">Web Tarayıcılarını Kısıtla</gui> onay kutusunu "
"etkinleştirin."
#. (itstool) path: info/desc
#: C/introduction.page:6
msgid ""
"Overview of parental controls, the <app>Parental Controls</app> application "
"and its use in other situations where access restrictions are needed on a "
"user."
msgstr ""
"Ebeveyn denetimlerine, <app>Ebeveyn Denetimleri</app> uygulamasına ve "
"kullanıcı için erişim kısıtlamalarının gereksinildiği diğer durumlarda "
"kullanımına genel bakış."
#. (itstool) path: page/title
#: C/introduction.page:12
msgid "Introduction to Parental Controls"
msgstr "Ebeveyn Denetimleriʼne Giriş"
#. (itstool) path: page/p
#: C/introduction.page:14
msgid ""
"Parental controls are a way to restrict what non-administrator accounts can "
"do on the computer, with the aim of allowing parents to restrict what their "
"children can do when using the computer unsupervised or under limited "
"supervision."
msgstr ""
"Ebeveyn denetimleri, bilgisayarda yönetici hesabı olmayan hesapların ne "
"yapabileceğini sınırlamanın bir yoludur. Amacı, ebeveynlerin çocukları "
"bilgisayarı gözetimsiz veya sınırlı gözetim altında kullandıklarında ne "
"yapabileceklerini sınırlamalarını sağlamaktır."
#. (itstool) path: page/p
#: C/introduction.page:18
msgid ""
"This functionality can be used in other situations ­ such as other carer/"
"caree relationships but is labelled as parental controls so that its "
"easy to find, as thats what most people will be looking for."
msgstr ""
"Bu işlevsellik diğer bakıcı/bakılan ilişkileri gibi diğer durumlarda da "
"kullanılabilir, ancak çoğu insanın ebeveyn denetimleri olarak arayacağı "
"varsayılarak, bulması kolay olsun diye bu şekilde adlandırılmıştır."
#. (itstool) path: page/p
#: C/introduction.page:21
msgid ""
"The parental controls for any user can be queried and set using the "
"<app>Parental Controls</app> application. This lists the non-administrator "
"accounts in tabs along its top bar, and shows their current parental "
"controls settings below. Changes to the parental controls apply immediately."
msgstr ""
"Herhangi bir kullanıcı için ebeveyn denetimleri, <app>Ebeveyn Denetimleri</"
"app> uygulaması kullanılarak sorgulanabilir ve ayarlanabilir. Bu, yönetici "
"olmayan hesapları üst çubuğundaki sekmelerde listeler ve altında geçerli "
"ebeveyn denetimleri ayarlarını gösterir. Ebeveyn denetimlerinde yapılan "
"değişiklikler hemen uygulanır."
#. (itstool) path: page/p
#: C/introduction.page:25
msgid ""
"Restrictions on using the computer can only be applied to non-administrator "
"accounts. The parental controls settings for a user can only be changed by "
"an administrator, although the administrator can do so from the users "
"account by entering their password when prompted by the <app>Parental "
"Controls</app> application."
msgstr ""
"Bilgisayar kullanımıyla ilgili kısıtlamalar yalnızca yönetici olmayan "
"hesaplara uygulanabilir. Bir kullanıcının ebeveyn denetimleri ayarları "
"yalnızca bir yönetici tarafından değiştirilebilir, ancak yönetici "
"<app>Ebeveyn Denetimleri</app> uygulaması tarafından istendiğinde parolasını "
"girerek kullanıcının hesabından bunu yapabilir."
#. (itstool) path: p/link
#: C/legal.xml:4
msgid "Creative Commons Attribution-ShareAlike 3.0 Unported License"
msgstr "Creative Commons Attribution-ShareAlike 3.0 Unported License"
#. (itstool) path: license/p
#: C/legal.xml:3
msgid "This work is licensed under a <_:link-1/>."
msgstr "Bu çalışma <_:link-1/> altında lisanslanmıştır."
#. (itstool) path: info/desc
#: C/restricting-applications.page:6
msgid "Restricting a child user from running already-installed applications."
msgstr ""
"Çocuk kullanıcının zaten kurulmuş uygulamaları çalıştırmasını kısıtlama."
#. (itstool) path: page/title
#: C/restricting-applications.page:9
msgid "Restricting Access to Installed Applications"
msgstr "Kurulu Uygulamalara Erişimi Kısıtlama"
#. (itstool) path: page/p
#: C/restricting-applications.page:11
msgid ""
"You can prevent a user from running specific applications which are already "
"installed on the computer. This could be useful if other users need those "
"applications but they are not appropriate for a child."
msgstr ""
"Kullanıcının zaten bilgisayarda kurulu olan belirli uygulamaları "
"çalıştırmasını engelleyebilirsiniz. Bu, diğer kullanıcıların bu uygulamalara "
"ihtiyacı varsa ancak çocuk için uygun değilse faydalı olabilir."
#. (itstool) path: page/p
#: C/restricting-applications.page:14
msgid ""
"When installing additional software, you should consider whether that needs "
"to be restricted for some users — newly installed software is usable by all "
"users by default."
msgstr ""
"Ek yazılım kurarken, bunun bazı kullanıcılar için kısıtlanması gerekip "
"gerekmediğini değerlendirmelisiniz. Yeni kurulan yazılımlar öntanımlı olarak "
"tüm kullanıcılar tarafından kullanılabilir."
#. (itstool) path: page/p
#: C/restricting-applications.page:18
msgid "To restrict a users access to a specific application:"
msgstr "Bir kullanıcının belirli bir uygulamaya erişimini kısıtlamak için:"
#. (itstool) path: item/p
#: C/restricting-applications.page:22
msgid "Press the <gui style=\"button\">Restrict Applications</gui> button."
msgstr "<gui style=\"button\">Uygulamaları Kısıtla</gui> düğmesine basın."
#. (itstool) path: item/p
#: C/restricting-applications.page:23
msgid ""
"Enable the switch in the row for each application you would like to restrict "
"the user from accessing."
msgstr ""
"Kullanıcının erişimini kısıtlamak istediğiniz her uygulamanın anahtarını "
"etkinleştirin."
#. (itstool) path: item/p
#: C/restricting-applications.page:24
msgid "Close the <gui>Restrict Applications</gui> window."
msgstr "<gui style=\"button\">Uygulamaları Kısıtla</gui> benceresini kapatın."
#. (itstool) path: page/p
#: C/restricting-applications.page:27
msgid ""
"Restricting access to specific applications is often used in conjunction "
"with <link xref=\"software-installation\"/> to prevent a user from "
"installing additional software which has not been vetted."
msgstr ""
"Belirli uygulamalara erişimin kısıtlanması, kullanıcının incelenmemiş ek "
"yazılımlar kurmasını önlemek için genellikle <link xref=\"software-"
"installation\"/> ile birlikte kullanılır."
#. (itstool) path: info/desc
#: C/software-installation.page:6
msgid ""
"Restricting the software a child user can install, or preventing them "
"installing additional software entirely."
msgstr ""
"Çocuk kullanıcının kurabileceği yazılımı kısıtlamak ya da ek yazılım "
"kurmasını tamamen engellemek."
#. (itstool) path: page/title
#: C/software-installation.page:9
msgid "Restricting Software Installation"
msgstr "Yazılım Kurulumunu Kısıtlama"
#. (itstool) path: page/p
#: C/software-installation.page:11
msgid ""
"You can prevent a user from installing additional software on the system. "
"They will still be able to search for new software to install, but will need "
"an administrator to authorize the installation when they try to install an "
"application. This applies whether they are trying to install the application "
"system-wide (for all users) or just for themselves."
msgstr ""
"Kullanıcının sisteme ek yazılım kurmasını engelleyebilirsiniz. Yine de "
"kurulum için yeni yazılım arayabilecekler, ancak uygulama kurmaya "
"çalıştıklarında kurulumu yetkilendirmek için yöneticiye ihtiyaçları olacak. "
"Bu, uygulamayı sistem geneline (tüm kullanıcılar için) ya da yalnızca "
"kendileri için kurmaya çalışsalar da geçerlidir."
#. (itstool) path: page/p
#: C/software-installation.page:17
msgid ""
"Additionally, you can restrict which software a user can browse or search "
"for in the <app>Software</app> catalog by age categories."
msgstr ""
"Ayrıca, kullanıcının <app>Yazılımlar</app> kataloğunda hangi yazılımlara göz "
"atabileceğini ya da arayabileceğini yaş kategorilerine göre "
"sınırlayabilirsiniz."
#. (itstool) path: page/p
#: C/software-installation.page:20
msgid ""
"To prevent a user from running an application which has already been "
"installed, see <link xref=\"restricting-applications\"/>."
msgstr ""
"Bir kullanıcının zaten kurulu bir uygulamayı çalıştırmasını engellemek için "
"bkz. <link xref=\"restricting-applications\"/>."
#. (itstool) path: section/title
#: C/software-installation.page:24
msgid "Preventing Software Installation"
msgstr "Yazılım Kurulumunu Engelleme"
#. (itstool) path: section/p
#: C/software-installation.page:26
msgid "To prevent a user from installing additional software:"
msgstr "Kullanıcının ek yazılım kurmasını engellemek için:"
#. (itstool) path: item/p
#: C/software-installation.page:30
msgid ""
"Enable the <gui style=\"checkbox\">Restrict Application Installation</gui> "
"checkbox."
msgstr ""
"<gui style=\"checkbox\">Uygulama Kurulumunu Kısıtla</gui> onay kutusunu "
"etkinleştirin."
#. (itstool) path: section/title
#: C/software-installation.page:35
msgid "Restricting Software Installation by Age"
msgstr "Yazılım Kurulumunu Yaşa Göre Kısıtlama"
#. (itstool) path: section/p
#: C/software-installation.page:37
msgid ""
"Applications in the <app>Software</app> catalog have information about "
"content they contain which might be inappropriate for some ages — for "
"example, various forms of violence, unmoderated chat with other people on "
"the internet, or the possibility of spending money."
msgstr ""
"<app>Yazılımlar</app> kataloğundaki uygulamalar, kimi yaş grupları için "
"uygun olmayabilecek içerikleri hakkında bilgiler içerir - örneğin, çeşitli "
"şiddet türleri, internet üzerinden diğer kişilerle denetlenmeyen sohbet, ya "
"da para harcama olasılığı gibi."
#. (itstool) path: section/p
#: C/software-installation.page:41
msgid ""
"For each application, this information is summarized as the minimum age "
"child it is typically suitable to be used by — for example, “suitable for "
"ages 7+”. These age ratings are presented in region-specific schemes which "
"can be compared with the ratings schemes used for films and games."
msgstr ""
"Her uygulama için, bu bilgi genellikle kullanımı için uygun en düşük yaş "
"grubu olarak özetlenir - örneğin, \"7 yaş ve üzeri için uygun\". Bu yaş "
"derecelendirmeleri, filmler ve oyunlar için kullanılan derecelendirme "
"şemaları ile karşılaştırılabilen bölgesel şemalarda sunulur."
#. (itstool) path: section/p
#: C/software-installation.page:45
msgid ""
"The applications shown to a user in the <app>Software</app> catalog can be "
"filtered by their age suitability. Applications which are not suitable for "
"the user will be hidden, and will not be installable by that user. They will "
"be installable by other users (if their age suitability is set high enough)."
msgstr ""
"<app>Yazılımlar</app> kataloğunda kullanıcıya gösterilen uygulamalar, yaş "
"uygunluğuna göre süzülerek gösterilebilir. Kullanıcı için uygun olmayan "
"uygulamalar gizlenir ve kullanıcı tarafından kurulamaz. Bu uygulamalar, yaş "
"uygunluğu yeterince yüksek olan diğer kullanıcılarca kurulabilir."
#. (itstool) path: section/p
#: C/software-installation.page:51
msgid ""
"To filter the applications seen by a user in the <app>Software</app> catalog "
"to only those suitable for a certain age:"
msgstr ""
"Kullanıcının <app>Yazılımlar</app> kataloğunda gördüğü uygulamaları yalnızca "
"belirli yaşa uygun olacak şekilde süzmek için:"
#. (itstool) path: item/p
#: C/software-installation.page:56
msgid ""
"In the <gui>Application Suitability</gui> list, select the age which "
"applications should be suitable for."
msgstr ""
"<gui>Uygulama Uygunluğu</gui> listesinde, uygulamaların hangi yaş için uygun "
"olduğunu seçin."
#. (itstool) path: note/p
#: C/software-installation.page:60
msgid ""
"The users actual age is not stored, so the <gui>Application Suitability</"
"gui> is not automatically updated over time as the child grows older. You "
"must periodically re-assess the appropriate <gui>Application Suitability</"
"gui> for each user."
msgstr ""
"Kullanıcının gerçek yaşı depolanmadığı için, <gui>Uygulama Uygunluğu</gui> "
"çocuk büyüdükçe zamanla kendiliğinden güncellenmez. <gui>Uygulama Uygunluğu</"
"gui> her kullanıcı için düzenli olarak yeniden belirlenmelidir."

View file

@ -0,0 +1,610 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2015-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU General Public License Version 2
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "config.h"
#include <appstream-glib.h>
#include <glib/gi18n-lib.h>
#include <string.h>
#include "gs-content-rating.h"
#if !AS_CHECK_VERSION(0, 7, 18)
const gchar *
gs_content_rating_system_to_str (GsContentRatingSystem system)
{
if (system == GS_CONTENT_RATING_SYSTEM_INCAA)
return "INCAA";
if (system == GS_CONTENT_RATING_SYSTEM_ACB)
return "ACB";
if (system == GS_CONTENT_RATING_SYSTEM_DJCTQ)
return "DJCTQ";
if (system == GS_CONTENT_RATING_SYSTEM_GSRR)
return "GSRR";
if (system == GS_CONTENT_RATING_SYSTEM_PEGI)
return "PEGI";
if (system == GS_CONTENT_RATING_SYSTEM_KAVI)
return "KAVI";
if (system == GS_CONTENT_RATING_SYSTEM_USK)
return "USK";
if (system == GS_CONTENT_RATING_SYSTEM_ESRA)
return "ESRA";
if (system == GS_CONTENT_RATING_SYSTEM_CERO)
return "CERO";
if (system == GS_CONTENT_RATING_SYSTEM_OFLCNZ)
return "OFLCNZ";
if (system == GS_CONTENT_RATING_SYSTEM_RUSSIA)
return "RUSSIA";
if (system == GS_CONTENT_RATING_SYSTEM_MDA)
return "MDA";
if (system == GS_CONTENT_RATING_SYSTEM_GRAC)
return "GRAC";
if (system == GS_CONTENT_RATING_SYSTEM_ESRB)
return "ESRB";
if (system == GS_CONTENT_RATING_SYSTEM_IARC)
return "IARC";
return NULL;
}
/* data obtained from https://en.wikipedia.org/wiki/Video_game_rating_system */
static char *
get_esrb_string (const gchar *source, const gchar *translate)
{
if (g_strcmp0 (source, translate) == 0)
return g_strdup (source);
/* TRANSLATORS: This is the formatting of English and localized name
of the rating e.g. "Adults Only (solo adultos)" */
return g_strdup_printf (_("%s (%s)"), source, translate);
}
/* data obtained from https://en.wikipedia.org/wiki/Video_game_rating_system */
gchar *
gs_utils_content_rating_age_to_str (GsContentRatingSystem system, guint age)
{
if (system == GS_CONTENT_RATING_SYSTEM_INCAA) {
if (age >= 18)
return g_strdup ("+18");
if (age >= 13)
return g_strdup ("+13");
return g_strdup ("ATP");
}
if (system == GS_CONTENT_RATING_SYSTEM_ACB) {
if (age >= 18)
return g_strdup ("R18+");
if (age >= 15)
return g_strdup ("MA15+");
return g_strdup ("PG");
}
if (system == GS_CONTENT_RATING_SYSTEM_DJCTQ) {
if (age >= 18)
return g_strdup ("18");
if (age >= 16)
return g_strdup ("16");
if (age >= 14)
return g_strdup ("14");
if (age >= 12)
return g_strdup ("12");
if (age >= 10)
return g_strdup ("10");
return g_strdup ("L");
}
if (system == GS_CONTENT_RATING_SYSTEM_GSRR) {
if (age >= 18)
return g_strdup ("限制");
if (age >= 15)
return g_strdup ("輔15");
if (age >= 12)
return g_strdup ("輔12");
if (age >= 6)
return g_strdup ("保護");
return g_strdup ("普通");
}
if (system == GS_CONTENT_RATING_SYSTEM_PEGI) {
if (age >= 18)
return g_strdup ("18");
if (age >= 16)
return g_strdup ("16");
if (age >= 12)
return g_strdup ("12");
if (age >= 7)
return g_strdup ("7");
if (age >= 3)
return g_strdup ("3");
return NULL;
}
if (system == GS_CONTENT_RATING_SYSTEM_KAVI) {
if (age >= 18)
return g_strdup ("18+");
if (age >= 16)
return g_strdup ("16+");
if (age >= 12)
return g_strdup ("12+");
if (age >= 7)
return g_strdup ("7+");
if (age >= 3)
return g_strdup ("3+");
return NULL;
}
if (system == GS_CONTENT_RATING_SYSTEM_USK) {
if (age >= 18)
return g_strdup ("18");
if (age >= 16)
return g_strdup ("16");
if (age >= 12)
return g_strdup ("12");
if (age >= 6)
return g_strdup ("6");
return g_strdup ("0");
}
/* Reference: http://www.esra.org.ir/ */
if (system == GS_CONTENT_RATING_SYSTEM_ESRA) {
if (age >= 18)
return g_strdup ("+18");
if (age >= 15)
return g_strdup ("+15");
if (age >= 12)
return g_strdup ("+12");
if (age >= 7)
return g_strdup ("+7");
if (age >= 3)
return g_strdup ("+3");
return NULL;
}
if (system == GS_CONTENT_RATING_SYSTEM_CERO) {
if (age >= 18)
return g_strdup ("Z");
if (age >= 17)
return g_strdup ("D");
if (age >= 15)
return g_strdup ("C");
if (age >= 12)
return g_strdup ("B");
return g_strdup ("A");
}
if (system == GS_CONTENT_RATING_SYSTEM_OFLCNZ) {
if (age >= 18)
return g_strdup ("R18");
if (age >= 16)
return g_strdup ("R16");
if (age >= 15)
return g_strdup ("R15");
if (age >= 13)
return g_strdup ("R13");
return g_strdup ("G");
}
if (system == GS_CONTENT_RATING_SYSTEM_RUSSIA) {
if (age >= 18)
return g_strdup ("18+");
if (age >= 16)
return g_strdup ("16+");
if (age >= 12)
return g_strdup ("12+");
if (age >= 6)
return g_strdup ("6+");
return g_strdup ("0+");
}
if (system == GS_CONTENT_RATING_SYSTEM_MDA) {
if (age >= 18)
return g_strdup ("M18");
if (age >= 16)
return g_strdup ("ADV");
return get_esrb_string ("General", _("General"));
}
if (system == GS_CONTENT_RATING_SYSTEM_GRAC) {
if (age >= 18)
return g_strdup ("18");
if (age >= 15)
return g_strdup ("15");
if (age >= 12)
return g_strdup ("12");
return get_esrb_string ("ALL", _("ALL"));
}
if (system == GS_CONTENT_RATING_SYSTEM_ESRB) {
if (age >= 18)
return get_esrb_string ("Adults Only", _("Adults Only"));
if (age >= 17)
return get_esrb_string ("Mature", _("Mature"));
if (age >= 13)
return get_esrb_string ("Teen", _("Teen"));
if (age >= 10)
return get_esrb_string ("Everyone 10+", _("Everyone 10+"));
if (age >= 6)
return get_esrb_string ("Everyone", _("Everyone"));
return get_esrb_string ("Early Childhood", _("Early Childhood"));
}
/* IARC = everything else */
if (age >= 18)
return g_strdup ("18+");
if (age >= 16)
return g_strdup ("16+");
if (age >= 12)
return g_strdup ("12+");
if (age >= 7)
return g_strdup ("7+");
if (age >= 3)
return g_strdup ("3+");
return NULL;
}
/*
* parse_locale:
* @locale: (transfer full): a locale to parse
* @language_out: (out) (optional) (nullable): return location for the parsed
* language, or %NULL to ignore
* @territory_out: (out) (optional) (nullable): return location for the parsed
* territory, or %NULL to ignore
* @codeset_out: (out) (optional) (nullable): return location for the parsed
* codeset, or %NULL to ignore
* @modifier_out: (out) (optional) (nullable): return location for the parsed
* modifier, or %NULL to ignore
*
* Parse @locale as a locale string of the form
* `language[_territory][.codeset][@modifier]` see `man 3 setlocale` for
* details.
*
* On success, %TRUE will be returned, and the components of the locale will be
* returned in the given addresses, with each component not including any
* separators. Otherwise, %FALSE will be returned and the components will be set
* to %NULL.
*
* @locale is modified, and any returned non-%NULL pointers will point inside
* it.
*
* Returns: %TRUE on success, %FALSE otherwise
*/
static gboolean
parse_locale (gchar *locale /* (transfer full) */,
const gchar **language_out,
const gchar **territory_out,
const gchar **codeset_out,
const gchar **modifier_out)
{
gchar *separator;
const gchar *language = NULL, *territory = NULL, *codeset = NULL, *modifier = NULL;
separator = strrchr (locale, '@');
if (separator != NULL) {
modifier = separator + 1;
*separator = '\0';
}
separator = strrchr (locale, '.');
if (separator != NULL) {
codeset = separator + 1;
*separator = '\0';
}
separator = strrchr (locale, '_');
if (separator != NULL) {
territory = separator + 1;
*separator = '\0';
}
language = locale;
/* Parse failure? */
if (*language == '\0') {
language = NULL;
territory = NULL;
codeset = NULL;
modifier = NULL;
}
if (language_out != NULL)
*language_out = language;
if (territory_out != NULL)
*territory_out = territory;
if (codeset_out != NULL)
*codeset_out = codeset;
if (modifier_out != NULL)
*modifier_out = modifier;
return (language != NULL);
}
/* data obtained from https://en.wikipedia.org/wiki/Video_game_rating_system */
GsContentRatingSystem
gs_utils_content_rating_system_from_locale (const gchar *locale)
{
g_autofree gchar *locale_copy = g_strdup (locale);
const gchar *territory;
/* Default to IARC for locales which cant be parsed. */
if (!parse_locale (locale_copy, NULL, &territory, NULL, NULL))
return GS_CONTENT_RATING_SYSTEM_IARC;
/* Argentina */
if (g_strcmp0 (territory, "AR") == 0)
return GS_CONTENT_RATING_SYSTEM_INCAA;
/* Australia */
if (g_strcmp0 (territory, "AU") == 0)
return GS_CONTENT_RATING_SYSTEM_ACB;
/* Brazil */
if (g_strcmp0 (territory, "BR") == 0)
return GS_CONTENT_RATING_SYSTEM_DJCTQ;
/* Taiwan */
if (g_strcmp0 (territory, "TW") == 0)
return GS_CONTENT_RATING_SYSTEM_GSRR;
/* Europe (but not Finland or Germany), India, Israel,
* Pakistan, Quebec, South Africa */
if ((g_strcmp0 (territory, "GB") == 0) ||
g_strcmp0 (territory, "AL") == 0 ||
g_strcmp0 (territory, "AD") == 0 ||
g_strcmp0 (territory, "AM") == 0 ||
g_strcmp0 (territory, "AT") == 0 ||
g_strcmp0 (territory, "AZ") == 0 ||
g_strcmp0 (territory, "BY") == 0 ||
g_strcmp0 (territory, "BE") == 0 ||
g_strcmp0 (territory, "BA") == 0 ||
g_strcmp0 (territory, "BG") == 0 ||
g_strcmp0 (territory, "HR") == 0 ||
g_strcmp0 (territory, "CY") == 0 ||
g_strcmp0 (territory, "CZ") == 0 ||
g_strcmp0 (territory, "DK") == 0 ||
g_strcmp0 (territory, "EE") == 0 ||
g_strcmp0 (territory, "FR") == 0 ||
g_strcmp0 (territory, "GE") == 0 ||
g_strcmp0 (territory, "GR") == 0 ||
g_strcmp0 (territory, "HU") == 0 ||
g_strcmp0 (territory, "IS") == 0 ||
g_strcmp0 (territory, "IT") == 0 ||
g_strcmp0 (territory, "LZ") == 0 ||
g_strcmp0 (territory, "XK") == 0 ||
g_strcmp0 (territory, "LV") == 0 ||
g_strcmp0 (territory, "FL") == 0 ||
g_strcmp0 (territory, "LU") == 0 ||
g_strcmp0 (territory, "LT") == 0 ||
g_strcmp0 (territory, "MK") == 0 ||
g_strcmp0 (territory, "MT") == 0 ||
g_strcmp0 (territory, "MD") == 0 ||
g_strcmp0 (territory, "MC") == 0 ||
g_strcmp0 (territory, "ME") == 0 ||
g_strcmp0 (territory, "NL") == 0 ||
g_strcmp0 (territory, "NO") == 0 ||
g_strcmp0 (territory, "PL") == 0 ||
g_strcmp0 (territory, "PT") == 0 ||
g_strcmp0 (territory, "RO") == 0 ||
g_strcmp0 (territory, "SM") == 0 ||
g_strcmp0 (territory, "RS") == 0 ||
g_strcmp0 (territory, "SK") == 0 ||
g_strcmp0 (territory, "SI") == 0 ||
g_strcmp0 (territory, "ES") == 0 ||
g_strcmp0 (territory, "SE") == 0 ||
g_strcmp0 (territory, "CH") == 0 ||
g_strcmp0 (territory, "TR") == 0 ||
g_strcmp0 (territory, "UA") == 0 ||
g_strcmp0 (territory, "VA") == 0 ||
g_strcmp0 (territory, "IN") == 0 ||
g_strcmp0 (territory, "IL") == 0 ||
g_strcmp0 (territory, "PK") == 0 ||
g_strcmp0 (territory, "ZA") == 0)
return GS_CONTENT_RATING_SYSTEM_PEGI;
/* Finland */
if (g_strcmp0 (territory, "FI") == 0)
return GS_CONTENT_RATING_SYSTEM_KAVI;
/* Germany */
if (g_strcmp0 (territory, "DE") == 0)
return GS_CONTENT_RATING_SYSTEM_USK;
/* Iran */
if (g_strcmp0 (territory, "IR") == 0)
return GS_CONTENT_RATING_SYSTEM_ESRA;
/* Japan */
if (g_strcmp0 (territory, "JP") == 0)
return GS_CONTENT_RATING_SYSTEM_CERO;
/* New Zealand */
if (g_strcmp0 (territory, "NZ") == 0)
return GS_CONTENT_RATING_SYSTEM_OFLCNZ;
/* Russia: Content rating law */
if (g_strcmp0 (territory, "RU") == 0)
return GS_CONTENT_RATING_SYSTEM_RUSSIA;
/* Singapore */
if (g_strcmp0 (territory, "SQ") == 0)
return GS_CONTENT_RATING_SYSTEM_MDA;
/* South Korea */
if (g_strcmp0 (territory, "KR") == 0)
return GS_CONTENT_RATING_SYSTEM_GRAC;
/* USA, Canada, Mexico */
if ((g_strcmp0 (territory, "US") == 0) ||
g_strcmp0 (territory, "CA") == 0 ||
g_strcmp0 (territory, "MX") == 0)
return GS_CONTENT_RATING_SYSTEM_ESRB;
/* everything else is IARC */
return GS_CONTENT_RATING_SYSTEM_IARC;
}
static const gchar *content_rating_strings[GS_CONTENT_RATING_SYSTEM_LAST][7] = {
{ "3+", "7+", "12+", "16+", "18+", NULL }, /* GS_CONTENT_RATING_SYSTEM_UNKNOWN */
{ "ATP", "+13", "+18", NULL }, /* GS_CONTENT_RATING_SYSTEM_INCAA */
{ "PG", "MA15+", "R18+", NULL }, /* GS_CONTENT_RATING_SYSTEM_ACB */
{ "L", "10", "12", "14", "16", "18", NULL }, /* GS_CONTENT_RATING_SYSTEM_DJCTQ */
{ "普通", "保護", "輔12", "輔15", "限制", NULL }, /* GS_CONTENT_RATING_SYSTEM_GSRR */
{ "3", "7", "12", "16", "18", NULL }, /* GS_CONTENT_RATING_SYSTEM_PEGI */
{ "3+", "7+", "12+", "16+", "18+", NULL }, /* GS_CONTENT_RATING_SYSTEM_KAVI */
{ "0", "6", "12", "16", "18", NULL}, /* GS_CONTENT_RATING_SYSTEM_USK */
{ "+3", "+7", "+12", "+15", "+18", NULL }, /* GS_CONTENT_RATING_SYSTEM_ESRA */
{ "A", "B", "C", "D", "Z", NULL }, /* GS_CONTENT_RATING_SYSTEM_CERO */
{ "G", "R13", "R15", "R16", "R18", NULL }, /* GS_CONTENT_RATING_SYSTEM_OFLCNZ */
{ "0+", "6+", "12+", "16+", "18+", NULL }, /* GS_CONTENT_RATING_SYSTEM_RUSSIA */
{ "General", "ADV", "M18", NULL }, /* GS_CONTENT_RATING_SYSTEM_MDA */
{ "ALL", "12", "15", "18", NULL }, /* GS_CONTENT_RATING_SYSTEM_GRAC */
{ "Early Childhood", "Everyone", "Everyone 10+", "Teen", "Mature", "Adults Only", NULL }, /* GS_CONTENT_RATING_SYSTEM_ESRB */
{ "3+", "7+", "12+", "16+", "18+", NULL }, /* GS_CONTENT_RATING_SYSTEM_IARC */
};
gchar **
gs_utils_content_rating_get_values (GsContentRatingSystem system)
{
g_return_val_if_fail ((int) system < GS_CONTENT_RATING_SYSTEM_LAST, NULL);
/* IARC is the fallback for everything */
if (system == GS_CONTENT_RATING_SYSTEM_UNKNOWN)
system = GS_CONTENT_RATING_SYSTEM_IARC;
/* ESRB is special as it requires localised suffixes */
if (system == GS_CONTENT_RATING_SYSTEM_ESRB) {
g_auto(GStrv) esrb_ages = g_new0 (gchar *, 7);
esrb_ages[0] = get_esrb_string (content_rating_strings[system][0], _("Early Childhood"));
esrb_ages[1] = get_esrb_string (content_rating_strings[system][1], _("Everyone"));
esrb_ages[2] = get_esrb_string (content_rating_strings[system][2], _("Everyone 10+"));
esrb_ages[3] = get_esrb_string (content_rating_strings[system][3], _("Teen"));
esrb_ages[4] = get_esrb_string (content_rating_strings[system][4], _("Mature"));
esrb_ages[5] = get_esrb_string (content_rating_strings[system][5], _("Adults Only"));
esrb_ages[6] = NULL;
return g_steal_pointer (&esrb_ages);
}
return g_strdupv ((gchar **) content_rating_strings[system]);
}
static guint content_rating_ages[GS_CONTENT_RATING_SYSTEM_LAST][7] = {
{ 3, 7, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_UNKNOWN */
{ 0, 13, 18 }, /* GS_CONTENT_RATING_SYSTEM_INCAA */
{ 0, 15, 18 }, /* GS_CONTENT_RATING_SYSTEM_ACB */
{ 0, 10, 12, 14, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_DJCTQ */
{ 0, 6, 12, 15, 18 }, /* GS_CONTENT_RATING_SYSTEM_GSRR */
{ 3, 7, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_PEGI */
{ 3, 7, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_KAVI */
{ 0, 6, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_USK */
{ 3, 7, 12, 15, 18 }, /* GS_CONTENT_RATING_SYSTEM_ESRA */
{ 0, 12, 15, 17, 18 }, /* GS_CONTENT_RATING_SYSTEM_CERO */
{ 0, 13, 15, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_OFLCNZ */
{ 0, 6, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_RUSSIA */
{ 0, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_MDA */
{ 0, 12, 15, 18 }, /* GS_CONTENT_RATING_SYSTEM_GRAC */
{ 0, 6, 10, 13, 17, 18 }, /* GS_CONTENT_RATING_SYSTEM_ESRB */
{ 3, 7, 12, 16, 18 }, /* GS_CONTENT_RATING_SYSTEM_IARC */
};
const guint *
gs_utils_content_rating_get_ages (GsContentRatingSystem system, gsize *length_out)
{
g_return_val_if_fail ((int) system < GS_CONTENT_RATING_SYSTEM_LAST, NULL);
g_return_val_if_fail (length_out != NULL, NULL);
/* IARC is the fallback for everything */
if (system == GS_CONTENT_RATING_SYSTEM_UNKNOWN)
system = GS_CONTENT_RATING_SYSTEM_IARC;
*length_out = g_strv_length ((gchar **) content_rating_strings[system]);
return content_rating_ages[system];
}
typedef enum
{
OARS_1_0,
OARS_1_1,
} OarsVersion;
/* The struct definition below assumes we dont grow more
* #AsContentRating values. */
G_STATIC_ASSERT (AS_CONTENT_RATING_VALUE_LAST == AS_CONTENT_RATING_VALUE_INTENSE + 1);
static const struct {
const gchar *id;
OarsVersion oars_version; /* when the key was first added */
guint csm_age_none; /* for %AS_CONTENT_RATING_VALUE_NONE */
guint csm_age_mild; /* for %AS_CONTENT_RATING_VALUE_MILD */
guint csm_age_moderate; /* for %AS_CONTENT_RATING_VALUE_MODERATE */
guint csm_age_intense; /* for %AS_CONTENT_RATING_VALUE_INTENSE */
} oars_to_csm_mappings[] = {
/* Each @id must only appear once. The set of @csm_age_* values for a
* given @id must be complete and non-decreasing. */
/* v1.0 */
{ "violence-cartoon", OARS_1_0, 0, 3, 4, 6 },
{ "violence-fantasy", OARS_1_0, 0, 3, 7, 8 },
{ "violence-realistic", OARS_1_0, 0, 4, 9, 14 },
{ "violence-bloodshed", OARS_1_0, 0, 9, 11, 18 },
{ "violence-sexual", OARS_1_0, 0, 18, 18, 18 },
{ "drugs-alcohol", OARS_1_0, 0, 11, 13, 16 },
{ "drugs-narcotics", OARS_1_0, 0, 12, 14, 17 },
{ "drugs-tobacco", OARS_1_0, 0, 10, 13, 13 },
{ "sex-nudity", OARS_1_0, 0, 12, 14, 14 },
{ "sex-themes", OARS_1_0, 0, 13, 14, 15 },
{ "language-profanity", OARS_1_0, 0, 8, 11, 14 },
{ "language-humor", OARS_1_0, 0, 3, 8, 14 },
{ "language-discrimination", OARS_1_0, 0, 9, 10, 11 },
{ "money-advertising", OARS_1_0, 0, 7, 8, 10 },
{ "money-gambling", OARS_1_0, 0, 7, 10, 18 },
{ "money-purchasing", OARS_1_0, 0, 12, 14, 15 },
{ "social-chat", OARS_1_0, 0, 4, 10, 13 },
{ "social-audio", OARS_1_0, 0, 15, 15, 15 },
{ "social-contacts", OARS_1_0, 0, 12, 12, 12 },
{ "social-info", OARS_1_0, 0, 0, 13, 13 },
{ "social-location", OARS_1_0, 0, 13, 13, 13 },
/* v1.1 additions */
{ "sex-homosexuality", OARS_1_1, 0, 13, 14, 15 },
{ "sex-prostitution", OARS_1_1, 0, 12, 14, 18 },
{ "sex-adultery", OARS_1_1, 0, 8, 10, 18 },
{ "sex-appearance", OARS_1_1, 0, 10, 10, 15 },
{ "violence-worship", OARS_1_1, 0, 13, 15, 18 },
{ "violence-desecration", OARS_1_1, 0, 13, 15, 18 },
{ "violence-slavery", OARS_1_1, 0, 13, 15, 18 },
};
#endif /* appstream-glib < 0.7.18 */
#if !AS_CHECK_VERSION(0, 7, 18)
/**
* as_content_rating_id_csm_age_to_value:
* @id: the subsection ID e.g. "violence-cartoon"
* @age: the age
*
* Gets the #MctAppFilterOarsValue for a given age.
*
* Returns: the #MctAppFilterOarsValue
**/
MctAppFilterOarsValue
as_content_rating_id_csm_age_to_value (const gchar *id, guint age)
{
for (gsize i = 0; G_N_ELEMENTS (oars_to_csm_mappings); i++) {
if (g_strcmp0 (id, oars_to_csm_mappings[i].id) == 0) {
if (age >= oars_to_csm_mappings[i].csm_age_intense)
return MCT_APP_FILTER_OARS_VALUE_INTENSE;
else if (age >= oars_to_csm_mappings[i].csm_age_moderate)
return MCT_APP_FILTER_OARS_VALUE_MODERATE;
else if (age >= oars_to_csm_mappings[i].csm_age_mild)
return MCT_APP_FILTER_OARS_VALUE_MILD;
else if (age >= oars_to_csm_mappings[i].csm_age_none)
return MCT_APP_FILTER_OARS_VALUE_NONE;
else
return MCT_APP_FILTER_OARS_VALUE_UNKNOWN;
}
}
return MCT_APP_FILTER_OARS_VALUE_UNKNOWN;
}
#endif /* appstream-glib < 0.7.18 */

View file

@ -0,0 +1,93 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2015-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU General Public License Version 2
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
G_BEGIN_DECLS
#include <appstream-glib.h>
#include <glib-object.h>
#include <libmalcontent/malcontent.h>
#if AS_CHECK_VERSION(0, 7, 18)
#define GS_CONTENT_RATING_SYSTEM_UNKNOWN AS_CONTENT_RATING_SYSTEM_UNKNOWN
#define GS_CONTENT_RATING_SYSTEM_INCAA AS_CONTENT_RATING_SYSTEM_INCAA
#define GS_CONTENT_RATING_SYSTEM_ACB AS_CONTENT_RATING_SYSTEM_ACB
#define GS_CONTENT_RATING_SYSTEM_DJCTQ AS_CONTENT_RATING_SYSTEM_DJCTQ
#define GS_CONTENT_RATING_SYSTEM_GSRR AS_CONTENT_RATING_SYSTEM_GSRR
#define GS_CONTENT_RATING_SYSTEM_PEGI AS_CONTENT_RATING_SYSTEM_PEGI
#define GS_CONTENT_RATING_SYSTEM_KAVI AS_CONTENT_RATING_SYSTEM_KAVI
#define GS_CONTENT_RATING_SYSTEM_USK AS_CONTENT_RATING_SYSTEM_USK
#define GS_CONTENT_RATING_SYSTEM_ESRA AS_CONTENT_RATING_SYSTEM_ESRA
#define GS_CONTENT_RATING_SYSTEM_CERO AS_CONTENT_RATING_SYSTEM_CERO
#define GS_CONTENT_RATING_SYSTEM_OFLCNZ AS_CONTENT_RATING_SYSTEM_OFLCNZ
#define GS_CONTENT_RATING_SYSTEM_RUSSIA AS_CONTENT_RATING_SYSTEM_RUSSIA
#define GS_CONTENT_RATING_SYSTEM_MDA AS_CONTENT_RATING_SYSTEM_MDA
#define GS_CONTENT_RATING_SYSTEM_GRAC AS_CONTENT_RATING_SYSTEM_GRAC
#define GS_CONTENT_RATING_SYSTEM_ESRB AS_CONTENT_RATING_SYSTEM_ESRB
#define GS_CONTENT_RATING_SYSTEM_IARC AS_CONTENT_RATING_SYSTEM_IARC
#define GS_CONTENT_RATING_SYSTEM_LAST AS_CONTENT_RATING_SYSTEM_LAST
#define GsContentRatingSystem AsContentRatingSystem
#define gs_utils_content_rating_age_to_str as_content_rating_system_format_age
#define gs_utils_content_rating_system_from_locale as_content_rating_system_from_locale
#define gs_content_rating_system_to_str as_content_rating_system_to_string
#define gs_utils_content_rating_get_values as_content_rating_system_get_formatted_ages
#define gs_utils_content_rating_get_ages as_content_rating_system_get_csm_ages
#define as_content_rating_id_csm_age_to_value as_content_rating_attribute_from_csm_age
#else
typedef enum {
GS_CONTENT_RATING_SYSTEM_UNKNOWN,
GS_CONTENT_RATING_SYSTEM_INCAA,
GS_CONTENT_RATING_SYSTEM_ACB,
GS_CONTENT_RATING_SYSTEM_DJCTQ,
GS_CONTENT_RATING_SYSTEM_GSRR,
GS_CONTENT_RATING_SYSTEM_PEGI,
GS_CONTENT_RATING_SYSTEM_KAVI,
GS_CONTENT_RATING_SYSTEM_USK,
GS_CONTENT_RATING_SYSTEM_ESRA,
GS_CONTENT_RATING_SYSTEM_CERO,
GS_CONTENT_RATING_SYSTEM_OFLCNZ,
GS_CONTENT_RATING_SYSTEM_RUSSIA,
GS_CONTENT_RATING_SYSTEM_MDA,
GS_CONTENT_RATING_SYSTEM_GRAC,
GS_CONTENT_RATING_SYSTEM_ESRB,
GS_CONTENT_RATING_SYSTEM_IARC,
/*< private >*/
GS_CONTENT_RATING_SYSTEM_LAST
} GsContentRatingSystem;
gchar *gs_utils_content_rating_age_to_str (GsContentRatingSystem system,
guint age);
GsContentRatingSystem gs_utils_content_rating_system_from_locale (const gchar *locale);
const gchar *gs_content_rating_system_to_str (GsContentRatingSystem system);
gchar **gs_utils_content_rating_get_values (GsContentRatingSystem system);
const guint *gs_utils_content_rating_get_ages (GsContentRatingSystem system, gsize *length_out);
MctAppFilterOarsValue as_content_rating_id_csm_age_to_value (const gchar *id, guint age);
#endif /* appstream-glib < 0.7.18 */
#if AS_CHECK_VERSION(0, 7, 15)
#define as_content_rating_id_value_to_csm_age as_content_rating_attribute_to_csm_age
#else
guint as_content_rating_id_value_to_csm_age (const gchar *id, MctAppFilterOarsValue value);
#endif /* appstream-glib < 0.7.15 */
G_END_DECLS

View file

@ -1,4 +1,4 @@
libmalcontent_ui_api_version = '1'
libmalcontent_ui_api_version = '0'
libmalcontent_ui_api_name = 'malcontent-ui-' + libmalcontent_ui_api_version
if not cc.has_function('atexit')
@ -12,6 +12,7 @@ resources = gnome.compile_resources(
)
libmalcontent_ui_sources = [
'gs-content-rating.c',
'restrict-applications-dialog.c',
'restrict-applications-selector.c',
'user-controls.c',
@ -22,18 +23,20 @@ libmalcontent_ui_headers = [
'restrict-applications-selector.h',
'user-controls.h',
]
libmalcontent_ui_private_headers = [
'gs-content-rating.h',
]
libmalcontent_ui_public_deps = [
dependency('accountsservice', version: '>= 0.6.39'),
dependency('gio-2.0', version: '>= 2.44'),
dependency('glib-2.0', version: '>= 2.54.2'),
dependency('gobject-2.0', version: '>= 2.54'),
gtk_dep,
libadwaita_dep,
dependency('gtk+-3.0', version: '>= 3.24'),
libmalcontent_dep,
]
libmalcontent_ui_private_deps = [
dependency('appstream', version: '>= 0.12.10'),
dependency('appstream-glib', version: '>= 0.7.15'),
dependency('flatpak'),
]
@ -41,7 +44,7 @@ libmalcontent_ui_private_deps = [
libmalcontent_ui_include_subdir = join_paths(libmalcontent_ui_api_name, 'libmalcontent-ui')
libmalcontent_ui = library(libmalcontent_ui_api_name,
libmalcontent_ui_sources + libmalcontent_ui_headers,
libmalcontent_ui_sources + libmalcontent_ui_headers + libmalcontent_ui_private_headers,
dependencies: libmalcontent_ui_public_deps + libmalcontent_ui_private_deps,
include_directories: root_inc,
install: true,
@ -69,25 +72,25 @@ pkgconfig.generate(libmalcontent_ui,
)
libmalcontent_ui_gir = gnome.generate_gir(libmalcontent_ui,
sources: libmalcontent_ui_sources + libmalcontent_ui_headers,
sources: libmalcontent_ui_sources + libmalcontent_ui_headers + libmalcontent_ui_private_headers,
nsversion: libmalcontent_ui_api_version,
namespace: 'MalcontentUi',
symbol_prefix: 'mct_',
identifier_prefix: 'Mct',
export_packages: 'libmalcontent-ui',
includes: ['AccountsService-1.0', 'Gio-2.0', 'GObject-2.0', 'Gtk-4.0', 'Adw-1', libmalcontent_gir[0]],
includes: ['AccountsService-1.0', 'Gio-2.0', 'GObject-2.0', 'Gtk-3.0', libmalcontent_gir[0]],
install: true,
dependencies: libmalcontent_ui_dep,
)
xmllint = find_program('xmllint', required: false)
if xmllint.found()
gtk_prefix = gtk_dep.get_variable(pkgconfig: 'prefix')
gtk_prefix = dependency('gtk+-3.0').get_pkgconfig_variable('prefix')
test(
'validate-ui', xmllint,
args: [
'--nonet', '--noblanks', '--noout',
'--relaxng', join_paths(gtk_prefix, 'share', 'gtk-4.0', 'gtk4builder.rng'),
'--relaxng', join_paths(gtk_prefix, 'share', 'gtk-3.0', 'gtkbuilder.rng'),
files(
'restrict-applications-dialog.ui',
'restrict-applications-selector.ui',

View file

@ -26,7 +26,6 @@
#include <glib-object.h>
#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include "restrict-applications-dialog.h"
#include "restrict-applications-selector.h"
@ -54,20 +53,13 @@ struct _MctRestrictApplicationsDialog
GtkDialog parent_instance;
MctRestrictApplicationsSelector *selector;
AdwPreferencesGroup *group;
GtkSearchEntry *search_entry;
GtkLabel *description;
MctAppFilter *app_filter; /* (owned) (not nullable) */
gchar *user_display_name; /* (owned) (nullable) */
};
static void search_entry_stop_search_cb (GtkSearchEntry *search_entry,
gpointer user_data);
static gboolean focus_search_cb (GtkWidget *widget,
GVariant *arguments,
gpointer user_data);
G_DEFINE_TYPE (MctRestrictApplicationsDialog, mct_restrict_applications_dialog, ADW_TYPE_PREFERENCES_WINDOW)
G_DEFINE_TYPE (MctRestrictApplicationsDialog, mct_restrict_applications_dialog, GTK_TYPE_DIALOG)
typedef enum
{
@ -147,19 +139,6 @@ mct_restrict_applications_dialog_dispose (GObject *object)
G_OBJECT_CLASS (mct_restrict_applications_dialog_parent_class)->dispose (object);
}
static void
mct_restrict_applications_dialog_map (GtkWidget *widget)
{
MctRestrictApplicationsDialog *self = (MctRestrictApplicationsDialog *)widget;
GTK_WIDGET_CLASS (mct_restrict_applications_dialog_parent_class)->map (widget);
/* Clear and focus the search entry, in case the dialogue is being shown for
* a second time. */
gtk_editable_set_text (GTK_EDITABLE (self->search_entry), "");
gtk_widget_grab_focus (GTK_WIDGET (self->search_entry));
}
static void
mct_restrict_applications_dialog_class_init (MctRestrictApplicationsDialogClass *klass)
{
@ -171,8 +150,6 @@ mct_restrict_applications_dialog_class_init (MctRestrictApplicationsDialogClass
object_class->set_property = mct_restrict_applications_dialog_set_property;
object_class->dispose = mct_restrict_applications_dialog_dispose;
widget_class->map = mct_restrict_applications_dialog_map;
/**
* MctRestrictApplicationsDialog:app-filter: (not nullable)
*
@ -218,16 +195,7 @@ mct_restrict_applications_dialog_class_init (MctRestrictApplicationsDialogClass
gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/MalcontentUi/ui/restrict-applications-dialog.ui");
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsDialog, selector);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsDialog, group);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsDialog, search_entry);
gtk_widget_class_bind_template_callback (widget_class, search_entry_stop_search_cb);
gtk_widget_class_add_binding (widget_class,
GDK_KEY_f, GDK_CONTROL_MASK,
focus_search_cb,
NULL);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsDialog, description);
}
static void
@ -237,8 +205,6 @@ mct_restrict_applications_dialog_init (MctRestrictApplicationsDialog *self)
g_type_ensure (MCT_TYPE_RESTRICT_APPLICATIONS_SELECTOR);
gtk_widget_init_template (GTK_WIDGET (self));
gtk_search_entry_set_key_capture_widget (self->search_entry, GTK_WIDGET (self));
}
static void
@ -248,33 +214,15 @@ update_description (MctRestrictApplicationsDialog *self)
if (self->user_display_name == NULL)
{
adw_preferences_group_set_description (self->group, NULL);
gtk_widget_hide (GTK_WIDGET (self->description));
return;
}
/* Translators: the placeholder is a users full name */
description = g_strdup_printf (_("Restrict %s from using the following installed applications."),
self->user_display_name);
adw_preferences_group_set_description (self->group, description);
}
static void
search_entry_stop_search_cb (GtkSearchEntry *search_entry,
gpointer user_data)
{
/* Clear the search text as the search filtering is bound to that. */
gtk_editable_set_text (GTK_EDITABLE (search_entry), "");
}
static gboolean
focus_search_cb (GtkWidget *widget,
GVariant *arguments,
gpointer user_data)
{
MctRestrictApplicationsDialog *self = MCT_RESTRICT_APPLICATIONS_DIALOG (widget);
gtk_widget_grab_focus (GTK_WIDGET (self->search_entry));
return TRUE;
gtk_label_set_text (self->description, description);
gtk_widget_show (GTK_WIDGET (self->description));
}
/**

View file

@ -24,14 +24,13 @@
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <libmalcontent/manager.h>
G_BEGIN_DECLS
#define MCT_TYPE_RESTRICT_APPLICATIONS_DIALOG (mct_restrict_applications_dialog_get_type ())
G_DECLARE_FINAL_TYPE (MctRestrictApplicationsDialog, mct_restrict_applications_dialog, MCT, RESTRICT_APPLICATIONS_DIALOG, AdwPreferencesWindow)
G_DECLARE_FINAL_TYPE (MctRestrictApplicationsDialog, mct_restrict_applications_dialog, MCT, RESTRICT_APPLICATIONS_DIALOG, GtkDialog)
MctRestrictApplicationsDialog *mct_restrict_applications_dialog_new (MctAppFilter *app_filter,
const gchar *user_display_name);

View file

@ -2,36 +2,48 @@
<!-- Copyright © 2020 Endless, Inc. -->
<interface domain="malcontent">
<requires lib="gtk+" version="3.12"/>
<template class="MctRestrictApplicationsDialog" parent="AdwPreferencesWindow">
<template class="MctRestrictApplicationsDialog" parent="GtkDialog">
<property name="title" translatable="yes">Restrict Applications</property>
<property name="default-width">500</property>
<property name="skip-taskbar-hint">True</property>
<property name="default-width">300</property>
<property name="default-height">500</property>
<property name="search-enabled">False</property>
<child>
<object class="AdwPreferencesPage">
<child internal-child="headerbar">
<object class="GtkHeaderBar">
<property name="title" translatable="yes">Restrict Applications</property>
<property name="show-close-button">True</property>
</object>
</child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="margin">18</property>
<property name="spacing">12</property>
<child>
<object class="AdwPreferencesGroup" id="group">
<object class="GtkLabel" id="description">
<!-- Translated dynamically: -->
<property name="description">Restrict {username} from using the following installed applications.</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkSearchEntry" id="search_entry">
<property name="placeholder-text" translatable="yes">Search for applications…</property>
<signal name="stop-search" handler="search_entry_stop_search_cb" />
</object>
</child>
<child>
<object class="MctRestrictApplicationsSelector" id="selector">
<property name="search" bind-source="search_entry" bind-property="text" />
</object>
</child>
<property name="label">Restrict {username} from using the following installed applications.</property>
<property name="visible">False</property>
<property name="ellipsize">none</property>
<property name="wrap">True</property>
<property name="halign">start</property>
<property name="xalign">0</property>
<property name="hexpand">True</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="accessible-role">static</property>
</object>
</child>
</object>
</child>
<child>
<object class="MctRestrictApplicationsSelector" id="selector">
<property name="visible">True</property>
</object>
<packing>
<property name="expand">True</property>
</packing>
</child>
</object>
</child>
</template>

View file

@ -28,7 +28,6 @@
#include <glib-object.h>
#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <libmalcontent/app-filter.h>
#include "restrict-applications-selector.h"
@ -41,7 +40,6 @@ static void app_info_changed_cb (GAppInfoMonitor *monitor,
static void reload_apps (MctRestrictApplicationsSelector *self);
static GtkWidget *create_row_for_app_cb (gpointer item,
gpointer user_data);
static char *app_info_dup_name (GAppInfo *app_info);
/**
* MctRestrictApplicationsSelector:
@ -55,11 +53,6 @@ static char *app_info_dup_name (GAppInfo *app_info);
* #MctAppFilterBuilder using
* mct_restrict_applications_selector_build_app_filter().
*
* Search terms may be applied using #MctRestrictApplicationsSelector:search.
* These will filter the list of displayed apps so that only ones matching the
* search terms (by name, using UTF-8 normalisation and casefolding) will be
* displayed.
*
* Since: 0.5.0
*/
struct _MctRestrictApplicationsSelector
@ -69,9 +62,7 @@ struct _MctRestrictApplicationsSelector
GtkListBox *listbox;
GList *cached_apps; /* (nullable) (owned) (element-type GAppInfo) */
GListStore *apps;
GtkFilterListModel *filtered_apps;
GtkStringFilter *search_filter;
GListStore *apps; /* (owned) */
GAppInfoMonitor *app_info_monitor; /* (owned) */
gulong app_info_monitor_changed_id;
GHashTable *blocklisted_apps; /* (owned) (element-type GAppInfo) */
@ -82,8 +73,6 @@ struct _MctRestrictApplicationsSelector
FlatpakInstallation *user_installation; /* (owned) */
GtkCssProvider *css_provider; /* (owned) */
gchar *search; /* (nullable) (owned) */
};
G_DEFINE_TYPE (MctRestrictApplicationsSelector, mct_restrict_applications_selector, GTK_TYPE_BOX)
@ -91,10 +80,9 @@ G_DEFINE_TYPE (MctRestrictApplicationsSelector, mct_restrict_applications_select
typedef enum
{
PROP_APP_FILTER = 1,
PROP_SEARCH,
} MctRestrictApplicationsSelectorProperty;
static GParamSpec *properties[PROP_SEARCH + 1];
static GParamSpec *properties[PROP_APP_FILTER + 1];
enum {
SIGNAL_CHANGED,
@ -135,9 +123,6 @@ mct_restrict_applications_selector_get_property (GObject *object,
case PROP_APP_FILTER:
g_value_set_boxed (value, self->app_filter);
break;
case PROP_SEARCH:
g_value_set_string (value, self->search);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -157,9 +142,6 @@ mct_restrict_applications_selector_set_property (GObject *object,
case PROP_APP_FILTER:
mct_restrict_applications_selector_set_app_filter (self, g_value_get_boxed (value));
break;
case PROP_SEARCH:
mct_restrict_applications_selector_set_search (self, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -172,6 +154,7 @@ mct_restrict_applications_selector_dispose (GObject *object)
MctRestrictApplicationsSelector *self = (MctRestrictApplicationsSelector *)object;
g_clear_pointer (&self->blocklisted_apps, g_hash_table_unref);
g_clear_object (&self->apps);
g_clear_list (&self->cached_apps, g_object_unref);
if (self->app_info_monitor != NULL && self->app_info_monitor_changed_id != 0)
@ -184,7 +167,6 @@ mct_restrict_applications_selector_dispose (GObject *object)
g_clear_object (&self->system_installation);
g_clear_object (&self->user_installation);
g_clear_object (&self->css_provider);
g_clear_pointer (&self->search, g_free);
G_OBJECT_CLASS (mct_restrict_applications_selector_parent_class)->dispose (object);
}
@ -219,23 +201,6 @@ mct_restrict_applications_selector_class_init (MctRestrictApplicationsSelectorCl
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
/**
* MctRestrictApplicationsSelector:search: (nullable)
*
* Search terms to filter the displayed list of apps by, or %NULL to not
* filter the search.
*
* Since: 0.12.0
*/
properties[PROP_SEARCH] =
g_param_spec_string ("search",
"Search",
"Search terms to filter the displayed list of apps by.",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
/**
@ -257,26 +222,23 @@ mct_restrict_applications_selector_class_init (MctRestrictApplicationsSelectorCl
gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/MalcontentUi/ui/restrict-applications-selector.ui");
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsSelector, listbox);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsSelector, apps);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsSelector, filtered_apps);
gtk_widget_class_bind_template_child (widget_class, MctRestrictApplicationsSelector, search_filter);
gtk_widget_class_bind_template_callback (widget_class, app_info_dup_name);
}
static void
mct_restrict_applications_selector_init (MctRestrictApplicationsSelector *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
self->apps = g_list_store_new (G_TYPE_APP_INFO);
self->cached_apps = NULL;
self->app_info_monitor = g_app_info_monitor_get ();
self->app_info_monitor_changed_id =
g_signal_connect (self->app_info_monitor, "changed",
(GCallback) app_info_changed_cb, self);
gtk_list_box_bind_model (self->listbox,
G_LIST_MODEL (self->filtered_apps),
G_LIST_MODEL (self->apps),
create_row_for_app_cb,
self,
NULL);
@ -350,8 +312,9 @@ create_row_for_app_cb (gpointer item,
MctRestrictApplicationsSelector *self = MCT_RESTRICT_APPLICATIONS_SELECTOR (user_data);
GAppInfo *app = G_APP_INFO (item);
g_autoptr(GIcon) icon = NULL;
GtkWidget *row, *w;
GtkWidget *box, *w;
const gchar *app_name;
gint size;
GtkStyleContext *context;
app_name = g_app_info_get_name (app);
@ -364,15 +327,23 @@ create_row_for_app_cb (gpointer item,
else
g_object_ref (icon);
row = adw_action_row_new ();
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
gtk_container_set_border_width (GTK_CONTAINER (box), 12);
gtk_widget_set_margin_end (box, 12);
/* Icon */
w = gtk_image_new_from_gicon (icon);
gtk_image_set_icon_size (GTK_IMAGE (w), GTK_ICON_SIZE_LARGE);
adw_action_row_add_prefix (ADW_ACTION_ROW (row), w);
w = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DIALOG);
gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &size, NULL);
gtk_image_set_pixel_size (GTK_IMAGE (w), size);
gtk_container_add (GTK_CONTAINER (box), w);
/* App name label */
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), app_name);
w = g_object_new (GTK_TYPE_LABEL,
"label", app_name,
"hexpand", TRUE,
"xalign", 0.0,
NULL);
gtk_container_add (GTK_CONTAINER (box), w);
/* Switch */
w = g_object_new (GTK_TYPE_SWITCH,
@ -383,24 +354,16 @@ create_row_for_app_cb (gpointer item,
gtk_style_context_add_provider (context,
GTK_STYLE_PROVIDER (self->css_provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
adw_action_row_add_suffix (ADW_ACTION_ROW (row), w);
adw_action_row_set_activatable_widget (ADW_ACTION_ROW (row), w);
gtk_container_add (GTK_CONTAINER (box), w);
gtk_widget_set_focusable (GTK_WIDGET (row), FALSE);
gtk_widget_show_all (box);
/* Fetch status from AccountService */
g_object_set_data (G_OBJECT (row), "GtkSwitch", w);
g_object_set_data_full (G_OBJECT (w), "GAppInfo", g_object_ref (app), g_object_unref);
update_listbox_row_switch (self, GTK_SWITCH (w));
g_signal_connect (w, "notify::active", G_CALLBACK (on_switch_active_changed_cb), self);
return row;
}
static char *
app_info_dup_name (GAppInfo *app_info)
{
return g_strdup (g_app_info_get_name (app_info));
return box;
}
static gint
@ -811,18 +774,25 @@ mct_restrict_applications_selector_set_app_filter (MctRestrictApplicationsSelect
self->app_filter = mct_app_filter_ref (app_filter);
/* Update the status of each app row. */
n_apps = g_list_model_get_n_items (G_LIST_MODEL (self->filtered_apps));
n_apps = g_list_model_get_n_items (G_LIST_MODEL (self->apps));
for (guint i = 0; i < n_apps; i++)
{
GtkListBoxRow *row;
GtkWidget *w;
GtkWidget *box, *w;
g_autoptr(GList) children = NULL; /* (element-type GtkWidget) */
/* Navigate the widget hierarchy set up in create_row_for_app_cb(). */
row = gtk_list_box_get_row_at_index (self->listbox, i);
g_assert (row != NULL && GTK_IS_LIST_BOX_ROW (row));
w = g_object_get_data (G_OBJECT (row), "GtkSwitch");
box = gtk_bin_get_child (GTK_BIN (row));
g_assert (box != NULL && GTK_IS_BOX (box));
children = gtk_container_get_children (GTK_CONTAINER (box));
g_assert (children != NULL);
w = g_list_nth_data (children, 2);
g_assert (w != NULL && GTK_IS_SWITCH (w));
update_listbox_row_switch (self, GTK_SWITCH (w));
@ -830,50 +800,3 @@ mct_restrict_applications_selector_set_app_filter (MctRestrictApplicationsSelect
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_APP_FILTER]);
}
/**
* mct_restrict_applications_selector_get_search:
* @self: an #MctRestrictApplicationsSelector
*
* Get the value of #MctRestrictApplicationsSelector:search.
*
* Returns: current search terms, or %NULL if no search filtering is active
* Since: 0.12.0
*/
const gchar *
mct_restrict_applications_selector_get_search (MctRestrictApplicationsSelector *self)
{
g_return_val_if_fail (MCT_IS_RESTRICT_APPLICATIONS_SELECTOR (self), NULL);
return self->search;
}
/**
* mct_restrict_applications_selector_set_search:
* @self: an #MctRestrictApplicationsSelector
* @search: (nullable): search terms, or %NULL to not filter the app list
*
* Set the value of #MctRestrictApplicationsSelector:search, or clear it to
* %NULL.
*
* Since: 0.12.0
*/
void
mct_restrict_applications_selector_set_search (MctRestrictApplicationsSelector *self,
const gchar *search)
{
g_return_if_fail (MCT_IS_RESTRICT_APPLICATIONS_SELECTOR (self));
/* Squash empty search terms down to nothing. */
if (search != NULL && *search == '\0')
search = NULL;
if (g_strcmp0 (search, self->search) == 0)
return;
g_clear_pointer (&self->search, g_free);
self->search = g_strdup (search);
gtk_string_filter_set_search (self->search_filter, self->search);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SEARCH]);
}

View file

@ -41,8 +41,4 @@ void mct_restrict_applications_selector_set_app_filter (MctRestrictAppl
void mct_restrict_applications_selector_build_app_filter (MctRestrictApplicationsSelector *self,
MctAppFilterBuilder *builder);
const gchar *mct_restrict_applications_selector_get_search (MctRestrictApplicationsSelector *self);
void mct_restrict_applications_selector_set_search (MctRestrictApplicationsSelector *self,
const gchar *search);
G_END_DECLS

View file

@ -4,37 +4,29 @@
<requires lib="gtk+" version="3.12"/>
<template class="MctRestrictApplicationsSelector" parent="GtkBox">
<child>
<object class="GtkListBox" id="listbox">
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="hexpand">True</property>
<property name="selection-mode">none</property>
<property name="hscrollbar-policy">never</property>
<property name="min-content-height">100</property>
<property name="max-content-height">400</property>
<property name="propagate-natural-height">True</property>
<property name="shadow-type">etched-in</property>
<child type="placeholder">
<object class="GtkLabel">
<property name="label" translatable="yes">No applications found to restrict.</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<child>
<object class="GtkListBox" id="listbox">
<property name="visible">True</property>
<property name="selection-mode">none</property>
<child type="placeholder">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">No applications found to restrict.</property>
</object>
</child>
</object>
</child>
<style>
<class name="content"/>
</style>
</object>
</child>
</template>
<object class="GListStore" id="apps">
<property name="item-type">GAppInfo</property>
</object>
<object class="GtkFilterListModel" id="filtered_apps">
<property name="model">apps</property>
<property name="filter">search_filter</property>
</object>
<object class="GtkStringFilter" id="search_filter">
<property name="expression">
<closure type="gchararray" function="app_info_dup_name" />
</property>
</object>
</interface>

View file

@ -1,11 +1,11 @@
/* FIXME: This negative variant of a GtkSwitch should probably be
* upstreamed to GTK. See https://gitlab.gnome.org/GNOME/gtk/issues/2470 */
switch:checked.restricts {
background-color: @yellow_5;
background-color: #fffd33;
}
switch:checked.restricts, switch:checked.restricts slider {
border-color: @yellow_3;
border-color: #ffd52b;
}
switch:disabled.restricts {
@ -14,5 +14,5 @@ switch:disabled.restricts {
}
switch:disabled.restricts slider {
filter: grayscale(100%);
border-color: #bfb8b1;
}

View file

@ -22,7 +22,7 @@
#include "config.h"
#include <appstream.h>
#include <appstream-glib.h>
#include <libmalcontent/malcontent.h>
#include <locale.h>
#include <gio/gio.h>
@ -30,6 +30,7 @@
#include <glib/gi18n-lib.h>
#include <strings.h>
#include "gs-content-rating.h"
#include "restrict-applications-dialog.h"
#include "user-controls.h"
@ -73,19 +74,22 @@ static const guint32 oars_disabled_age = (guint32) -1;
*/
struct _MctUserControls
{
AdwBin parent_instance;
GtkGrid parent_instance;
GtkLabel *description_label;
GMenu *age_menu;
GtkSwitch *restrict_software_installation_switch;
AdwActionRow *restrict_software_installation_row;
GtkLabel *restrict_software_installation_description;
GtkSwitch *restrict_web_browsers_switch;
AdwActionRow *restrict_web_browsers_row;
GtkMenuButton *oars_button;
GtkPopoverMenu *oars_popover;
GtkLabel *restrict_web_browsers_description;
GtkButton *oars_button;
GtkLabel *oars_button_label;
GtkPopover *oars_popover;
MctRestrictApplicationsDialog *restrict_applications_dialog;
GtkLabel *restrict_applications_description;
AdwActionRow *restrict_applications_row;
GtkListBoxRow *restrict_applications_row;
GtkListBox *application_usage_permissions_listbox;
GtkListBox *software_installation_permissions_listbox;
GSimpleActionGroup *action_group; /* (owned) */
@ -108,7 +112,6 @@ struct _MctUserControls
ActUserAccountType user_account_type;
gchar *user_locale; /* (nullable) (owned) */
gchar *user_display_name; /* (nullable) (owned) */
gchar *description; /* (nullable) (owned) */
};
static gboolean blocklist_apps_cb (gpointer data);
@ -121,12 +124,20 @@ static void on_restrict_web_browsers_switch_active_changed_cb (GtkSwitch
GParamSpec *pspec,
MctUserControls *self);
static void on_restrict_applications_action_activated (GSimpleAction *action,
GVariant *param,
gpointer user_data);
static void on_restrict_applications_button_clicked_cb (GtkButton *button,
gpointer user_data);
static gboolean on_restrict_applications_dialog_close_request_cb (GtkWidget *widget,
gpointer user_data);
static gboolean on_restrict_applications_dialog_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer user_data);
static void on_restrict_applications_dialog_response_cb (GtkDialog *dialog,
gint response_id,
gpointer user_data);
static void on_application_usage_permissions_listbox_activated_cb (GtkListBox *list_box,
GtkListBoxRow *row,
gpointer user_data);
static void on_set_age_action_activated (GSimpleAction *action,
GVariant *param,
@ -136,7 +147,7 @@ static void on_permission_allowed_cb (GObject *obj,
GParamSpec *pspec,
gpointer user_data);
G_DEFINE_TYPE (MctUserControls, mct_user_controls, ADW_TYPE_BIN)
G_DEFINE_TYPE (MctUserControls, mct_user_controls, GTK_TYPE_GRID)
typedef enum
{
@ -147,25 +158,23 @@ typedef enum
PROP_USER_LOCALE,
PROP_USER_DISPLAY_NAME,
PROP_DBUS_CONNECTION,
PROP_DESCRIPTION,
} MctUserControlsProperty;
static GParamSpec *properties[PROP_DESCRIPTION + 1];
static GParamSpec *properties[PROP_DBUS_CONNECTION + 1];
static const GActionEntry actions[] = {
{ "set-age", on_set_age_action_activated, "u", NULL, NULL, { 0, }},
{ "restrict-applications", on_restrict_applications_action_activated, NULL, NULL, NULL, { 0, }}
{ "set-age", on_set_age_action_activated, "u", NULL, NULL, { 0, }}
};
/* Auxiliary methods */
static AsContentRatingSystem
static GsContentRatingSystem
get_content_rating_system (MctUserControls *self)
{
if (self->user_locale == NULL)
return AS_CONTENT_RATING_SYSTEM_UNKNOWN;
return GS_CONTENT_RATING_SYSTEM_UNKNOWN;
return as_content_rating_system_from_locale (self->user_locale);
return gs_utils_content_rating_system_from_locale (self->user_locale);
}
static const gchar *
@ -281,7 +290,7 @@ update_restricted_apps (MctUserControls *self)
static void
update_categories_from_language (MctUserControls *self)
{
AsContentRatingSystem rating_system;
GsContentRatingSystem rating_system;
g_auto(GStrv) entries = NULL;
const gchar *rating_system_str;
const guint *ages;
@ -289,12 +298,12 @@ update_categories_from_language (MctUserControls *self)
g_autofree gchar *disabled_action = NULL;
rating_system = get_content_rating_system (self);
rating_system_str = as_content_rating_system_to_string (rating_system);
rating_system_str = gs_content_rating_system_to_str (rating_system);
g_debug ("Using rating system %s", rating_system_str);
entries = as_content_rating_system_get_formatted_ages (rating_system);
ages = as_content_rating_system_get_csm_ages (rating_system, &n_ages);
entries = gs_utils_content_rating_get_values (rating_system);
ages = gs_utils_content_rating_get_ages (rating_system, &n_ages);
/* Fill in the age menu */
g_menu_remove_all (self->age_menu);
@ -348,7 +357,7 @@ G_STATIC_ASSERT ((int) MCT_APP_FILTER_OARS_VALUE_INTENSE == (int) AS_CONTENT_RAT
static void
update_oars_level (MctUserControls *self)
{
AsContentRatingSystem rating_system;
GsContentRatingSystem rating_system;
g_autofree gchar *rating_age_category = NULL;
guint maximum_age, selected_age;
gsize i;
@ -367,7 +376,7 @@ update_oars_level (MctUserControls *self)
oars_value = mct_app_filter_get_oars_value (self->filter, oars_categories[i]);
all_categories_unset &= (oars_value == MCT_APP_FILTER_OARS_VALUE_UNKNOWN);
age = as_content_rating_attribute_to_csm_age (oars_categories[i], (AsContentRatingValue) oars_value);
age = as_content_rating_id_value_to_csm_age (oars_categories[i], (AsContentRatingValue) oars_value);
g_debug ("OARS value for '%s': %s", oars_categories[i], oars_value_to_string (oars_value));
@ -379,7 +388,7 @@ update_oars_level (MctUserControls *self)
all_categories_unset ? "all categories unset" : "some categories set");
rating_system = get_content_rating_system (self);
rating_age_category = as_content_rating_system_format_age (rating_system, maximum_age);
rating_age_category = gs_utils_content_rating_age_to_str (rating_system, maximum_age);
/* Unrestricted? */
if (rating_age_category == NULL || all_categories_unset)
@ -393,7 +402,7 @@ update_oars_level (MctUserControls *self)
selected_age = maximum_age;
}
gtk_menu_button_set_label (self->oars_button, rating_age_category);
gtk_label_set_label (self->oars_button_label, rating_age_category);
self->selected_age = selected_age;
}
@ -464,21 +473,19 @@ update_labels_from_name (MctUserControls *self)
{
g_autofree gchar *l = NULL;
gtk_label_set_markup (self->description_label, self->description);
/* Translators: The placeholder is a users display name. */
l = g_strdup_printf (_("Prevents %s from running web browsers. Limited web content may still be available in other applications."), self->user_display_name);
adw_action_row_set_subtitle (self->restrict_web_browsers_row, l);
gtk_label_set_label (self->restrict_web_browsers_description, l);
g_clear_pointer (&l, g_free);
/* Translators: The placeholder is a users display name. */
l = g_strdup_printf (_("Prevents specified applications from being used by %s."), self->user_display_name);
adw_action_row_set_subtitle (self->restrict_applications_row, l);
gtk_label_set_label (self->restrict_applications_description, l);
g_clear_pointer (&l, g_free);
/* Translators: The placeholder is a users display name. */
l = g_strdup_printf (_("Prevents %s from installing applications."), self->user_display_name);
adw_action_row_set_subtitle (self->restrict_software_installation_row, l);
gtk_label_set_label (self->restrict_software_installation_description, l);
g_clear_pointer (&l, g_free);
}
@ -579,29 +586,29 @@ on_restrict_web_browsers_switch_active_changed_cb (GtkSwitch *s,
}
static void
on_restrict_applications_action_activated (GSimpleAction *action,
GVariant *param,
gpointer user_data)
on_restrict_applications_button_clicked_cb (GtkButton *button,
gpointer user_data)
{
MctUserControls *self = MCT_USER_CONTROLS (user_data);
GtkRoot *root;
GtkWidget *toplevel;
/* Show the restrict applications dialogue modally, making sure to update its
* state first. */
root = gtk_widget_get_root (GTK_WIDGET (self));
if (GTK_IS_WINDOW (root))
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
if (GTK_IS_WINDOW (toplevel))
gtk_window_set_transient_for (GTK_WINDOW (self->restrict_applications_dialog),
GTK_WINDOW (root));
GTK_WINDOW (toplevel));
mct_restrict_applications_dialog_set_user_display_name (self->restrict_applications_dialog, self->user_display_name);
mct_restrict_applications_dialog_set_app_filter (self->restrict_applications_dialog, self->filter);
gtk_window_present (GTK_WINDOW (self->restrict_applications_dialog));
gtk_widget_show (GTK_WIDGET (self->restrict_applications_dialog));
}
static gboolean
on_restrict_applications_dialog_close_request_cb (GtkWidget *widget,
gpointer user_data)
on_restrict_applications_dialog_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
MctUserControls *self = MCT_USER_CONTROLS (user_data);
@ -616,12 +623,33 @@ on_restrict_applications_dialog_close_request_cb (GtkWidget *widget,
return TRUE;
}
static void
on_restrict_applications_dialog_response_cb (GtkDialog *dialog,
gint response_id,
gpointer user_data)
{
MctUserControls *self = MCT_USER_CONTROLS (user_data);
on_restrict_applications_dialog_delete_event_cb (GTK_WIDGET (dialog), NULL, self);
}
static void
on_application_usage_permissions_listbox_activated_cb (GtkListBox *list_box,
GtkListBoxRow *row,
gpointer user_data)
{
MctUserControls *self = MCT_USER_CONTROLS (user_data);
if (row == self->restrict_applications_row)
on_restrict_applications_button_clicked_cb (NULL, self);
}
static void
on_set_age_action_activated (GSimpleAction *action,
GVariant *param,
gpointer user_data)
{
AsContentRatingSystem rating_system;
GsContentRatingSystem rating_system;
MctUserControls *self;
g_auto(GStrv) entries = NULL;
const guint *ages;
@ -633,18 +661,18 @@ on_set_age_action_activated (GSimpleAction *action,
age = g_variant_get_uint32 (param);
rating_system = get_content_rating_system (self);
entries = as_content_rating_system_get_formatted_ages (rating_system);
ages = as_content_rating_system_get_csm_ages (rating_system, &n_ages);
entries = gs_utils_content_rating_get_values (rating_system);
ages = gs_utils_content_rating_get_ages (rating_system, &n_ages);
/* Update the button */
if (age == oars_disabled_age)
gtk_menu_button_set_label (self->oars_button, _("All Ages"));
gtk_label_set_label (self->oars_button_label, _("All Ages"));
for (i = 0; age != oars_disabled_age && entries[i] != NULL; i++)
{
if (ages[i] == age)
{
gtk_menu_button_set_label (self->oars_button, entries[i]);
gtk_label_set_label (self->oars_button_label, entries[i]);
break;
}
}
@ -661,6 +689,53 @@ on_set_age_action_activated (GSimpleAction *action,
schedule_update_blocklisted_apps (self);
}
static void
list_box_header_func (GtkListBoxRow *row,
GtkListBoxRow *before,
gpointer user_data)
{
GtkWidget *current;
if (before == NULL)
{
gtk_list_box_row_set_header (row, NULL);
return;
}
current = gtk_list_box_row_get_header (row);
if (current == NULL)
{
current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
gtk_widget_show (current);
gtk_list_box_row_set_header (row, current);
}
}
static gboolean
on_keynav_failed (GtkWidget *listbox,
GtkDirectionType direction,
gpointer user_data)
{
MctUserControls *self = MCT_USER_CONTROLS (user_data);
GtkWidget *new_widget = NULL;
/* There are currently two listboxes, so dont over-complicate this function. */
if (listbox == GTK_WIDGET (self->application_usage_permissions_listbox) &&
direction == GTK_DIR_DOWN)
new_widget = GTK_WIDGET (self->software_installation_permissions_listbox);
else if (listbox == GTK_WIDGET (self->software_installation_permissions_listbox) &&
direction == GTK_DIR_UP)
new_widget = GTK_WIDGET (self->application_usage_permissions_listbox);
if (new_widget != NULL)
{
gtk_widget_child_focus (new_widget, direction);
return TRUE;
}
return FALSE;
}
/* GObject overrides */
static void
@ -702,7 +777,6 @@ mct_user_controls_finalize (GObject *object)
g_clear_object (&self->user);
g_clear_pointer (&self->user_locale, g_free);
g_clear_pointer (&self->user_display_name, g_free);
g_clear_pointer (&self->description, g_free);
if (self->permission != NULL && self->permission_allowed_id != 0)
{
@ -777,10 +851,6 @@ mct_user_controls_get_property (GObject *object,
g_value_set_object (value, self->dbus_connection);
break;
case PROP_DESCRIPTION:
g_value_set_string (value, self->description);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@ -826,10 +896,6 @@ mct_user_controls_set_property (GObject *object,
self->dbus_connection = g_value_dup_object (value);
break;
case PROP_DESCRIPTION:
mct_user_controls_set_description (self, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@ -948,25 +1014,6 @@ mct_user_controls_class_init (MctUserControlsClass *klass)
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
/**
* MctUserControls:description: (nullable)
*
* The description for the currently selected user account, or %NULL if no
* user is selected.
*
* If set, it must be valid UTF-8 and non-empty.
*
* Since: 0.11.0
*/
properties[PROP_DESCRIPTION] =
g_param_spec_string ("description",
"Description",
"The description for the currently selected user account, or %NULL if no user is selected.",
NULL,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
/**
* MctUserControls:dbus-connection: (not nullable)
*
@ -990,24 +1037,32 @@ mct_user_controls_class_init (MctUserControlsClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/MalcontentUi/ui/user-controls.ui");
gtk_widget_class_bind_template_child (widget_class, MctUserControls, age_menu);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, description_label);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_software_installation_switch);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_software_installation_row);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_software_installation_description);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_web_browsers_switch);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_web_browsers_row);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_web_browsers_description);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, oars_button);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, oars_button_label);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, oars_popover);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_applications_dialog);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_applications_description);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, restrict_applications_row);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, application_usage_permissions_listbox);
gtk_widget_class_bind_template_child (widget_class, MctUserControls, software_installation_permissions_listbox);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_installation_switch_active_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_web_browsers_switch_active_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_dialog_close_request_cb);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_button_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_dialog_delete_event_cb);
gtk_widget_class_bind_template_callback (widget_class, on_restrict_applications_dialog_response_cb);
gtk_widget_class_bind_template_callback (widget_class, on_application_usage_permissions_listbox_activated_cb);
gtk_widget_class_bind_template_callback (widget_class, on_keynav_failed);
}
static void
mct_user_controls_init (MctUserControls *self)
{
g_autoptr(GError) error = NULL;
g_autoptr(GtkCssProvider) provider = NULL;
/* Ensure the types used in the UI are registered. */
@ -1018,9 +1073,9 @@ mct_user_controls_init (MctUserControls *self)
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (provider,
"/org/freedesktop/MalcontentUi/ui/restricts-switch.css");
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
self->selected_age = (guint) -1;
@ -1036,7 +1091,13 @@ mct_user_controls_init (MctUserControls *self)
"permissions",
G_ACTION_GROUP (self->action_group));
gtk_popover_menu_set_menu_model (self->oars_popover, G_MENU_MODEL (self->age_menu));
gtk_popover_bind_model (self->oars_popover, G_MENU_MODEL (self->age_menu), NULL);
/* Automatically add separators between rows. */
gtk_list_box_set_header_func (self->application_usage_permissions_listbox,
list_box_header_func, NULL, NULL);
gtk_list_box_set_header_func (self->software_installation_permissions_listbox,
list_box_header_func, NULL, NULL);
}
/**
@ -1401,38 +1462,6 @@ mct_user_controls_set_user_display_name (MctUserControls *self,
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_USER_DISPLAY_NAME]);
}
/**
* mct_user_controls_set_description:
* @self: an #MctUserControls
* @description: (nullable) (transfer none): the description shown
* above the controls, or %NULL if none.
*
* Set the value of #MctUserControls:description.
*
* Since: 0.11.0
*/
void
mct_user_controls_set_description (MctUserControls *self,
const gchar *description)
{
g_return_if_fail (MCT_IS_USER_CONTROLS (self));
g_return_if_fail (description != NULL);
/* If we have pending unsaved changes from the previous user, force them to be
* saved first. */
flush_update_blocklisted_apps (self);
if (g_strcmp0 (self->description, description) == 0)
return;
g_clear_pointer (&self->description, g_free);
self->description = g_strdup (description);
setup_parental_control_settings (self);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DESCRIPTION]);
}
/**
* mct_user_controls_build_app_filter:
* @self: an #MctUserControls
@ -1475,7 +1504,7 @@ mct_user_controls_build_app_filter (MctUserControls *self,
const gchar *oars_category;
oars_category = oars_categories[i];
oars_value = (MctAppFilterOarsValue) as_content_rating_attribute_from_csm_age (oars_category, self->selected_age);
oars_value = (MctAppFilterOarsValue) as_content_rating_id_csm_age_to_value (oars_category, self->selected_age);
g_debug ("\t\t → %s: %s", oars_category, oars_value_to_string (oars_value));

View file

@ -27,14 +27,13 @@
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <libmalcontent/malcontent.h>
G_BEGIN_DECLS
#define MCT_TYPE_USER_CONTROLS (mct_user_controls_get_type())
G_DECLARE_FINAL_TYPE (MctUserControls, mct_user_controls, MCT, USER_CONTROLS, AdwBin)
G_DECLARE_FINAL_TYPE (MctUserControls, mct_user_controls, MCT, USER_CONTROLS, GtkGrid)
ActUser *mct_user_controls_get_user (MctUserControls *self);
void mct_user_controls_set_user (MctUserControls *self,
@ -60,9 +59,6 @@ const gchar *mct_user_controls_get_user_display_name (MctUserControls *self);
void mct_user_controls_set_user_display_name (MctUserControls *self,
const gchar *user_display_name);
void mct_user_controls_set_description (MctUserControls *self,
const gchar *description);
void mct_user_controls_build_app_filter (MctUserControls *self,
MctAppFilterBuilder *builder);

View file

@ -2,133 +2,491 @@
<!-- Copyright © 2018, 2019, 2020 Endless, Inc. -->
<interface domain="malcontent">
<requires lib="gtk+" version="3.12"/>
<template class="MctUserControls" parent="AdwBin">
<template class="MctUserControls" parent="GtkGrid">
<property name="visible">True</property>
<property name="row-spacing">6</property>
<property name="column-spacing">12</property>
<property name="valign">start</property>
<!-- Application Usage Restrictions -->
<child>
<object class="GtkBox">
<property name="spacing">24</property>
<property name="orientation">vertical</property>
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="GtkLabel" id="description_label">
<property name="wrap">True</property>
<property name="xalign">0.0</property>
<property name="yalign">0.0</property>
</object>
</child>
</object>
</child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="xalign">0.0</property>
<property name="label" translatable="yes">Application Usage Restrictions</property>
<attributes>
<attribute name="weight" value="bold" />
</attributes>
</object>
<packing>
<property name="top-attach">0</property>
<property name="left-attach">0</property>
</packing>
</child>
<!-- Application Usage Restrictions -->
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">Application Usage Restrictions</property>
<object class="GtkListBox" id="application_usage_permissions_listbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
<property name="activate-on-single-click">True</property>
<signal name="row-activated" handler="on_application_usage_permissions_listbox_activated_cb" object="MctUserControls" swapped="no" />
<signal name="keynav-failed" handler="on_keynav_failed" object="MctUserControls" swapped="no" />
<child>
<object class="AdwActionRow" id="restrict_web_browsers_row">
<property name="title" translatable="yes">Restrict _Web Browsers</property>
<property name="use_underline">True</property>
<property name="activatable_widget">restrict_web_browsers_switch</property>
<!-- Set dynamically from user-controls.c: -->
<property name="subtitle">Prevents {username} from running web browsers. Limited web content may still be available in other applications.</property>
<property name="subtitle_lines">0</property>
<property name="focusable">False</property>
<object class="GtkListBoxRow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">False</property>
<property name="selectable">False</property>
<child>
<object class="GtkSwitch" id="restrict_web_browsers_switch">
<property name="halign">end</property>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_restrict_web_browsers_switch_active_changed_cb" object="MctUserControls" swapped="no" />
<style>
<class name="restricts" />
</style>
<property name="margin-left">12</property>
<property name="margin-right">12</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="row-spacing">4</property>
<property name="column-spacing">4</property>
<child>
<object class="GtkLabel" id="restrict_web_browsers_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Restrict _Web Browsers</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">restrict_web_browsers_switch</property>
<accessibility>
<relation target="restrict_web_browsers_switch" type="label-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="restrict_web_browsers_description">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">none</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<!-- Set dynamically from user-controls.c: -->
<property name="label">Prevents {username} from running web browsers. Limited web content may still be available in other applications.</property>
<attributes>
<attribute name="scale" value="0.88"/>
</attributes>
<style>
<class name="dim-label" />
</style>
<accessibility>
<relation target="restrict_web_browsers_switch" type="description-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="restrict_web_browsers_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_restrict_web_browsers_switch_active_changed_cb" object="MctUserControls" swapped="no" />
<style>
<class name="restricts" />
</style>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="height">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow" id="restrict_applications_row">
<object class="GtkListBoxRow" id="restrict_applications_row">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">True</property>
<property name="title" translatable="yes">_Restrict Applications</property>
<property name="use_underline">True</property>
<!-- Set dynamically from user-controls.c: -->
<property name="subtitle">Prevents specified applications from being used by {username}.</property>
<property name="subtitle_lines">0</property>
<property name="action-name">permissions.restrict-applications</property>
<property name="selectable">False</property>
<child>
<object class="GtkImage">
<property name="icon-name">go-next-symbolic</property>
</object>
</child>
</object>
</child>
<style>
<class name="content"/>
</style>
</object>
</child>
<!-- Software Installation Restrictions -->
<child>
<object class="AdwPreferencesGroup">
<property name="title" translatable="yes">Software Installation Restrictions</property>
<child>
<object class="AdwActionRow" id="restrict_software_installation_row">
<property name="visible" bind-source="restrict_software_installation_switch" bind-property="visible" bind-flags="default|sync-create" />
<property name="title" translatable="yes">Restrict Application _Installation</property>
<property name="use_underline">True</property>
<property name="activatable_widget">restrict_software_installation_switch</property>
<!-- Set dynamically from user-controls.c: -->
<property name="subtitle">Prevents {username} from installing applications.</property>
<property name="subtitle_lines">0</property>
<property name="focusable">False</property>
<child>
<object class="GtkSwitch" id="restrict_software_installation_switch">
<property name="halign">end</property>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_restrict_installation_switch_active_changed_cb" object="MctUserControls" swapped="no" />
<style>
<class name="restricts" />
</style>
<property name="margin-left">12</property>
<property name="margin-right">12</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="row-spacing">4</property>
<property name="column-spacing">4</property>
<child>
<object class="GtkLabel" id="restrict_applications_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Restrict Applications</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">restrict_applications_button</property>
<accessibility>
<relation target="restrict_applications_button" type="label-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="restrict_applications_description">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">none</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<!-- Set dynamically from user-controls.c: -->
<property name="label">Prevents specified applications from being used by {username}.</property>
<attributes>
<attribute name="scale" value="0.88"/>
</attributes>
<style>
<class name="dim-label" />
</style>
<accessibility>
<relation target="restrict_applications_button" type="description-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="restrict_applications_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<property name="relief">none</property>
<signal name="clicked" handler="on_restrict_applications_button_clicked_cb" object="MctUserControls" swapped="no" />
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-name">go-next-symbolic</property>
<property name="icon-size">4</property><!-- GTK_ICON_SIZE_BUTTON -->
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="height">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Application _Suitability</property>
<property name="use_underline">True</property>
<property name="activatable_widget">oars_button</property>
<property name="subtitle" translatable="yes">Restricts the browsing or installation of applications unsuitable for this age or younger.</property>
<property name="subtitle_lines">0</property>
<property name="focusable">False</property>
<child>
<object class="GtkMenuButton" id="oars_button">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="popover">oars_popover</property>
<property name="always-show-arrow">True</property>
</object>
</child>
</object>
</child>
<style>
<class name="content"/>
</style>
</object>
</child>
</object>
<packing>
<property name="top-attach">1</property>
<property name="left-attach">0</property>
</packing>
</child>
<!-- Software Installation Restrictions -->
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="margin-top">12</property>
<property name="xalign">0.0</property>
<property name="label" translatable="yes">Software Installation Restrictions</property>
<attributes>
<attribute name="weight" value="bold" />
</attributes>
</object>
<packing>
<property name="top-attach">2</property>
<property name="left-attach">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkListBox" id="software_installation_permissions_listbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
<signal name="keynav-failed" handler="on_keynav_failed" object="MctUserControls" swapped="no" />
<child>
<object class="GtkListBoxRow">
<property name="visible" bind-source="restrict_software_installation_switch" bind-property="visible" bind-flags="default|sync-create" />
<property name="can_focus">True</property>
<property name="activatable">False</property>
<property name="selectable">False</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="margin-left">12</property>
<property name="margin-right">12</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="row-spacing">4</property>
<property name="column-spacing">4</property>
<child>
<object class="GtkLabel" id="restrict_software_installation_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Restrict Application _Installation</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">restrict_software_installation_switch</property>
<accessibility>
<relation target="restrict_software_installation_switch" type="label-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="restrict_software_installation_description">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">none</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<!-- Set dynamically from user-controls.c: -->
<property name="label">Prevents {username} from installing applications.</property>
<attributes>
<attribute name="scale" value="0.88"/>
</attributes>
<style>
<class name="dim-label" />
</style>
<accessibility>
<relation target="restrict_software_installation_switch" type="description-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="restrict_software_installation_switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<signal name="notify::active" handler="on_restrict_installation_switch_active_changed_cb" object="MctUserControls" swapped="no" />
<style>
<class name="restricts" />
</style>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="height">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="activatable">False</property>
<property name="selectable">False</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">center</property>
<property name="margin-left">12</property>
<property name="margin-right">12</property>
<property name="margin-top">8</property>
<property name="margin-bottom">8</property>
<property name="row-spacing">4</property>
<property name="column-spacing">4</property>
<child>
<object class="GtkLabel" id="oars_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">end</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Application _Suitability</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">oars_button</property>
<accessibility>
<relation target="oars_button" type="label-for"/>
<relation target="oars_button" type="flows-to"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="oars_description">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="ellipsize">none</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Restricts browsing or installation of applications to applications suitable for certain ages or above.</property>
<attributes>
<attribute name="scale" value="0.88"/>
</attributes>
<style>
<class name="dim-label" />
</style>
<accessibility>
<relation target="oars_button" type="description-for"/>
</accessibility>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="oars_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">end</property>
<property name="valign">center</property>
<property name="direction">right</property>
<property name="popover">oars_popover</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">horizontal</property>
<child>
<object class="GtkLabel" id="oars_button_label">
<property name="visible">True</property>
<property name="label"></property>
<property name="expand">True</property>
<property name="halign">start</property>
<property name="xalign">0.0</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-name">pan-down-symbolic</property>
<property name="icon-size">4</property><!-- GTK_ICON_SIZE_BUTTON -->
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
<property name="height">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="top-attach">3</property>
<property name="left-attach">0</property>
</packing>
</child>
</template>
<object class="GtkPopoverMenu" id="oars_popover" />
<object class="GtkPopoverMenu" id="oars_popover">
<accessibility>
<relation target="oars_button" type="popup-for"/>
</accessibility>
</object>
<menu id="age_menu" />
<object class="GtkSizeGroup">
<property name="mode">horizontal</property>
<widgets>
<widget name="oars_button" />
<widget name="oars_popover" />
</widgets>
</object>
<object class="GtkSizeGroup">
<property name="mode">horizontal</property>
<widgets>
<widget name="restrict_web_browsers_label" />
<widget name="restrict_web_browsers_description" />
<widget name="restrict_applications_label" />
<widget name="restrict_applications_description" />
<widget name="oars_label" />
<widget name="restrict_software_installation_label" />
</widgets>
</object>
<object class="MctRestrictApplicationsDialog" id="restrict_applications_dialog">
<property name="visible">False</property>
<property name="modal">True</property>
<property name="destroy-with-parent">False</property>
<signal name="close-request" handler="on_restrict_applications_dialog_close_request_cb" />
<property name="use-header-bar">1</property>
<signal name="delete-event" handler="on_restrict_applications_dialog_delete_event_cb" />
<signal name="response" handler="on_restrict_applications_dialog_response_cb" />
</object>
</interface>

View file

@ -48,7 +48,6 @@ typedef enum
struct _MctAppFilter
{
/*< private >*/
gint ref_count;
uid_t user_id;

View file

@ -66,7 +66,7 @@ pkgconfig.generate(libmalcontent,
)
libmalcontent_gir = gnome.generate_gir(libmalcontent,
sources: libmalcontent_sources + libmalcontent_headers + enums,
sources: libmalcontent_sources + libmalcontent_headers + libmalcontent_private_headers + enums,
nsversion: libmalcontent_api_version,
namespace: 'Malcontent',
symbol_prefix: 'mct_',

View file

@ -50,7 +50,6 @@ typedef enum
struct _MctSessionLimits
{
/*< private >*/
gint ref_count;
uid_t user_id;

View file

@ -297,7 +297,6 @@ def command_check_app_filter(user, arg, quiet=False, interactive=True):
# when passing flatpak IDs as argument
is_maybe_content_type = not is_maybe_flatpak_id and is_valid_content_type(arg)
is_maybe_path = os.path.exists(arg)
is_maybe_desktop_file = arg.endswith('.desktop')
recognised_types = sum([is_maybe_flatpak_id, is_maybe_flatpak_ref,
is_maybe_content_type, is_maybe_path])
@ -321,11 +320,6 @@ def command_check_app_filter(user, arg, quiet=False, interactive=True):
# Content type
is_allowed = app_filter.is_content_type_allowed(arg)
noun = 'Content type'
elif is_maybe_path and is_maybe_desktop_file
path = os.path.abspath(arg)
app_info = Gio.DesktopAppInfo.new_from_filename(path)
is_allowed = app_filter.is_appinfo_allowed(app_info)
noun = 'Desktop file'
elif is_maybe_path:
path = os.path.abspath(arg)
is_allowed = app_filter.is_path_allowed(path)

View file

@ -27,7 +27,6 @@
#include <glib/gi18n-lib.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <libmalcontent-ui/malcontent-ui.h>
#include <polkit/polkit.h>
@ -77,7 +76,8 @@ struct _MctApplication
MctUserSelector *user_selector;
MctUserControls *user_controls;
GtkStack *main_stack;
AdwStatusPage *error_page;
GtkLabel *error_title;
GtkLabel *error_message;
GtkLockButton *lock_button;
GtkButton *user_accounts_panel_button;
GtkLabel *help_label;
@ -209,9 +209,11 @@ mct_application_activate (GApplication *application)
self->main_stack = GTK_STACK (gtk_builder_get_object (builder, "main_stack"));
self->user_selector = MCT_USER_SELECTOR (gtk_builder_get_object (builder, "user_selector"));
self->user_controls = MCT_USER_CONTROLS (gtk_builder_get_object (builder, "user_controls"));
self->error_page = ADW_STATUS_PAGE (gtk_builder_get_object (builder, "error_page"));
self->error_title = GTK_LABEL (gtk_builder_get_object (builder, "error_title"));
self->error_message = GTK_LABEL (gtk_builder_get_object (builder, "error_message"));
self->lock_button = GTK_LOCK_BUTTON (gtk_builder_get_object (builder, "lock_button"));
self->user_accounts_panel_button = GTK_BUTTON (gtk_builder_get_object (builder, "user_accounts_panel_button"));
self->help_label = GTK_LABEL (gtk_builder_get_object (builder, "help_label"));
/* Connect signals. */
g_signal_connect_object (self->user_selector, "notify::user",
@ -228,7 +230,7 @@ mct_application_activate (GApplication *application)
user_selector_notify_user_cb (G_OBJECT (self->user_selector), NULL, self);
user_manager_notify_is_loaded_cb (G_OBJECT (self->user_manager), NULL, self);
gtk_window_present (GTK_WINDOW (window));
gtk_widget_show (GTK_WIDGET (window));
}
/* Bring the window to the front. */
@ -248,8 +250,6 @@ mct_application_startup (GApplication *application)
/* Chain up. */
G_APPLICATION_CLASS (mct_application_parent_class)->startup (application);
adw_init ();
g_action_map_add_action_entries (G_ACTION_MAP (application), app_entries,
G_N_ELEMENTS (app_entries), application);
@ -323,16 +323,13 @@ about_action_cb (GSimpleAction *action, GVariant *parameters, gpointer user_data
}
static void
on_malcontent_help_shown_finished_cb (GObject *source,
GAsyncResult *result,
gpointer user_data)
help_action_cb (GSimpleAction *action, GVariant *parameters, gpointer user_data)
{
MctApplication *self = MCT_APPLICATION (user_data);
g_autoptr(GError) local_error = NULL;
if (!gtk_show_uri_full_finish (mct_application_get_main_window (self),
result,
&local_error))
if (!gtk_show_uri_on_window (mct_application_get_main_window (self), "help:malcontent",
gtk_get_current_event_time (), &local_error))
{
GtkWidget *dialog = gtk_message_dialog_new (mct_application_get_main_window (self),
GTK_DIALOG_MODAL,
@ -340,23 +337,13 @@ on_malcontent_help_shown_finished_cb (GObject *source,
GTK_BUTTONS_OK,
_("The help contents could not be displayed"));
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", local_error->message);
gtk_window_present (GTK_WINDOW (dialog));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
}
static void
help_action_cb (GSimpleAction *action, GVariant *parameters, gpointer user_data)
{
MctApplication *self = MCT_APPLICATION (user_data);
gtk_show_uri_full (mct_application_get_main_window (self),
"help:malcontent",
GDK_CURRENT_TIME,
NULL,
on_malcontent_help_shown_finished_cb,
self);
}
static void
quit_action_cb (GSimpleAction *action, GVariant *parameters, gpointer user_data)
{
@ -384,10 +371,10 @@ update_main_stack (MctApplication *self)
if ((is_user_manager_loaded && act_user_manager_no_service (self->user_manager)) ||
self->permission_error != NULL)
{
adw_status_page_set_title (self->error_page,
_("Failed to load user data from the system"));
adw_status_page_set_description (self->error_page,
_("Please make sure that the AccountsService is installed and enabled."));
gtk_label_set_label (self->error_title,
_("Failed to load user data from the system"));
gtk_label_set_label (self->error_message,
_("Please make sure that the AccountsService is installed and enabled."));
new_page_name = "error";
new_focus_widget = NULL;
@ -423,7 +410,7 @@ update_main_stack (MctApplication *self)
"with %s. <a href='https://www.commonsensemedia.org/privacy-and-internet-safety'>"
"Read guidance</a> on what to consider."),
act_user_get_real_name (selected_user));
mct_user_controls_set_description (self->user_controls, help_label);
gtk_label_set_markup (self->help_label, help_label);
mct_user_controls_set_user (self->user_controls, selected_user);
@ -440,7 +427,12 @@ update_main_stack (MctApplication *self)
gtk_stack_set_visible_child_name (self->main_stack, new_page_name);
if (new_focus_widget != NULL && !g_str_equal (old_page_name, new_page_name))
gtk_widget_grab_focus (new_focus_widget);
{
if (gtk_widget_get_can_focus (new_focus_widget))
gtk_widget_grab_focus (new_focus_widget);
else
gtk_widget_child_focus (new_focus_widget, GTK_DIR_TAB_FORWARD);
}
}
static void

View file

@ -18,7 +18,6 @@
*
* Authors:
* - Felipe Borges <felipeborges@gnome.org>
* - Georges Basile Stavracas Neto <georges@endlessos.org>
* - Philip Withnall <withnall@endlessm.com>
*/
@ -30,16 +29,13 @@
#define ARROW_SIZE 20
#define MCT_TYPE_CAROUSEL_LAYOUT (mct_carousel_layout_get_type ())
G_DECLARE_FINAL_TYPE (MctCarouselLayout, mct_carousel_layout, MCT, CAROUSEL_LAYOUT, GtkLayoutManager)
struct _MctCarouselItem {
GtkButton parent;
GtkRadioButton parent;
gint page;
};
G_DEFINE_TYPE (MctCarouselItem, mct_carousel_item, GTK_TYPE_BUTTON)
G_DEFINE_TYPE (MctCarouselItem, mct_carousel_item, GTK_TYPE_RADIO_BUTTON)
GtkWidget *
mct_carousel_item_new (void)
@ -47,36 +43,28 @@ mct_carousel_item_new (void)
return g_object_new (MCT_TYPE_CAROUSEL_ITEM, NULL);
}
void
mct_carousel_item_set_child (MctCarouselItem *self,
GtkWidget *child)
{
g_return_if_fail (MCT_IS_CAROUSEL_ITEM (self));
gtk_button_set_child (GTK_BUTTON (self), child);
}
static void
mct_carousel_item_class_init (MctCarouselItemClass *klass)
{
gtk_widget_class_set_css_name (GTK_WIDGET_CLASS (klass), "carousel-item");
}
static void
mct_carousel_item_init (MctCarouselItem *self)
{
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (self), FALSE);
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)),
"carousel-item");
}
struct _MctCarousel {
AdwBin parent;
GtkRevealer *revealer;
GtkRevealer parent;
GList *children;
gint visible_page;
MctCarouselItem *selected_item;
GtkWidget *last_box;
GtkWidget *arrow;
gint arrow_start_x;
/* Widgets */
GtkStack *stack;
@ -86,7 +74,7 @@ struct _MctCarousel {
GtkStyleProvider *provider;
};
G_DEFINE_TYPE (MctCarousel, mct_carousel, ADW_TYPE_BIN)
G_DEFINE_TYPE (MctCarousel, mct_carousel, GTK_TYPE_REVEALER)
enum {
ITEM_ACTIVATED,
@ -103,9 +91,9 @@ mct_carousel_item_get_x (MctCarouselItem *item,
{
GtkWidget *widget, *parent;
gint width;
gdouble dest_x;
gint dest_x;
parent = GTK_WIDGET (carousel->revealer);
parent = GTK_WIDGET (carousel->stack);
widget = GTK_WIDGET (item);
width = gtk_widget_get_allocated_width (widget);
@ -128,6 +116,8 @@ mct_carousel_move_arrow (MctCarousel *self)
GtkStyleContext *context;
gchar *css;
gint end_x;
GtkSettings *settings;
gboolean animations;
if (!self->selected_item)
return;
@ -139,9 +129,31 @@ mct_carousel_move_arrow (MctCarousel *self)
gtk_style_context_remove_provider (context, self->provider);
g_clear_object (&self->provider);
css = g_strdup_printf ("* { margin-left: %dpx; }", end_x);
settings = gtk_widget_get_settings (GTK_WIDGET (self));
g_object_get (settings, "gtk-enable-animations", &animations, NULL);
/* Animate the arrow movement if animations are enabled. Otherwise,
* jump the arrow to the right location instantly. */
if (animations)
{
css = g_strdup_printf ("@keyframes arrow_keyframes-%d-%d {\n"
" from { margin-left: %dpx; }\n"
" to { margin-left: %dpx; }\n"
"}\n"
"* {\n"
" animation-name: arrow_keyframes-%d-%d;\n"
"}\n",
self->arrow_start_x, end_x,
self->arrow_start_x, end_x,
self->arrow_start_x, end_x);
}
else
{
css = g_strdup_printf ("* { margin-left: %dpx }", end_x);
}
self->provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (self->provider), css, -1);
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (self->provider), css, -1, NULL);
gtk_style_context_add_provider (context, self->provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_free (css);
@ -222,7 +234,10 @@ mct_carousel_select_item (MctCarousel *self,
}
if (self->selected_item != NULL)
page_changed = (self->selected_item->page != item->page);
{
page_changed = (self->selected_item->page != item->page);
self->arrow_start_x = mct_carousel_item_get_x (self->selected_item, self);
}
self->selected_item = item;
self->visible_page = item->page;
@ -285,44 +300,59 @@ mct_carousel_goto_next_page (GtkWidget *button,
mct_carousel_select_item_at_index (self, self->visible_page * ITEMS_PER_PAGE);
}
void
mct_carousel_add (MctCarousel *self,
MctCarouselItem *item)
static void
mct_carousel_add (GtkContainer *container,
GtkWidget *widget)
{
MctCarousel *self = MCT_CAROUSEL (container);
gboolean last_box_is_full;
g_return_if_fail (MCT_IS_CAROUSEL (self));
g_return_if_fail (MCT_IS_CAROUSEL_ITEM (item));
if (!MCT_IS_CAROUSEL_ITEM (widget))
{
GTK_CONTAINER_CLASS (mct_carousel_parent_class)->add (container, widget);
return;
}
self->children = g_list_append (self->children, item);
item->page = get_last_page_number (self);
g_signal_connect (item, "clicked", G_CALLBACK (on_item_toggled), self);
gtk_style_context_add_class (gtk_widget_get_style_context (widget), "menu");
gtk_button_set_relief (GTK_BUTTON (widget), GTK_RELIEF_NONE);
self->children = g_list_append (self->children, widget);
MCT_CAROUSEL_ITEM (widget)->page = get_last_page_number (self);
if (self->selected_item != NULL)
gtk_radio_button_join_group (GTK_RADIO_BUTTON (widget), GTK_RADIO_BUTTON (self->selected_item));
g_signal_connect (widget, "button-press-event", G_CALLBACK (on_item_toggled), self);
last_box_is_full = ((g_list_length (self->children) - 1) % ITEMS_PER_PAGE == 0);
if (last_box_is_full)
{
g_autofree gchar *page = NULL;
page = g_strdup_printf ("%d", item->page);
self->last_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 18);
gtk_widget_set_hexpand (self->last_box, TRUE);
page = g_strdup_printf ("%d", MCT_CAROUSEL_ITEM (widget)->page);
self->last_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_show (self->last_box);
gtk_widget_set_valign (self->last_box, GTK_ALIGN_CENTER);
gtk_box_set_homogeneous (GTK_BOX (self->last_box), TRUE);
gtk_stack_add_named (self->stack, self->last_box, page);
}
gtk_box_append (GTK_BOX (self->last_box), GTK_WIDGET (item));
gtk_widget_show_all (widget);
gtk_box_pack_start (GTK_BOX (self->last_box), widget, TRUE, FALSE, 10);
update_buttons_visibility (self);
}
static void
destroy_widget_cb (GtkWidget *widget,
gpointer user_data)
{
gtk_widget_destroy (widget);
}
void
mct_carousel_purge_items (MctCarousel *self)
{
GtkWidget *child;
while ((child = gtk_widget_get_first_child (GTK_WIDGET (self->stack))) != NULL)
gtk_stack_remove (self->stack, child);
gtk_container_forall (GTK_CONTAINER (self->stack),
destroy_widget_cb,
NULL);
g_list_free (self->children);
self->children = NULL;
@ -356,6 +386,7 @@ mct_carousel_class_init (MctCarouselClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *wclass = GTK_WIDGET_CLASS (klass);
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
gtk_widget_class_set_template_from_resource (wclass,
"/org/freedesktop/MalcontentControl/ui/carousel.ui");
@ -364,15 +395,14 @@ mct_carousel_class_init (MctCarouselClass *klass)
gtk_widget_class_bind_template_child (wclass, MctCarousel, go_back_button);
gtk_widget_class_bind_template_child (wclass, MctCarousel, go_next_button);
gtk_widget_class_bind_template_child (wclass, MctCarousel, arrow);
gtk_widget_class_bind_template_child (wclass, MctCarousel, revealer);
gtk_widget_class_bind_template_callback (wclass, mct_carousel_goto_previous_page);
gtk_widget_class_bind_template_callback (wclass, mct_carousel_goto_next_page);
gtk_widget_class_set_layout_manager_type (wclass, MCT_TYPE_CAROUSEL_LAYOUT);
object_class->dispose = mct_carousel_dispose;
container_class->add = mct_carousel_add;
signals[ITEM_ACTIVATED] =
g_signal_new ("item-activated",
MCT_TYPE_CAROUSEL,
@ -384,6 +414,19 @@ mct_carousel_class_init (MctCarouselClass *klass)
MCT_TYPE_CAROUSEL_ITEM);
}
static void
on_size_allocate (MctCarousel *self)
{
if (self->selected_item == NULL)
return;
if (gtk_stack_get_transition_running (self->stack))
return;
self->arrow_start_x = mct_carousel_item_get_x (self->selected_item, self);
mct_carousel_move_arrow (self);
}
static void
on_transition_running (MctCarousel *self)
{
@ -402,12 +445,13 @@ mct_carousel_init (MctCarousel *self)
gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider),
"/org/freedesktop/MalcontentControl/ui/carousel.css");
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
provider,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
provider,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1);
g_object_unref (provider);
g_signal_connect_swapped (self->stack, "size-allocate", G_CALLBACK (on_size_allocate), self);
g_signal_connect_swapped (self->stack, "notify::transition-running", G_CALLBACK (on_transition_running), self);
}
@ -416,77 +460,3 @@ mct_carousel_get_item_count (MctCarousel *self)
{
return g_list_length (self->children);
}
void
mct_carousel_set_revealed (MctCarousel *self,
gboolean revealed)
{
g_return_if_fail (MCT_IS_CAROUSEL (self));
gtk_revealer_set_reveal_child (self->revealer, revealed);
}
struct _MctCarouselLayout {
GtkLayoutManager parent;
};
G_DEFINE_FINAL_TYPE (MctCarouselLayout, mct_carousel_layout, GTK_TYPE_LAYOUT_MANAGER)
static void
mct_carousel_layout_measure (GtkLayoutManager *layout_manager,
GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
MctCarousel *carousel;
g_assert (MCT_IS_CAROUSEL (widget));
carousel = MCT_CAROUSEL (widget);
gtk_widget_measure (GTK_WIDGET (carousel->revealer),
orientation, for_size,
minimum, natural,
minimum_baseline, natural_baseline);
}
static void
mct_carousel_layout_allocate (GtkLayoutManager *layout_manager,
GtkWidget *widget,
int width,
int height,
int baseline)
{
MctCarousel *carousel;
g_assert (MCT_IS_CAROUSEL (widget));
carousel = MCT_CAROUSEL (widget);
gtk_widget_allocate (GTK_WIDGET (carousel->revealer), width, height, baseline, NULL);
if (carousel->selected_item == NULL)
return;
if (gtk_stack_get_transition_running (carousel->stack))
return;
mct_carousel_move_arrow (carousel);
}
static void
mct_carousel_layout_class_init (MctCarouselLayoutClass *klass)
{
GtkLayoutManagerClass *layout_manager_class = GTK_LAYOUT_MANAGER_CLASS (klass);
layout_manager_class->measure = mct_carousel_layout_measure;
layout_manager_class->allocate = mct_carousel_layout_allocate;
}
static void
mct_carousel_layout_init (MctCarouselLayout *self)
{
}

View file

@ -22,18 +22,9 @@
margin-bottom: -2px;
}
carousel-item {
.carousel-item {
background: transparent;
box-shadow: none;
border: none;
color: @theme_fg_color;
}
carousel-item:focus:focus-visible avatar {
/* this should actually be $focus_border_color from
* gtk/theme/Default/_colors.scss, but we have to simplify the theming slightly */
outline-color: @theme_selected_bg_color;
outline-offset: -2px;
outline-width: 2px;
outline-style: solid;
}

View file

@ -18,28 +18,24 @@
*
* Authors:
* - Felipe Borges <felipeborges@gnome.org>
* - Georges Basile Stavracas Neto <georges@endlessos.org>
* - Philip Withnall <withnall@endlessm.com>
*/
#pragma once
#include <adwaita.h>
#include <gtk/gtk.h>
G_BEGIN_DECLS
#define MCT_TYPE_CAROUSEL_ITEM (mct_carousel_item_get_type ())
G_DECLARE_FINAL_TYPE (MctCarouselItem, mct_carousel_item, MCT, CAROUSEL_ITEM, GtkButton)
G_DECLARE_FINAL_TYPE (MctCarouselItem, mct_carousel_item, MCT, CAROUSEL_ITEM, GtkRadioButton)
#define MCT_TYPE_CAROUSEL (mct_carousel_get_type ())
G_DECLARE_FINAL_TYPE (MctCarousel, mct_carousel, MCT, CAROUSEL, AdwBin)
G_DECLARE_FINAL_TYPE (MctCarousel, mct_carousel, MCT, CAROUSEL, GtkRevealer)
GtkWidget *mct_carousel_item_new (void);
void mct_carousel_item_set_child (MctCarouselItem *self,
GtkWidget *child);
MctCarousel *mct_carousel_new (void);
void mct_carousel_purge_items (MctCarousel *self);
@ -53,10 +49,4 @@ void mct_carousel_select_item (MctCarousel *self,
guint mct_carousel_get_item_count (MctCarousel *self);
void mct_carousel_add (MctCarousel *self,
MctCarouselItem *item);
void mct_carousel_set_revealed (MctCarousel *self,
gboolean revealed);
G_END_DECLS

View file

@ -3,76 +3,100 @@
<!-- Copyright © 2020 Endless, Inc. -->
<interface>
<requires lib="gtk+" version="3.12"/>
<template class="MctCarousel" parent="AdwBin">
<template class="MctCarousel" parent="GtkRevealer">
<property name="transition_duration">400</property>
<property name="reveal-child">True</property>
<child>
<object class="GtkRevealer" id="revealer">
<property name="transition_duration">400</property>
<property name="reveal-child">True</property>
<object class="GtkOverlay">
<property name="visible">True</property>
<property name="hexpand">True</property>
<property name="border_width">16</property>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="transition_duration">400</property>
<property name="transition_type">GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT</property>
<style>
<class name="location-bar"/>
</style>
</object>
</child>
<child type="overlay">
<object class="GtkOverlay">
<property name="hexpand">True</property>
<property name="visible">True</property>
<child>
<object class="GtkStack" id="stack">
<property name="margin-top">16</property>
<property name="margin-bottom">16</property>
<property name="margin-start">16</property>
<property name="margin-end">16</property>
<property name="transition_duration">400</property>
<property name="transition_type">GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT</property>
<style>
<class name="location-bar"/>
</style>
</object>
</child>
<child type="overlay">
<object class="GtkButton" id="go_back_button">
<property name="visible">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="icon_name">go-previous-symbolic</property>
<accessibility>
<property name="label" translatable="yes">Previous Page</property>
</accessibility>
<style>
<class name="circular"/>
</style>
<signal name="clicked" handler="mct_carousel_goto_previous_page" object="MctCarousel" swapped="no"/>
</object>
</child>
<child type="overlay">
<object class="GtkButton" id="go_next_button">
<property name="valign">center</property>
<property name="halign">end</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="hexpand">True</property>
<property name="icon_name">go-next-symbolic</property>
<accessibility>
<property name="label" translatable="yes">Next Page</property>
</accessibility>
<style>
<class name="circular"/>
</style>
<signal name="clicked" handler="mct_carousel_goto_next_page" object="MctCarousel" swapped="no"/>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
<property name="border_width">12</property>
<child>
<object class="GtkButton" id="go_back_button">
<property name="visible">False</property>
<property name="can_focus">True</property>
<property name="valign">center</property>
<style>
<class name="circular"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon-size">4</property>
<property name="icon_name">go-previous-symbolic</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="accessible-name" translatable="yes">Previous Page</property>
</object>
</child>
</object>
</child>
<signal name="clicked" handler="mct_carousel_goto_previous_page" object="MctCarousel" swapped="no"/>
</object>
<packing>
<property name="pack_type">GTK_PACK_START</property>
</packing>
</child>
<child>
<object class="GtkButton" id="go_next_button">
<property name="can_focus">True</property>
<property name="valign">center</property>
<style>
<class name="circular"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon-size">4</property>
<property name="icon_name">go-next-symbolic</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="accessible-name" translatable="yes">Next Page</property>
</object>
</child>
</object>
</child>
<signal name="clicked" handler="mct_carousel_goto_next_page" object="MctCarousel" swapped="no"/>
</object>
<packing>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</object>
</child>
<child type="overlay">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="visible">True</property>
<property name="valign">GTK_ALIGN_END</property>
<style>
<class name="carousel-arrow-container"/>
</style>
<child>
<object class="GtkOverlay">
<property name="visible">True</property>
<child>
<object class="GtkBox" id="arrow">
<property name="visible">True</property>
<property name="halign">GTK_ALIGN_END</property>
<style>
<class name="carousel-arrow"/>
@ -81,6 +105,7 @@
</child>
<child type="overlay">
<object class="GtkBox">
<property name="visible">True</property>
<property name="halign">GTK_ALIGN_END</property>
<style>
<class name="carousel-inner-arrow"/>
@ -90,8 +115,14 @@
</object>
</child>
</object>
<packing>
<property name="pass-through">True</property>
</packing>
</child>
</object>
<packing>
<property name="pass-through">True</property>
</packing>
</child>
</object>
</child>

View file

@ -2,163 +2,297 @@
<!-- Copyright © 2019, 2020 Endless Mobile, Inc. -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="AdwApplicationWindow" id="main_window">
<object class="GtkApplicationWindow" id="main_window">
<property name="default-width">540</property>
<property name="default-height">580</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="header">
<property name="show-close-button">True</property>
<!-- Translators: This is the title of the main window -->
<property name="title" translatable="yes">Parental Controls</property>
<property name="visible">True</property>
<child>
<object class="GtkHeaderBar" id="header">
<property name="show-title-buttons">True</property>
<property name="title-widget">
<object class="AdwWindowTitle">
<!-- Translators: This is the title of the main window -->
<property name="title" translatable="yes">Parental Controls</property>
<object class="GtkMenuButton" id="primary_menu">
<property name="visible">True</property>
<property name="direction">none</property>
<property name="can-focus">True</property>
<property name="use-popover">True</property>
<property name="menu-model">primary-menu</property>
<accelerator key="F10" signal="activate"/>
<style>
<class name="image-button"/>
</style>
</object>
<packing>
<property name="pack-type">end</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkStack" id="main_stack">
<property name="visible">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="border_width">0</property>
<child>
<object class="MctUserSelector" id="user_selector">
<property name="visible">True</property>
<property name="user-manager">user_manager</property>
<property name="show-administrators">False</property>
<accessibility>
<relation target="user_controls" type="controller-for"/>
</accessibility>
</object>
</property>
<child type="end">
<object class="GtkMenuButton" id="primary_menu">
<property name="direction">none</property>
<property name="menu-model">primary-menu</property>
<style>
<class name="image-button"/>
</style>
<packing>
<property name="fill">False</property>
<property name="expand">False</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="hscrollbar-policy">never</property>
<property name="min-content-height">370</property>
<child>
<object class="GtkShortcutController">
<property name="scope">global</property>
<object class="GtkBox">
<property name="margin">18</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<property name="visible">True</property>
<child>
<object class="GtkShortcut">
<property name="trigger">F10</property>
<property name="action">activate</property>
<object class="GtkLabel" id="help_label">
<!-- Content is set in code; this string is just a placeholder -->
<property name="label">Its recommended that restrictions are set as part of an ongoing conversation with $name. Read guidance on what to consider.</property>
<property name="visible">True</property>
<property name="wrap">True</property>
<property name="xalign">0.0</property>
<property name="yalign">0.0</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</child>
<child>
<object class="MctUserControls" id="user_controls">
<property name="halign">center</property>
<property name="visible">True</property>
<property name="dbus-connection">dbus_connection</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
</packing>
</child>
</object>
<packing>
<property name="name">controls</property>
</packing>
</child>
<child>
<object class="GtkStack" id="main_stack">
<child>
<object class="GtkStackPage">
<property name="name">controls</property>
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="MctUserSelector" id="user_selector">
<property name="user-manager">user_manager</property>
<property name="show-administrators">False</property>
<accessibility>
<relation name="controls">user_controls</relation>
</accessibility>
</object>
</child>
<child>
<object class="AdwPreferencesPage">
<child>
<object class="AdwPreferencesGroup">
<child>
<object class="MctUserControls" id="user_controls">
<!-- Content is set in code; this string is just a placeholder -->
<property name="description">Its recommended that restrictions are set as part of an ongoing conversation with $name. Read guidance on what to consider.</property>
<property name="height-request">270</property>
<property name="dbus-connection">dbus_connection</property>
<property name="vexpand">True</property>
</object>
</child>
</object>
</child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child type="center">
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<property name="margin">18</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Permission Required</property>
<attributes>
<attribute name="scale" value="1.4"/>
</attributes>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="name">unlock</property>
<property name="child">
<object class="AdwStatusPage">
<property name="title" translatable="yes">Permission Required</property>
<property name="description" translatable="yes">Permission is required to view and change user parental controls settings.</property>
<property name="icon-name">org.freedesktop.MalcontentControl</property>
<child>
<object class="GtkLockButton" id="lock_button">
<property name="halign">center</property>
<style>
<class name="suggested-action" />
<class name="pill" />
</style>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Permission is required to view and change user parental controls settings.</property>
<property name="wrap">True</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="name">no-other-users</property>
<property name="child">
<object class="AdwStatusPage">
<property name="icon-name">system-users-symbolic</property>
<property name="title" translatable="yes">No Standard User Accounts</property>
<property name="description" translatable="yes">Parental controls can only be applied to standard user
accounts. These can be created in the user settings.</property>
<child>
<object class="GtkButton" id="user_accounts_panel_button">
<property name="label" translatable="yes">_User Settings</property>
<property name="halign">center</property>
<property name="use-underline">True</property>
<style>
<class name="suggested-action"/>
</style>
</object>
</child>
</child>
<child>
<object class="GtkLockButton" id="lock_button">
<property name="visible">True</property>
<property name="halign">center</property>
<property name="can-default">True</property>
<property name="has-default">True</property>
<property name="can-focus">True</property>
<!-- Give 18px spacing between the label and the button -->
<property name="margin-top">6</property>
</object>
</property>
</child>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="name">loading</property>
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child type="center">
<object class="GtkLabel">
<property name="label" translatable="yes">Loading…</property>
<property name="vexpand">True</property>
<style>
<class name="title-1" />
</style>
</object>
</child>
</object>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="name">error</property>
<property name="child">
<object class="AdwStatusPage" id="error_page">
<property name="icon-name">dialog-error-symbolic</property>
</object>
</property>
</object>
</child>
</object>
<packing>
<property name="name">unlock</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child type="center">
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<property name="margin">18</property>
<child>
<object class="GtkImage">
<property name="icon-name">system-users-symbolic</property>
<property name="pixel-size">96</property>
<property name="visible">True</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">No Standard User Accounts</property>
<attributes>
<attribute name="scale" value="1.4"/>
</attributes>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="justify">center</property>
<property name="label" translatable="yes">Parental controls can only be applied to standard user
accounts. These can be created in the user settings.</property>
<property name="wrap">True</property>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton" id="user_accounts_panel_button">
<property name="visible">True</property>
<property name="label" translatable="yes">_User Settings</property>
<property name="halign">center</property>
<property name="can-default">True</property>
<property name="has-default">True</property>
<property name="use-underline">True</property>
<property name="can-focus">True</property>
<!-- Give 18px spacing between the label and the button -->
<property name="margin-top">6</property>
<style>
<class name="suggested-action"/>
</style>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">no-other-users</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child type="center">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Loading…</property>
<attributes>
<attribute name="scale" value="1.4"/>
</attributes>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">static</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">loading</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child type="center">
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="error_title">
<property name="visible">True</property>
<property name="label"></property>
<attributes>
<attribute name="scale" value="1.4"/>
</attributes>
</object>
</child>
<child>
<object class="GtkLabel" id="error_message">
<property name="visible">True</property>
<property name="label"></property>
</object>
</child>
</object>
</child>
<child internal-child="accessible">
<object class="AtkObject">
<property name="AtkObject::accessible-role">alert</property>
</object>
</child>
</object>
<packing>
<property name="name">error</property>
</packing>
</child>
</object>
</child>

View file

@ -27,9 +27,8 @@ malcontent_control = executable('malcontent-control',
dependency('gio-2.0', version: '>= 2.44'),
dependency('glib-2.0', version: '>= 2.54.2'),
dependency('gobject-2.0', version: '>= 2.54'),
gtk_dep,
dependency('gtk+-3.0'),
dependency('polkit-gobject-1'),
libadwaita_dep,
libmalcontent_dep,
libmalcontent_ui_dep,
],
@ -79,12 +78,12 @@ endif
xmllint = find_program('xmllint', required: false)
if xmllint.found()
gtk_prefix = gtk_dep.get_variable(pkgconfig: 'prefix')
gtk_prefix = dependency('gtk+-3.0').get_pkgconfig_variable('prefix')
test(
'validate-ui', xmllint,
args: [
'--nonet', '--noblanks', '--noout',
'--relaxng', join_paths(gtk_prefix, 'share', 'gtk-4.0', 'gtk4builder.rng'),
'--relaxng', join_paths(gtk_prefix, 'share', 'gtk-3.0', 'gtkbuilder.rng'),
files(
'carousel.ui',
'main.ui',

View file

@ -31,8 +31,7 @@
<launchable type="desktop-id">org.freedesktop.MalcontentControl.desktop</launchable>
<url type="homepage">https://gitlab.freedesktop.org/pwithnall/malcontent</url>
<url type="bugtracker">https://gitlab.freedesktop.org/pwithnall/malcontent/issues</url>
<url type="donation">https://www.gnome.org/donate/</url>
<url type="vcs-browser">https://gitlab.freedesktop.org/pwithnall/malcontent</url>
<url type="donation">http://www.gnome.org/friends/</url>
<url type="translate">https://wiki.gnome.org/TranslationProject/LocalisationGuide</url>
<update_contact>philip_at_tecnocode.co.uk</update_contact>
<compulsory_for_desktop>GNOME</compulsory_for_desktop>
@ -45,24 +44,6 @@
</kudos>
<translation type="gettext">malcontent</translation>
<releases>
<release version="0.11.1" date="2023-03-16" type="stable">
<description>
<p>This is a stable release with the following changes:</p>
<ul>
<li>Translation updates</li>
</ul>
</description>
</release>
<release version="0.11.0" date="2022-08-12" type="stable">
<description>
<p>This is a stable release with the following changes:</p>
<ul>
<li>Use libappstream instead of appstream-glib</li>
<li>Port to GTK4</li>
<li>Translation updates</li>
</ul>
</description>
</release>
<release version="0.10.5" date="2022-05-31" type="stable">
<description>
<p>This is a stable release with the following changes:</p>

View file

@ -1,6 +1,5 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright © 2022 Endless Mobile, Inc.
* Copyright © 2015 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
@ -17,11 +16,10 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* - Georges Basile Stavracas Neto <georges@endlessos.org>
* - Ondrej Holy <oholy@redhat.com>
*/
#include <adwaita.h>
#include <gtk/gtk.h>
#include <act/act.h>
#include <sys/stat.h>
@ -30,49 +28,108 @@
struct _MctUserImage
{
AdwBin parent_instance;
AdwAvatar *avatar;
GtkImage parent_instance;
ActUser *user;
};
G_DEFINE_TYPE (MctUserImage, mct_user_image, ADW_TYPE_BIN)
G_DEFINE_TYPE (MctUserImage, mct_user_image, GTK_TYPE_IMAGE)
static GdkTexture *
render_user_icon_texture (ActUser *user)
static GdkPixbuf *
round_image (GdkPixbuf *pixbuf)
{
g_autoptr(GdkTexture) texture = NULL;
g_autoptr(GError) error = NULL;
GdkPixbuf *dest = NULL;
cairo_surface_t *surface;
cairo_t *cr;
gint size;
size = gdk_pixbuf_get_width (pixbuf);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size);
cr = cairo_create (surface);
/* Clip a circle */
cairo_arc (cr, size / 2, size / 2, size / 2, 0, 2 * G_PI);
cairo_clip (cr);
cairo_new_path (cr);
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
cairo_paint (cr);
dest = gdk_pixbuf_get_from_surface (surface, 0, 0, size, size);
cairo_surface_destroy (surface);
cairo_destroy (cr);
return dest;
}
static cairo_surface_t *
render_user_icon (ActUser *user,
gint icon_size,
gint scale)
{
g_autoptr(GdkPixbuf) source_pixbuf = NULL;
GdkPixbuf *pixbuf = NULL;
GError *error;
const gchar *icon_file;
cairo_surface_t *surface = NULL;
g_return_val_if_fail (ACT_IS_USER (user), NULL);
g_return_val_if_fail (icon_size > 12, NULL);
icon_file = act_user_get_icon_file (user);
if (icon_file == NULL)
return NULL;
texture = gdk_texture_new_from_filename (icon_file, &error);
if (error != NULL)
pixbuf = NULL;
if (icon_file)
{
g_warning ("Error loading user icon: %s", error->message);
return NULL;
source_pixbuf = gdk_pixbuf_new_from_file_at_size (icon_file,
icon_size * scale,
icon_size * scale,
NULL);
if (source_pixbuf)
pixbuf = round_image (source_pixbuf);
}
return g_steal_pointer (&texture);
if (pixbuf != NULL)
goto out;
error = NULL;
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
"avatar-default",
icon_size * scale,
GTK_ICON_LOOKUP_FORCE_SIZE,
&error);
if (error)
{
g_warning ("%s", error->message);
g_error_free (error);
}
out:
if (pixbuf != NULL)
{
surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale, NULL);
g_object_unref (pixbuf);
}
return surface;
}
static void
render_image (MctUserImage *image)
{
g_autoptr(GdkTexture) texture = NULL;
cairo_surface_t *surface;
gint scale, pixel_size;
if (image->user == NULL)
return;
texture = render_user_icon_texture (image->user);
adw_avatar_set_custom_image (image->avatar, GDK_PAINTABLE (texture));
adw_avatar_set_text (image->avatar, act_user_get_real_name (image->user));
pixel_size = gtk_image_get_pixel_size (GTK_IMAGE (image));
scale = gtk_widget_get_scale_factor (GTK_WIDGET (image));
surface = render_user_icon (image->user,
pixel_size > 0 ? pixel_size : 48,
scale);
gtk_image_set_from_surface (GTK_IMAGE (image), surface);
cairo_surface_destroy (surface);
}
void
@ -106,8 +163,8 @@ mct_user_image_class_init (MctUserImageClass *class)
static void
mct_user_image_init (MctUserImage *image)
{
image->avatar = ADW_AVATAR (adw_avatar_new (48, NULL, TRUE));
adw_bin_set_child (ADW_BIN (image), GTK_WIDGET (image->avatar));
g_signal_connect_swapped (image, "notify::scale-factor", G_CALLBACK (render_image), image);
g_signal_connect_swapped (image, "notify::pixel-size", G_CALLBACK (render_image), image);
}
GtkWidget *

View file

@ -1,6 +1,5 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright © 2022 Endless Mobile, Inc.
* Copyright © 2015 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
@ -17,20 +16,19 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* - Georges Basile Stavracas Neto <georges@endlessos.org>
* - Ondrej Holy <oholy@redhat.com>
*/
#pragma once
#include <adwaita.h>
#include <gtk/gtk.h>
#include <act/act.h>
G_BEGIN_DECLS
#define MCT_TYPE_USER_IMAGE (mct_user_image_get_type ())
G_DECLARE_FINAL_TYPE (MctUserImage, mct_user_image, MCT, USER_IMAGE, AdwBin)
G_DECLARE_FINAL_TYPE (MctUserImage, mct_user_image, MCT, USER_IMAGE, GtkImage)
GtkWidget *mct_user_image_new (void);
void mct_user_image_set_user (MctUserImage *image,

View file

@ -370,11 +370,11 @@ reload_users (MctUserSelector *self,
g_object_get (settings, "gtk-enable-animations", &animations, NULL);
g_object_set (settings, "gtk-enable-animations", FALSE, NULL);
mct_carousel_purge_items (self->carousel);
list = act_user_manager_list_users (self->user_manager);
g_debug ("Got %u users", g_slist_length (list));
mct_carousel_purge_items (self->carousel);
list = g_slist_sort (list, (GCompareFunc) sort_users);
for (l = list; l; l = l->next)
{
@ -397,7 +397,7 @@ reload_users (MctUserSelector *self,
g_object_set (settings, "gtk-enable-animations", animations, NULL);
mct_carousel_set_revealed (self->carousel, TRUE);
gtk_revealer_set_reveal_child (GTK_REVEALER (self->carousel), TRUE);
}
static GtkWidget *
@ -411,7 +411,7 @@ create_carousel_entry (MctUserSelector *self,
widget = mct_user_image_new ();
mct_user_image_set_user (MCT_USER_IMAGE (widget), user);
gtk_box_append (GTK_BOX (box), widget);
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0);
label = g_strdup_printf ("<b>%s</b>",
get_real_or_user_name (user));
@ -419,7 +419,7 @@ create_carousel_entry (MctUserSelector *self,
gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
gtk_label_set_ellipsize (GTK_LABEL (widget), PANGO_ELLIPSIZE_END);
gtk_widget_set_margin_top (widget, 5);
gtk_box_append (GTK_BOX (box), widget);
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0);
g_free (label);
if (act_user_get_uid (user) == getuid ())
@ -431,7 +431,7 @@ create_carousel_entry (MctUserSelector *self,
gtk_label_set_use_markup (GTK_LABEL (widget), TRUE);
g_free (label);
gtk_box_append (GTK_BOX (box), widget);
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0);
gtk_style_context_add_class (gtk_widget_get_style_context (widget),
"dim-label");
@ -455,10 +455,10 @@ user_added_cb (ActUserManager *user_manager,
widget = create_carousel_entry (self, user);
item = mct_carousel_item_new ();
mct_carousel_item_set_child (MCT_CAROUSEL_ITEM (item), widget);
gtk_container_add (GTK_CONTAINER (item), widget);
g_object_set_data (G_OBJECT (item), "uid", GINT_TO_POINTER (act_user_get_uid (user)));
mct_carousel_add (self->carousel, MCT_CAROUSEL_ITEM (item));
gtk_container_add (GTK_CONTAINER (self->carousel), item);
}
static void

View file

@ -5,6 +5,7 @@
<template class="MctUserSelector" parent="GtkBox">
<child>
<object class="MctCarousel" id="carousel">
<property name="visible">True</property>
<property name="hexpand">True</property>
<signal name="item-activated" handler="carousel_item_activated"/>
</object>

View file

@ -1,6 +1,6 @@
project('malcontent', 'c',
version : '0.12.0',
meson_version : '>= 0.59.0',
version : '0.10.5',
meson_version : '>= 0.50.0',
license: ['LGPL-2.1-or-later', 'GPL-2.0-or-later'],
default_options : [
'buildtype=debugoptimized',
@ -34,12 +34,12 @@ if pamlibdir == ''
endif
dbus = dependency('dbus-1')
dbusinterfacesdir = dbus.get_variable(pkgconfig: 'interfaces_dir',
pkgconfig_define: ['datadir', datadir])
dbusinterfacesdir = dbus.get_pkgconfig_variable('interfaces_dir',
define_variable: ['datadir', datadir])
polkit_gobject = dependency('polkit-gobject-1')
polkitpolicydir = polkit_gobject.get_variable(pkgconfig: 'policydir',
pkgconfig_define: ['prefix', prefix])
polkitpolicydir = polkit_gobject.get_pkgconfig_variable('policydir',
define_variable: ['prefix', prefix])
config_h = configuration_data()
config_h.set_quoted('GETTEXT_PACKAGE', 'malcontent')
@ -134,23 +134,13 @@ else
'Malcontent-' + libmalcontent_api_version + '.typelib']
endif
if get_option('ui').enabled()
gtk_dep = dependency('gtk4', version: '>= 4.6')
libadwaita_dep = dependency(
'libadwaita-1',
version: '>= 1.1',
fallback: ['libadwaita', 'libadwaita_dep'],
default_options: ['examples=false', 'introspection=disabled', 'tests=false', 'vapi=false'],
)
subdir('libmalcontent-ui')
endif
subdir('malcontent-client')
if get_option('ui').enabled()
subdir('malcontent-control')
gnome.post_install(
gtk_update_icon_cache: true,
update_desktop_database: true,
)
endif
subdir('pam')
subdir('po')
meson.add_install_script('build-aux/meson_post_install.py')

View file

@ -23,7 +23,6 @@ hr
hu
id
it
ka
kk
ko
lt

View file

@ -4,6 +4,7 @@ accounts-service/com.endlessm.ParentalControls.policy.in
libmalcontent/app-filter.c
libmalcontent/manager.c
libmalcontent/session-limits.c
libmalcontent-ui/gs-content-rating.c
libmalcontent-ui/restrict-applications-dialog.c
libmalcontent-ui/restrict-applications-dialog.ui
libmalcontent-ui/restrict-applications-selector.c

162
po/cs.po
View file

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2023-10-13 16:18+0000\n"
"PO-Revision-Date: 2023-10-23 23:04+0200\n"
"POT-Creation-Date: 2021-09-18 12:41+0000\n"
"PO-Revision-Date: 2021-10-02 00:36+0200\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
"Language-Team: none\n"
"Language: cs\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 3.0\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
@ -164,36 +164,78 @@ msgstr "Limit sezení pro uživatele %u má nerozpoznaný typ %u"
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr "Limit sezení pro uživatele %u má neplatný denní rozvrh %u%u"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr "%s (%s)"
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr "Obecné"
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr "VŠECHNY"
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr "pouze dospělé"
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr "plnoleté"
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr "mládež"
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr "všechny 10+"
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr "všechny"
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr "malé děti"
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:256
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr "Omezit uživateli %s použití následujících nainstalovaných aplikací."
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "Omezit aplikace"
#: libmalcontent-ui/restrict-applications-dialog.ui:22
msgid "Search for applications…"
msgstr "Hledat aplikace…"
#: libmalcontent-ui/restrict-applications-selector.ui:13
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "Nenalezeny žádné aplikace k omezení."
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:198 libmalcontent-ui/user-controls.c:209
#: libmalcontent-ui/user-controls.c:207 libmalcontent-ui/user-controls.c:218
msgid "unknown"
msgstr "neznámé"
#: libmalcontent-ui/user-controls.c:303 libmalcontent-ui/user-controls.c:388
#: libmalcontent-ui/user-controls.c:641
#: libmalcontent-ui/user-controls.c:312 libmalcontent-ui/user-controls.c:397
#: libmalcontent-ui/user-controls.c:669
msgid "All Ages"
msgstr "libovolný věk"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:470
#: libmalcontent-ui/user-controls.c:477
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
@ -203,48 +245,48 @@ msgstr ""
"obsah může být stále dostupný v jiných aplikacích."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:475
#: libmalcontent-ui/user-controls.c:482
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "Zabraňuje v používání určených aplikací uživatelem %s."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:480
#: libmalcontent-ui/user-controls.c:487
#, c-format
msgid "Prevents %s from installing applications."
msgstr "Zabraňuje uživateli %s v instalaci aplikací."
#: libmalcontent-ui/user-controls.ui:25
#: libmalcontent-ui/user-controls.ui:16
msgid "Application Usage Restrictions"
msgstr "Omezení použití aplikací"
#: libmalcontent-ui/user-controls.ui:28
#: libmalcontent-ui/user-controls.ui:67
msgid "Restrict _Web Browsers"
msgstr "Omezit _webové prohlížeče"
#: libmalcontent-ui/user-controls.ui:51
#: libmalcontent-ui/user-controls.ui:151
msgid "_Restrict Applications"
msgstr "Omezit _aplikace"
#: libmalcontent-ui/user-controls.ui:73
#: libmalcontent-ui/user-controls.ui:230
msgid "Software Installation Restrictions"
msgstr "Omezení instalace softwaru"
#: libmalcontent-ui/user-controls.ui:77
#: libmalcontent-ui/user-controls.ui:280
msgid "Restrict Application _Installation"
msgstr "Omezit _instalaci aplikací"
#: libmalcontent-ui/user-controls.ui:99
#: libmalcontent-ui/user-controls.ui:365
msgid "Application _Suitability"
msgstr "Vhodno_st aplikací"
#: libmalcontent-ui/user-controls.ui:102
#: libmalcontent-ui/user-controls.ui:387
msgid ""
"Restricts the browsing or installation of applications unsuitable for this "
"age or younger."
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
"Omezí prohlížení nebo instalaci aplikací nevhodných pro tento věk nebo "
"mladší."
"Omezí prohlížení nebo instalaci aplikací na aplikace vhodné pro určitý věk "
"nebo výše."
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
@ -256,44 +298,44 @@ msgstr "Uživatel ke zvolení v UI"
msgid "USERNAME"
msgstr "UŽIVATEL"
#: malcontent-control/application.c:116
#: malcontent-control/application.c:115
msgid "— view and edit parental controls"
msgstr "— zobrazit a upravit rodičovskou kontrolu"
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:123 malcontent-control/main.ui:17
#: malcontent-control/application.c:122 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "Rodičovská kontrola"
#: malcontent-control/application.c:309
#: malcontent-control/application.c:308
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "Copyright © 2019, 2020 Endless Mobile, Inc."
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:314
#: malcontent-control/application.c:313
msgid "translator-credits"
msgstr "Daniel Rusek <mail@asciiwolf.com>"
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:320
#: malcontent-control/application.c:319
msgid "Malcontent Website"
msgstr "Webové stránky"
#: malcontent-control/application.c:341
#: malcontent-control/application.c:337
msgid "The help contents could not be displayed"
msgstr "Obsah nápovědy nemohl být zobrazen"
#: malcontent-control/application.c:388
#: malcontent-control/application.c:374
msgid "Failed to load user data from the system"
msgstr "Selhalo načtení uživatelských dat ze systému"
#: malcontent-control/application.c:390
#: malcontent-control/application.c:376
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr "Ověřte prosím, že je AccountsService nainstalováno a povoleno."
@ -306,7 +348,7 @@ msgstr "Ověřte prosím, že je AccountsService nainstalováno a povoleno."
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:421
#: malcontent-control/application.c:407
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
@ -317,29 +359,29 @@ msgstr ""
"konverzace s %s. <a href='https://www.jaknainternet.cz/page/1201/ochrana-"
"deti-na-internetu/'>Přečtěte si návod</a> na to, co je třeba vzít v úvahu."
#: malcontent-control/carousel.ui:38
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "Předchozí stránka"
#: malcontent-control/carousel.ui:57
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "Následující stránka"
#: malcontent-control/main.ui:87
#: malcontent-control/main.ui:115
msgid "Permission Required"
msgstr "Vyžadováno oprávnění"
#: malcontent-control/main.ui:88
#: malcontent-control/main.ui:129
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"Pro zobrazení a změnu rodičovské kontroly uživatele je nutné oprávnění."
#: malcontent-control/main.ui:110
#: malcontent-control/main.ui:184
msgid "No Standard User Accounts"
msgstr "Žádný běžný uživatelský účet"
#: malcontent-control/main.ui:111
#: malcontent-control/main.ui:199
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
@ -347,19 +389,19 @@ msgstr ""
"Rodičovská kontrola může být aplikována pouze na standardní uživatelské\n"
"účty. Ty mohou být vytvořeny v nastavení uživatelů."
#: malcontent-control/main.ui:115
#: malcontent-control/main.ui:212
msgid "_User Settings"
msgstr "Nastavení _uživatelů"
#: malcontent-control/main.ui:138
#: malcontent-control/main.ui:242
msgid "Loading…"
msgstr "Načítá se…"
#: malcontent-control/main.ui:171
#: malcontent-control/main.ui:305
msgid "_Help"
msgstr "_Nápověda"
#: malcontent-control/main.ui:175
#: malcontent-control/main.ui:309
msgid "_About Parental Controls"
msgstr "O _aplikaci Rodičovská kontrola"
@ -384,7 +426,7 @@ msgstr ""
msgid "Main window"
msgstr "Hlavní okno"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:39
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:38
msgid "The GNOME Project"
msgstr "Projekt GNOME"
@ -432,34 +474,6 @@ msgstr "Uživatel %s nemá žádný zbývající čas"
msgid "Error setting time limit on login session: %s"
msgstr "Chyba při nastavení časového limitu na přihlašovací sezení: %s"
#, c-format
#~ msgid "%s (%s)"
#~ msgstr "%s (%s)"
#~ msgid "General"
#~ msgstr "Obecné"
#~ msgid "ALL"
#~ msgstr "VŠECHNY"
#~ msgid "Adults Only"
#~ msgstr "pouze dospělé"
#~ msgid "Mature"
#~ msgstr "plnoleté"
#~ msgid "Teen"
#~ msgstr "mládež"
#~ msgid "Everyone 10+"
#~ msgstr "všechny 10+"
#~ msgid "Everyone"
#~ msgstr "všechny"
#~ msgid "Early Childhood"
#~ msgstr "malé děti"
#~ msgid "No cartoon violence"
#~ msgstr "Žádné kreslené násilí"

664
po/hi.po
View file

@ -1,55 +1,50 @@
# Hindi translations for malcontent package.
# Copyright (C) 2022 THE malcontent'S COPYRIGHT HOLDER
# Copyright (C) 2020 THE malcontent'S COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
# Automatically generated, 2020.
# Will Thompson <wjt@endlessm.com>, 202>, 202>-2022.
# Some of credits are lost, as the translations were pulled from Transifex to upstream, but the project does not exist on Transifex now.
# Hemish <hemish04082005@gmail.com>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2022-07-25 03:26+0000\n"
"PO-Revision-Date: 2022-11-29 13:03+0530\n"
"Last-Translator: Hemish <hemish04082005@gmail.com>\n"
"Language-Team: Hindi <indlinux-hindi@lists.sourceforge.net https://indlinux."
"org/hindi>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-10 12:08+0100\n"
"PO-Revision-Date: 2020-04-17 21:58+0000\n"
"Last-Translator: Will Thompson <wjt@endlessm.com>, 2020\n"
"Language-Team: Hindi (https://www.transifex.com/endless-os/teams/9016/hi/)\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Gtranslator 42.0\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
msgstr "स्वयं के ऐप फ़िल्टर बदलें"
msgstr "अपना खुद का ऐप फ़िल्टर बदलें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:5
msgid "Authentication is required to change your app filter."
msgstr "स्वयं के ऐप फिल्टर को बदलने के लिए सत्यापन की आवश्यकता है।"
msgstr "आपके ऐप फिल्टर को बदलने के लिए सत्यापन की आवश्यकता है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:14
msgid "Read your own app filter"
msgstr "स्वयं के ऐप फिल्टर पढ़ें"
msgstr "अपना खुद का ऐप फिल्टर पढ़ें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:15
msgid "Authentication is required to read your app filter."
msgstr "स्वयं के एप फ़िल्टर को पढ़ने के लिए प्रमाणीकरण आवश्यक है।"
msgstr "आपके एप फ़िल्टर को पढ़ने के लिए प्रमाणीकरण आवश्यक है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:24
msgid "Change another users app filter"
msgstr "किसी अन्य उपयोगकर्ता के ऐप फ़िल्टर बदलें"
msgstr "अन्य उपयोगकर्ता का ऐप फ़िल्टर बदलें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:25
msgid "Authentication is required to change another users app filter."
msgstr "किसी अन्य उपयोगकर्ता के ऐप फ़िल्टर को बदलने के लिए प्रमाणीकरण की आवश्यकता है।"
msgstr ""
"किसी अन्य उपयोगकर्ता के ऐप फ़िल्टर को बदलने के लिए प्रमाणीकरण की आवश्यकता होती है"
#: accounts-service/com.endlessm.ParentalControls.policy.in:34
msgid "Read another users app filter"
msgstr "किसी अन्य उपयोगकर्ता के ऐप फ़िल्टर पढ़ें"
msgstr "अन्य उपयोगकर्ता का ऐप फ़िल्टर पढ़ें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:35
msgid "Authentication is required to read another users app filter."
@ -57,19 +52,19 @@ msgstr "किसी अन्य उपयोगकर्ता के ऐप
#: accounts-service/com.endlessm.ParentalControls.policy.in:44
msgid "Change your own session limits"
msgstr "स्वयं की सत्र सीमा को बदलें"
msgstr "अपने स्वयं के सेशन की सीमा को बदलें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:45
msgid "Authentication is required to change your session limits."
msgstr "स्वयं की सत्र सीमा को बदलने के लिए सत्यापन की आवश्यकता है।"
msgstr "आपके सत्र की सीमा को बदलने के लिए सत्यापन की आवश्यकता है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:54
msgid "Read your own session limits"
msgstr "स्वयं की सत्र सीमा को पढ़ें"
msgstr "अपने स्वयं के सेशन की सीमा को पढ़ें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:55
msgid "Authentication is required to read your session limits."
msgstr "स्वयं की सत्र सीमा को पढ़ने के लिए सत्यापन की आवश्यकता है।"
msgstr "आपके सत्र की सीमा को पढ़ने के लिए सत्यापन की आवश्यकता है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:64
msgid "Change another users session limits"
@ -77,7 +72,7 @@ msgstr "किसी अन्य उपयोगकर्ता की सत
#: accounts-service/com.endlessm.ParentalControls.policy.in:65
msgid "Authentication is required to change another users session limits."
msgstr "किसी अन्य उपयोगकर्ता की सत्र सीमाओं को बदलने के लिए प्रमाणीकरण आवश्यक है"
msgstr "उपयोगकर्ता की सत्र सीमाओं को बदलने के लिए प्रमाणीकरण आवश्यक है"
#: accounts-service/com.endlessm.ParentalControls.policy.in:74
msgid "Read another users session limits"
@ -89,19 +84,19 @@ msgstr "किसी अन्य उपयोगकर्ता की से
#: accounts-service/com.endlessm.ParentalControls.policy.in:84
msgid "Change your own account info"
msgstr "स्वयं के खाते की जानकारी बदलें"
msgstr "अपनी खुद की खाता जानकारी बदलें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:85
msgid "Authentication is required to change your account info."
msgstr "स्वयं के खाते की जानकारी बदलने के लिए प्रमाणीकरण आवश्यक है।"
msgstr "आपके खाते की जानकारी बदलने के लिए प्रमाणीकरण आवश्यक है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:94
msgid "Read your own account info"
msgstr "स्वयं के खाते की जानकारी पढ़ें"
msgstr "अपने स्वयं के खाते की जानकारी पढ़ें"
#: accounts-service/com.endlessm.ParentalControls.policy.in:95
msgid "Authentication is required to read your account info."
msgstr "स्वयं के खाते की जानकारी पढ़ने के लिए सत्यापन आवश्यक है।"
msgstr "आपके खाते की जानकारी पढ़ने के लिए सत्यापन आवश्यक है।"
#: accounts-service/com.endlessm.ParentalControls.policy.in:104
msgid "Change another users account info"
@ -117,82 +112,128 @@ msgstr "अन्य उपयोगकर्ता के खाते की
#: accounts-service/com.endlessm.ParentalControls.policy.in:115
msgid "Authentication is required to read another users account info."
msgstr "किसी अन्य उपयोगकर्ता के खाते की जानकारी को पढ़ने के लिए प्रमाणीकरण आवश्यक है।"
msgstr "उपयोगकर्ता के खाते की जानकारी को पढ़ने के लिए प्रमाणीकरण आवश्यक है।"
#: libmalcontent/app-filter.c:694
#, c-format
msgid "App filter for user %u was in an unrecognized format"
msgstr "उपयोगकर्ता %u के लिए एप फ़िल्टर एक अपरिचित प्रारूप में था"
msgstr "उपयोगकर्ता %u के लिए एप फ़िल्टर एक अपरिचित प्रारूप में था"
#: libmalcontent/app-filter.c:725
#, c-format
msgid "OARS filter for user %u has an unrecognized kind %s"
msgstr "उपयोगकर्ता %u के लिए OARS फ़िल्टर के पास एक अपरिचित प्रकार %s है।"
msgstr "उपयोगकर्ता %u के लिए OARS फ़िल्टर के पास एक अपरिचित प्रकार का '%s' है। "
#: libmalcontent/manager.c:283 libmalcontent/manager.c:420
#: libmalcontent/manager.c:803
#: libmalcontent/manager.c:283 libmalcontent/manager.c:412
#, c-format
msgid "Not allowed to query parental controls data for user %u"
msgid "Not allowed to query app filter data for user %u"
msgstr "उपयोगकर्ता %u के लिए ऐप फ़िल्टर डेटा को क्वेरी करने की अनुमति नहीं है"
#: libmalcontent/manager.c:288
#, c-format
msgid "User %u does not exist"
msgstr "उपयोगकर्ता %u मौजूद नहीं है"
msgstr "उपयोगकर्ता %u मौजूद नहीं है"
#: libmalcontent/manager.c:296
msgid "System accounts service not available"
msgstr "सिस्टम खाता सेवा (AccountsService) उपलब्ध नहीं है।"
#: libmalcontent/manager.c:402
#: libmalcontent/manager.c:394
msgid "App filtering is globally disabled"
msgstr "ऐप फ़िल्टरिंग सार्वभौमिक स्तर पर निष्क्रिय है"
msgstr "ऐप फ़िल्टरिंग सार्वभौमिक स्तर पर निष्क्रिय है"
#: libmalcontent/manager.c:785
#: libmalcontent/manager.c:777
msgid "Session limits are globally disabled"
msgstr "सत्र सीमाएँ सार्वभौमिक स्तर पर निष्क्रिय हैं।"
msgstr "सेशन की सीमा सार्वभौमिक स्तर पर निष्क्रिय है"
#: libmalcontent/manager.c:795
#, c-format
msgid "Not allowed to query session limits data for user %u"
msgstr "उपयोगकर्ता %u के लिए डेटा सत्र सीमा की क्वेरी करने की अनुमति नहीं है"
#: libmalcontent/session-limits.c:306
#, c-format
msgid "Session limit for user %u was in an unrecognized format"
msgstr "उपयोगकर्ता %u के लिए सत्र सीमा एक अपरिचित प्रारूप में थी।"
msgstr "उपयोगकर्ता %u के लिए सत्र सीमा एक अपरिचित प्रारूप में थी"
#: libmalcontent/session-limits.c:328
#, c-format
msgid "Session limit for user %u has an unrecognized type %u"
msgstr "उपयोगकर्ता %u के लिए सत्र सीमा एक अपरिचित प्रकार %u की है।"
msgstr "उपयोगकर्ता %u के लिए सत्र सीमा एक अपरिचित प्रकार की है '%u'"
#: libmalcontent/session-limits.c:346
#, c-format
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr "उपयोगकर्ता %u के सत्र सीमा में अमान्य दैनिक शेड्यूल %u-%u है"
msgstr "उपयोगकर्ता %u के सेशन सीमा में अमान्य दैनिक शेड्यूल %u-%u है"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr ""
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:223
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr "निम्न इंस्टाल हुई एप्लिकेशन के उपयोग से %s को प्रतिबंधित करें।"
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "एप्लीकेशन को प्रतिबंधित करें"
#: libmalcontent-ui/restrict-applications-selector.ui:13
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "प्रतिबंधित करने के लिए कोई भी एप्लिकेशन नहीं मिली।"
msgstr "प्रतिबंधित करने के लिए कोई भी एप्लिकेशन नहीं मिल।"
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:198 libmalcontent-ui/user-controls.c:209
#: libmalcontent-ui/user-controls.c:242 libmalcontent-ui/user-controls.c:253
msgid "unknown"
msgstr "अज्ञात"
#: libmalcontent-ui/user-controls.c:303 libmalcontent-ui/user-controls.c:388
#: libmalcontent-ui/user-controls.c:641
#: libmalcontent-ui/user-controls.c:338 libmalcontent-ui/user-controls.c:425
#: libmalcontent-ui/user-controls.c:711
msgid "All Ages"
msgstr "सभी आयु"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:470
#: libmalcontent-ui/user-controls.c:514
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
@ -202,177 +243,146 @@ msgstr ""
"हो सकती है।"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:475
#: libmalcontent-ui/user-controls.c:519
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "%s को विशिष्ट एप्लीकेशन का उपयोग करने से रोकता है।"
msgstr "%s को विशिष्ट एप्लीकेशन का उपयोग करने से रोकें।"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:480
#: libmalcontent-ui/user-controls.c:524
#, c-format
msgid "Prevents %s from installing applications."
msgstr " %s को एप्लिकेशन इंस्टॉल करने से रोकता है।"
#: libmalcontent-ui/user-controls.ui:25
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:529
#, c-format
msgid "Applications installed by %s will not appear for other users."
msgstr "%s द्वारा इंस्टॉल किए गए एप्लिकेशन अन्य उपयोगकर्ताओं के लिए उपलब्ध नहीं होंगे।"
#: libmalcontent-ui/user-controls.ui:17
msgid "Application Usage Restrictions"
msgstr "एप्लीकेशन उपयोग पर प्रतिबंध"
msgstr "एप्लीकेशन उपयोग के प्रतिबंध"
#: libmalcontent-ui/user-controls.ui:28
#: libmalcontent-ui/user-controls.ui:68
msgid "Restrict _Web Browsers"
msgstr "वेब ब्राउज़रों को प्रतिबंधित करें (_W)"
msgstr "_वेब ब्राउज़रों को प्रतिबंधित करें"
#: libmalcontent-ui/user-controls.ui:50
#: libmalcontent-ui/user-controls.ui:152
msgid "_Restrict Applications"
msgstr "एप्लीकेशन प्रतिबंधित करें (_R)"
msgstr "_एप्लीकेशन प्रतिबंधित करें"
#: libmalcontent-ui/user-controls.ui:72
#: libmalcontent-ui/user-controls.ui:231
msgid "Software Installation Restrictions"
msgstr "साफ्टवेयर इंस्टालेशन पर प्रतिबंध"
msgstr "साफ्टवेयर इंस्टालेशन का प्रतिबंध"
#: libmalcontent-ui/user-controls.ui:76
#: libmalcontent-ui/user-controls.ui:281
msgid "Restrict Application _Installation"
msgstr "एप्लीकेशन के इंस्टालेशन को रोकें (_I)"
msgstr "एप्लीकेशन इंस्टालेशन को रोकें"
#: libmalcontent-ui/user-controls.ui:97
#: libmalcontent-ui/user-controls.ui:366
msgid "Restrict Application Installation for _Others"
msgstr "_अन्य लोगों को एप्लिकेशन इंस्टॉलेशन करने से रोकें"
#: libmalcontent-ui/user-controls.ui:451
msgid "Application _Suitability"
msgstr "एप्लीकेशन की उपयुक्तता (_S)"
msgstr "एप्लीकेशन की उपयुक्तता"
#: libmalcontent-ui/user-controls.ui:100
#: libmalcontent-ui/user-controls.ui:473
msgid ""
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
"विशिष्ट उम्र या उससे ऊपर के लोगों के लिए उपयुक्त एप्लिकेशन इंस्टाल या ब्राउज़िंग को "
"प्रतिबंधित करता है।"
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
msgid "User to select in the UI"
msgstr "UI में जो उपयोगकर्ता चुना जाना चाहिए"
# This is a place holder for command line field, thus left as such.
#. Translators: This is a placeholder for a command line argument value:
#: malcontent-control/application.c:104
msgid "USERNAME"
msgstr "USERNAME"
#: malcontent-control/application.c:116
msgid "— view and edit parental controls"
msgstr "— पैरेंटल कंट्रोल को देखें व उनका प्रबंधन करें"
"ख़ास उम्र या उससे ऊपर के लोगों के लिए उपयुक्त एप्लिकेशन इंस्टाल या ब्राउज़िंग को प्रतिबंधित "
"करता है।"
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:123 malcontent-control/main.ui:17
#: malcontent-control/application.c:105 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "पैरेंटल कंट्रोल "
#: malcontent-control/application.c:309
#: malcontent-control/application.c:270
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "कॉपीराइट © 2019, 2020 Endless Mobile, Inc."
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:314
#: malcontent-control/application.c:275
msgid "translator-credits"
msgstr ""
"Hemish <hemish04082005@gmail.com>\n"
"https://www.transifex.com/endless-os/teams/9016/hi/"
# 'Malcontent' is a brand name, so to clarify for Hindi audience, it is put in inverted commas
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:320
#: malcontent-control/application.c:281
msgid "Malcontent Website"
msgstr "'Malcontent' की वेबसाइट"
msgstr "अनुचित सामग्री युक्त वेबसाइट"
#: malcontent-control/application.c:341
#: malcontent-control/application.c:299
msgid "The help contents could not be displayed"
msgstr "सहायता सामग्री प्रदर्शित नहीं की जा सकी"
#: malcontent-control/application.c:388
#: malcontent-control/application.c:336
msgid "Failed to load user data from the system"
msgstr "सिस्टम से उपयोगकर्ता डेटा को लोड करने में असक्षम"
msgstr "सिस्टम से यूजर डेटा को लोड करने में असक्षम"
#: malcontent-control/application.c:390
#: malcontent-control/application.c:338
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr "कृपया सुनिश्चित करें कि AccountsService इनस्टॉल है और सक्रिय है।"
msgstr "कृपया सुनिश्चित करें कि खातासर्विस इनस्टॉल है और सक्रीय है।"
# A google-translated link of commonsensemedia.org has been provided, as the language is not available at the site, and any good localised guide does not exist.
#. Translators: Replace the link to commonsensemedia.org with some
#. * localised guidance for parents/carers on how to set restrictions on
#. * their child/caree in a responsible way which is in keeping with the
#. * best practice and culture of the region. If no suitable localised
#. * guidance exists, and if the default commonsensemedia.org link is not
#. * suitable, please file an issue against malcontent so we can discuss
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:421
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
"conversation with %s. <a href='https://www.commonsensemedia.org/privacy-and-"
"internet-safety'>Read guidance</a> on what to consider."
msgstr ""
"यह सलाह दी जाती है कि प्रतिबंध %s से बातचीत के हिस्से हैं। कृपया <a href='https://www-"
"commonsensemedia-org.translate.goog/articles/online-safety?"
"_x_tr_sl=auto&_x_tr_tl=hi'>गाइड को पढें </a> व जानें कि क्या-क्या चीज़ों पर ध्यान "
"रखना चाहिए।"
#: malcontent-control/carousel.ui:38
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "पिछला पृष्ठ"
msgstr "पिछला पेज"
#: malcontent-control/carousel.ui:57
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "अगला पृष्ठ"
msgstr "अगला पेज"
#: malcontent-control/main.ui:87
#: malcontent-control/main.ui:93
msgid "Permission Required"
msgstr "अनुमति आवश्यक है"
#: malcontent-control/main.ui:88
#: malcontent-control/main.ui:107
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"उपयोगकर्ता पैरेंटल नियंत्रण की सेटिंग्स को देखने और बदलने के लिए अनुमति की आवश्यकता है।"
msgstr "यूजर पैरेंटल नियंत्रण की सेटिंग्स को देखने और बदलने के लिए अनुमति की आवश्यकता है।"
#: malcontent-control/main.ui:110
msgid "No Standard User Accounts"
msgstr "कोई साधारण उपयोगकर्ता खाता नहीं पाया गया"
#: malcontent-control/main.ui:148
msgid "No Child Users Configured"
msgstr "कोई चाइल्ड यूजर कॉन्फिगर नहीं किया गया"
#: malcontent-control/main.ui:111
#: malcontent-control/main.ui:162
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
"No child users are currently set up on the system. Create one before setting "
"up their parental controls."
msgstr ""
"उपयोगकर्ता प्रतिबंध का नियंत्रण केवल सामान्य उपयोगकर्ता खातों पर लागू किया\n"
"जा सकता है। इन्हें उपयोगकर्ता सेटिंग्स में प्रबंधित किया जा सकता है।"
"वर्तमान में कोई भी बच्चा उपयोगकर्ता सिस्टम पर सेट नहीं है। उनके पैरेंटल कंट्रोल स्थापित करने "
"से पहले एक निर्मित करें।"
#: malcontent-control/main.ui:115
msgid "_User Settings"
msgstr "उपयोगकर्ता सेटिंग्स"
#: malcontent-control/main.ui:174
msgid "Create _Child User"
msgstr "चाइल्ड यूजर बनायें"
#: malcontent-control/main.ui:138
#: malcontent-control/main.ui:202
msgid "Loading…"
msgstr "लोड हो रहा है…"
#: malcontent-control/main.ui:171
#: malcontent-control/main.ui:265
msgid "_Help"
msgstr "सहायता (_H)"
msgstr "_सहायता"
#: malcontent-control/main.ui:175
#: malcontent-control/main.ui:269
msgid "_About Parental Controls"
msgstr "'पैरेंटल कंट्रोल' का परिचय (_A)"
msgstr "_पैरेंटल कंट्रोल के बारे में"
#. Translators: the brief summary of the application as it appears in a software center.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:12
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:4
msgid "Set parental controls and monitor usage by users"
msgstr "पैरेंटल नियंत्रण सेट करें और उपयोगकर्ता द्वारा प्रयोग को मॉनीटर करें"
msgstr "पैरेंटल नियंत्रण सेट करें और यूजर द्वारा प्रयोग को मॉनीटर करें"
#. Translators: These are the application description paragraphs in the AppData file.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:16
@ -382,26 +392,63 @@ msgid ""
"software they can run."
msgstr ""
"उपयोगकर्ताओं के पैरेंटल कंट्रोल प्रतिबंधों को प्रबंधित करें, यह नियंत्रित करते हुए कि वे कितने "
"समय तक कंप्यूटर का उपयोग कर सकते हैं, वे कौन स सॉफ़्टवेयर इंस्टाल कर सकते हैं और कौन से "
"समय तक कंप्यूटर का उपयोग कर सकते हैं, वे कौन स सॉफ़्टवेयर इंस्टाल कर सकते हैं और कौन से "
"इंस्टाल हो चुके सॉफ़्टवेयर चला सकते हैं।"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:25
msgid "Main window"
msgstr "मुख्य विंडो"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:39
msgid "The GNOME Project"
msgstr "दी गनोम प्रॉजेक्ट"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:50
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:59
msgid "Minor improvements to parental controls application UI"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:51
msgid "Add a user manual"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:52
msgid "Translation updates"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:60
msgid "Translations to Ukrainian and Polish"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:67
msgid "Improve parental controls application UI and add icon"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:68
msgid "Support for indicating which accounts are parent accounts"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:75
msgid "Initial release of basic parental controls application"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:76
msgid "Support for setting app installation and run restrictions on users"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:83
msgid "Maintenance release of underlying parental controls library"
msgstr ""
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:7
msgid "org.freedesktop.MalcontentControl"
msgstr ""
#. Translators: Search terms to find this application. Do NOT translate or localise the semicolons! The list MUST also end with a semicolon!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:14
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:13
msgid ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
msgstr ""
"अभिभावक नियंत्रण; स्क्रीन समय; ऐप प्रतिबंध; वेब ब्राउज़र पर प्रतिबंध; ऑर्स; उपयोग; उपयोग "
"की सीमा; बच्चा;parental controls;screen time;app restrictions;web browser "
"restrictions;oars;usage;usage limit;kid;child;"
"की सीमा; बच्चा;"
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:9
msgid "Manage parental controls"
@ -409,7 +456,7 @@ msgstr "पैरेंटल कंट्रोल का प्रबंधन
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:10
msgid "Authentication is required to read and change user parental controls"
msgstr "उपयोगकर्ता प्रतिबंध व नियंत्रणों को पढ़ने और बदलने के लिए सत्यापन आवश्यक है"
msgstr "उपयोगकर्ता अभिभावक नियंत्रणों को पढ़ने और बदलने के लिए सत्यापन आवश्यक है"
#: malcontent-control/user-selector.c:426
msgid "Your account"
@ -420,20 +467,315 @@ msgstr "आपका खाता"
#: pam/pam_malcontent.c:142 pam/pam_malcontent.c:188
#, c-format
msgid "User %s has no time limits enabled"
msgstr "उपयोगकर्ता '%s' के लिए कोई समय सीमा सक्रिय नहीं है।"
msgstr "उपयोगकर्ता '%s' की कोई समय सीमा सक्षम नहीं है"
#: pam/pam_malcontent.c:151 pam/pam_malcontent.c:172
#, c-format
msgid "Error getting session limits for user %s: %s"
msgstr "उपयोगकर्ता %s के लिए सेशन सत्र की सीमाएँ प्राप्त करने में समस्या हुई: %s"
msgstr "उपयोगकर्ता %s: %s के लिए सेशन सीमा प्राप्त करने में समस्या हुई है"
#: pam/pam_malcontent.c:182
#, c-format
msgid "User %s has no time remaining"
msgstr "उपयोगकर्ता %s के पास समय नहीं बचा है"
msgstr "उपयोगकर्ता %s के पास समय नहीं बचा है"
#: pam/pam_malcontent.c:200
#, c-format
msgid "Error setting time limit on login session: %s"
msgstr "%s के लॉगिन सत्र पर समय सीमा सेट करने में त्रुटि हुई"
msgstr "%s के लॉगिन सेशन पर समय सीमा सेट करने में समस्या हुई है"
#~ msgid "No cartoon violence"
#~ msgstr "कोई कार्टून हिंसा नहीं"
#~ msgid "Cartoon characters in unsafe situations"
#~ msgstr "असुरक्षित परिस्थितियों में कार्टून कैरेक्टर"
#~ msgid "Cartoon characters in aggressive conflict"
#~ msgstr "आक्रामक विरोध में कार्टून कैरेक्टर"
#~ msgid "Graphic violence involving cartoon characters"
#~ msgstr "कार्टून कैरेक्टर में शामिल ग्राफ़िक हिंसा"
#~ msgid "No fantasy violence"
#~ msgstr "कोई काल्पनिक हिंसा नहीं"
#~ msgid "Characters in unsafe situations easily distinguishable from reality"
#~ msgstr "असुरक्षित परिस्थितियों वाले कैरेक्टर को रिएलिटी से आसानी से अलग होने योग्य है"
#~ msgid ""
#~ "Characters in aggressive conflict easily distinguishable from reality"
#~ msgstr "आक्रामक विरोध वाले कैरेक्टर को रिएलिटी से आसानी से अलग होने योग्य है"
#~ msgid "Graphic violence easily distinguishable from reality"
#~ msgstr "ग्राफ़िक हिंसा रिएलिटी से आसानी से अलग होने योग्य है"
#~ msgid "No realistic violence"
#~ msgstr "कोई यथार्थवादी हिंसा नहीं"
#~ msgid "Mildly realistic characters in unsafe situations"
#~ msgstr "असुरक्षित परिस्थितियों में थोड़े यथार्थवादी चरित्र"
#~ msgid "Depictions of realistic characters in aggressive conflict"
#~ msgstr "आक्रामक विरोध में वास्तविक कैरेक्टर का विवरण"
#~ msgid "Graphic violence involving realistic characters"
#~ msgstr "ग्राफ़िक हिंसा वाले वास्तविक कैरेक्टर"
#~ msgid "No bloodshed"
#~ msgstr "कोई रक्तपात नहीं"
#~ msgid "Unrealistic bloodshed"
#~ msgstr "अवास्तविक रक्तपात"
#~ msgid "Realistic bloodshed"
#~ msgstr "वास्तविक रक्तपात"
#~ msgid "Depictions of bloodshed and the mutilation of body parts"
#~ msgstr "रक्तपात और शरीर के अंगों में विकृति का विवरण"
#~ msgid "No sexual violence"
#~ msgstr "कोई यौन हिंसा नहीं"
#~ msgid "Rape or other violent sexual behavior"
#~ msgstr "बलात्कार या अन्य हिंसात्मक लैंगिक व्यवहार"
#~ msgid "No references to alcohol"
#~ msgstr "एल्कोहल के कोई संदर्भ नहीं"
#~ msgid "References to alcoholic beverages"
#~ msgstr "एल्कोहल वाले पेय पदार्थों का संदर्भ"
#~ msgid "Use of alcoholic beverages"
#~ msgstr "एल्कोहल वाले पेयपदार्थों का उपयोग"
#~ msgid "No references to illicit drugs"
#~ msgstr "अवैध नशीली दवाओं के कोई संदर्भ नहीं"
#~ msgid "References to illicit drugs"
#~ msgstr "अवैध ड्रग का संदर्भ"
#~ msgid "Use of illicit drugs"
#~ msgstr "अवैध ड्रग का उपयोग"
#~ msgid "References to tobacco products"
#~ msgstr "तंबाकू के उत्पादों का संदर्भ"
#~ msgid "Use of tobacco products"
#~ msgstr "तंबाकू के उत्पादों का उपयोग"
#~ msgid "No nudity of any sort"
#~ msgstr "किसी प्रकार की कोई नग्नता नहीं"
#~ msgid "Brief artistic nudity"
#~ msgstr "संक्षिप्त कलात्मक नग्नता"
#~ msgid "Prolonged nudity"
#~ msgstr "लंबे समय तक नग्नता"
#~ msgid "No references or depictions of sexual nature"
#~ msgstr "यौन प्रकृति के कोई संदर्भ या चित्रण नहीं"
#~ msgid "Provocative references or depictions"
#~ msgstr "उत्तेजक संदर्भ या विवरण"
#~ msgid "Sexual references or depictions"
#~ msgstr "लैंगिक संदर्भ या विवरण"
#~ msgid "Graphic sexual behavior"
#~ msgstr "ग्राफ़िक लैंगिक व्यवहार"
#~ msgid "No profanity of any kind"
#~ msgstr "किसी प्रकार की कोई गाली नहीं"
#~ msgid "Mild or infrequent use of profanity"
#~ msgstr "गलत आचरण का माइल्ड या कभी कभी उपयोग"
#~ msgid "Moderate use of profanity"
#~ msgstr "गलत आचरण का मॉडरेट उपयोग"
#~ msgid "Strong or frequent use of profanity"
#~ msgstr "गलत आचरण का अधिक या बार-बार उपयोग"
#~ msgid "No inappropriate humor"
#~ msgstr "कोई अनुचित हास्य नहीं"
#~ msgid "Slapstick humor"
#~ msgstr "हँसी मज़ाक"
#~ msgid "Vulgar or bathroom humor"
#~ msgstr "अश्लील या बाथरुम संबंधी हास्य"
#~ msgid "Mature or sexual humor"
#~ msgstr "वयस्क या लिंग संबंधी हास्य"
#~ msgid "No discriminatory language of any kind"
#~ msgstr "किसी प्रकार की कोई भेदभावपूर्ण भाषा नहीं"
#~ msgid "Negativity towards a specific group of people"
#~ msgstr "लोगों के किसी विशेष समूह के लिए नकारात्मकता"
#~ msgid "Discrimination designed to cause emotional harm"
#~ msgstr "भावनात्मक नुकसान पहुँचाने के लिए निर्मित भेदभाव"
#~ msgid "Explicit discrimination based on gender, sexuality, race or religion"
#~ msgstr "लिंग, लिंग संबंध, जाति या धर्म के आधार पर सुस्पष्ट भेदभाव"
#~ msgid "No advertising of any kind"
#~ msgstr "किसी प्रकार का कोई विज्ञापन नहीं"
#~ msgid "Product placement"
#~ msgstr "उत्पाद का प्रतिस्थापन"
#~ msgid "Explicit references to specific brands or trademarked products"
#~ msgstr "विशेष ब्रांड या ट्रेडमार्क उत्पादों के लिए सुस्पष्ट संदर्भ"
#~ msgid "Users are encouraged to purchase specific real-world items"
#~ msgstr ""
#~ "उपयोगकर्ताओं को वास्तविक दुनिया के विशिष्ट सामानों को खरीदने के लिए प्रोत्साहित किया "
#~ "जाता है"
#~ msgid "No gambling of any kind"
#~ msgstr "किसी प्रकार का कोई जुआ नहीं"
#~ msgid "Gambling on random events using tokens or credits"
#~ msgstr "टोकन या क्रेडिट का उपयोग करके जुआं या निरुदेश्य ईवेंट"
#~ msgid "Gambling using “play” money"
#~ msgstr "\"प्ले\" धन का उपयोग करके जुआ"
#~ msgid "Gambling using real money"
#~ msgstr "वास्तविक धन का उपयोग जुआ"
#~ msgid "No ability to spend money"
#~ msgstr "धन व्यय करने की कोई क्षमता नहीं"
#~ msgid "Users are encouraged to donate real money"
#~ msgstr "उपयोगकर्ताओं को वास्तविक धन दान करने के लिए प्रोत्साहित किया जाता है"
#~ msgid "Ability to spend real money in-game"
#~ msgstr "गेम में वास्तविक धन व्यय करने की क्षमता"
#~ msgid "No way to chat with other users"
#~ msgstr "अन्य उपयोगकर्ताओं के साथ चैट करने का कोई तरीका नहीं है"
#~ msgid "User-to-user game interactions without chat functionality"
#~ msgstr "चैट कार्यात्मकता के बिना उपयोगकर्ता-से-उपयोगकर्ता गेम संवाद"
#~ msgid "Moderated chat functionality between users"
#~ msgstr "उपयोगकर्ताओं के मध्य मॉडरेटेड चैट कार्यक्षमता"
#~ msgid "Uncontrolled chat functionality between users"
#~ msgstr "उपयोगकर्ताओं के मध्य अनियंत्रित चैट कार्यक्षमता"
#~ msgid "No way to talk with other users"
#~ msgstr "यह अन्य उपयोगकर्ताओं के साथ बात करने का कोई तरीका नहीं"
#~ msgid "Uncontrolled audio or video chat functionality between users"
#~ msgstr "उपयोगकर्ताओं के बीच अनियंत्रित ऑडियो और वीडियो चैट कार्यात्मकता"
#~ msgid "No sharing of social network usernames or email addresses"
#~ msgstr "सामाजिक नेटवर्क उपयोगकर्ता नामों या ईमेल पतों का कोई साझाकरण नहीं"
#~ msgid "Sharing social network usernames or email addresses"
#~ msgstr "सामाजिक नेटवर्क उपयोगकर्ता नाम या ईमेल पतों का साझाकरण"
#~ msgid "No sharing of user information with 3rd parties"
#~ msgstr "तृतीय पक्षों के साथ उपयोगकर्ता जानकारी का कोई साझाकरण नहीं"
#~ msgid "Checking for the latest application version"
#~ msgstr "नवीनतम एप्लिकेशन संस्करण के लिए जांच की जा रही है"
#~ msgid "Sharing diagnostic data that does not let others identify the user"
#~ msgstr ""
#~ "डाइग्नोस्टिक डेटा शेयर करना जो दूसरों को उपयोगकर्ता की पहचान करने की अनुमति नहीं "
#~ "देता है"
#~ msgid "Sharing information that lets others identify the user"
#~ msgstr "वह जानकारी शेयर करें जिससे अन्य लोग उपयोगकर्ता को पहचान सकें"
#~ msgid "No sharing of physical location to other users"
#~ msgstr "अन्य उपयोगकर्ताओं के साथ भौतिक स्थान का कोई साझाकरण नहीं"
#~ msgid "Sharing physical location to other users"
#~ msgstr "अन्य उपयोगकर्ताओं के साथ भौतिक स्थान साझा करना"
#~ msgid "No references to homosexuality"
#~ msgstr "समलैंगिकता का कोई संदर्भ नहीं"
#~ msgid "Indirect references to homosexuality"
#~ msgstr "समलैंगिकता का परोक्ष संदर्भ"
#~ msgid "Kissing between people of the same gender"
#~ msgstr "एक ही लिंग के लोगों के बीच चुंबन"
#~ msgid "Graphic sexual behavior between people of the same gender"
#~ msgstr "एक ही लिंग के लोगों के बीच ग्राफिक यौन व्यवहार"
#~ msgid "No references to prostitution"
#~ msgstr "वेश्यावृत्ति का कोई संदर्भ नहीं है"
#~ msgid "Indirect references to prostitution"
#~ msgstr "वेश्यावृत्ति के लिए अप्रत्यक्ष संदर्भ"
#~ msgid "Direct references to prostitution"
#~ msgstr "वेश्यावृत्ति का सीधा संदर्भ"
#~ msgid "Graphic depictions of the act of prostitution"
#~ msgstr "वेश्यावृत्ति के कार्यों का ग्राफिक चित्रण"
#~ msgid "No references to adultery"
#~ msgstr "व्यभिचार का कोई संदर्भ नहीं"
#~ msgid "Indirect references to adultery"
#~ msgstr "व्यभिचार के लिए अप्रत्यक्ष संदर्भ"
#~ msgid "Direct references to adultery"
#~ msgstr "व्यभिचार का प्रत्यक्ष संदर्भ"
#~ msgid "Graphic depictions of the act of adultery"
#~ msgstr "व्यभिचार अधिनियम के ग्राफिक चित्रण"
#~ msgid "No sexualized characters"
#~ msgstr "कोई यौन सम्बंधित शब्द नहीं है"
#~ msgid "Scantily clad human characters"
#~ msgstr "असाधारण रूप से मानवीय चरित्रों को ढकते हैं"
#~ msgid "Overtly sexualized human characters"
#~ msgstr "अति कामुक मानव पात्र "
#~ msgid "No references to desecration"
#~ msgstr "अपवित्रता का कोई संदर्भ नहीं"
#~ msgid "Depictions or references to historical desecration"
#~ msgstr "ऐतिहासिक अवनति का चित्रण या संदर्भ"
#~ msgid "Depictions of modern-day human desecration"
#~ msgstr "आधुनिक-मानव की निराशा का चित्रण"
#~ msgid "Graphic depictions of modern-day desecration"
#~ msgstr "आधुनिक समय की असमानताओं के ग्राफिक चित्रण"
#~ msgid "No visible dead human remains"
#~ msgstr "मृत मानव के प्रत्यक्ष अवशेष नहीं हैं"
#~ msgid "Visible dead human remains"
#~ msgstr "दर्शनीय मृत मानव अवशेष"
#~ msgid "Dead human remains that are exposed to the elements"
#~ msgstr "मृत मानव के अवशेष जो तत्वों के लिए अनावृत है"
#~ msgid "Graphic depictions of desecration of human bodies"
#~ msgstr "मानव शरीर की अपवित्रता का ग्राफिक चित्रण"
#~ msgid "No references to slavery"
#~ msgstr "दासता का कोई संदर्भ नहीं"
#~ msgid "Depictions or references to historical slavery"
#~ msgstr "ऐतिहासिक गुलामी के संदर्भ या वर्णन"
#~ msgid "Depictions of modern-day slavery"
#~ msgstr "आधुनिक गुलामी के वर्णन"
#~ msgid "Graphic depictions of modern-day slavery"
#~ msgstr "आधुनिक काल की दासता का ग्राफिक चित्रण"

709
po/hu.po
View file

@ -1,386 +1,381 @@
# Hungarian translation for malcontent.
# Copyright (C) 2022 Free Software Foundation, Inc.
# Hungarian translations for malcontent package.
# Copyright (C) 2020 THE malcontent'S COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
# Automatically generated, 2020.
#
# Balázs Úr <ur.balazs at fsf dot hu>, 2022.
msgid ""
msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2022-07-25 03:26+0000\n"
"PO-Revision-Date: 2022-09-22 01:02+0200\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-10 12:04+0100\n"
"PO-Revision-Date: 2020-04-15 13:42+0100\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 19.12.3\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
msgstr "A saját alkalmazásszűrőjének megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:5
msgid "Authentication is required to change your app filter."
msgstr "Hitelesítés szükséges az alkalmazásszűrőjének megváltoztatásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:14
msgid "Read your own app filter"
msgstr "A saját alkalmazásszűrőjének olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:15
msgid "Authentication is required to read your app filter."
msgstr "Hitelesítés szükséges az alkalmazásszűrőjének olvasásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:24
msgid "Change another users app filter"
msgstr "Egy másik felhasználó alkalmazásszűrőjének megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:25
msgid "Authentication is required to change another users app filter."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó alkalmazásszűrőjének "
"megváltoztatásához."
#: accounts-service/com.endlessm.ParentalControls.policy.in:34
msgid "Read another users app filter"
msgstr "Egy másik felhasználó alkalmazásszűrőjének olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:35
msgid "Authentication is required to read another users app filter."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó alkalmazásszűrőjének olvasásához."
#: accounts-service/com.endlessm.ParentalControls.policy.in:44
msgid "Change your own session limits"
msgstr "A saját munkamenetkorlátainak megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:45
msgid "Authentication is required to change your session limits."
msgstr "Hitelesítés szükséges a munkamenetkorlátainak megváltoztatásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:54
msgid "Read your own session limits"
msgstr "A saját munkamenetkorlátainak olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:55
msgid "Authentication is required to read your session limits."
msgstr "Hitelesítés szükséges a munkamenetkorlátainak olvasásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:64
msgid "Change another users session limits"
msgstr "Egy másik felhasználó munkamenetkorlátainak megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:65
msgid "Authentication is required to change another users session limits."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó munkamenetkorlátainak "
"megváltoztatásához."
#: accounts-service/com.endlessm.ParentalControls.policy.in:74
msgid "Read another users session limits"
msgstr "Egy másik felhasználó munkamenetkorlátainak olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:75
msgid "Authentication is required to read another users session limits."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó munkamenetkorlátainak "
"olvasásához."
#: accounts-service/com.endlessm.ParentalControls.policy.in:84
msgid "Change your own account info"
msgstr "A saját fiókinformációinak megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:85
msgid "Authentication is required to change your account info."
msgstr "Hitelesítés szükséges a fiókinformációinak megváltoztatásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:94
msgid "Read your own account info"
msgstr "A saját fiókinformációinak olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:95
msgid "Authentication is required to read your account info."
msgstr "Hitelesítés szükséges a fiókinformációinak olvasásához."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:104
msgid "Change another users account info"
msgstr "Egy másik felhasználó fiókinformációinak megváltoztatása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:105
msgid "Authentication is required to change another users account info."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó fiókinformációinak "
"megváltoztatásához."
#: accounts-service/com.endlessm.ParentalControls.policy.in:114
msgid "Read another users account info"
msgstr "Egy másik felhasználó fiókinformációinak olvasása"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:115
msgid "Authentication is required to read another users account info."
msgstr ""
"Hitelesítés szükséges egy másik felhasználó fiókinformációinak olvasásához."
#: libmalcontent/app-filter.c:694
#, c-format
msgid "App filter for user %u was in an unrecognized format"
msgstr "%u felhasználó alkalmazásszűrője felismerhetetlen formátumban volt"
msgstr ""
#: libmalcontent/app-filter.c:725
#, c-format
msgid "OARS filter for user %u has an unrecognized kind %s"
msgstr "%u felhasználó OARS-szűrője felismerhetetlen „%s” fajtájú"
#: libmalcontent/manager.c:283 libmalcontent/manager.c:420
#: libmalcontent/manager.c:803
#, c-format
msgid "Not allowed to query parental controls data for user %u"
msgstr ""
"Nem engedélyezett %u felhasználó szülői felügyeleti adatainak lekérdezése"
#: libmalcontent/manager.c:283 libmalcontent/manager.c:412
#, c-format
msgid "Not allowed to query app filter data for user %u"
msgstr ""
#: libmalcontent/manager.c:288
#, c-format
msgid "User %u does not exist"
msgstr "%u felhasználó nem létezik"
msgstr ""
#: libmalcontent/manager.c:296
msgid "System accounts service not available"
msgstr "A rendszer fiókjainak szolgáltatása nem érhető el"
#: libmalcontent/manager.c:402
#: libmalcontent/manager.c:394
msgid "App filtering is globally disabled"
msgstr "Az alkalmazásszűrés globálisan le van tiltva"
msgstr ""
#: libmalcontent/manager.c:785
#: libmalcontent/manager.c:777
msgid "Session limits are globally disabled"
msgstr "A munkamenetkorlátok globálisan le vannak tiltva"
msgstr ""
#: libmalcontent/manager.c:795
#, c-format
msgid "Not allowed to query session limits data for user %u"
msgstr ""
#: libmalcontent/session-limits.c:306
#, c-format
msgid "Session limit for user %u was in an unrecognized format"
msgstr "%u felhasználó munkamenetkorlátja felismerhetetlen formátumban volt"
msgstr ""
#: libmalcontent/session-limits.c:328
#, c-format
msgid "Session limit for user %u has an unrecognized type %u"
msgstr "%u felhasználó munkamenetkorlátjának felismerhetetlen „%u” típusa van"
msgstr ""
#: libmalcontent/session-limits.c:346
#, c-format
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr ""
"%u felhasználó munkamenetkorlátjának érvénytelen %u%u napi ütemezése van"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr ""
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:223
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr ""
"%s korlátozása abban, hogy a következő telepített alkalmazásokat használja."
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "Alkalmazások korlátozása"
msgstr ""
#: libmalcontent-ui/restrict-applications-selector.ui:13
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "Nem találhatók korlátozandó alkalmazások."
msgstr ""
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:198 libmalcontent-ui/user-controls.c:209
#: libmalcontent-ui/user-controls.c:242 libmalcontent-ui/user-controls.c:253
msgid "unknown"
msgstr "ismeretlen"
msgstr ""
#: libmalcontent-ui/user-controls.c:303 libmalcontent-ui/user-controls.c:388
#: libmalcontent-ui/user-controls.c:641
#: libmalcontent-ui/user-controls.c:338 libmalcontent-ui/user-controls.c:425
#: libmalcontent-ui/user-controls.c:711
msgid "All Ages"
msgstr "Összes életkor"
msgstr ""
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:470
#: libmalcontent-ui/user-controls.c:514
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
"available in other applications."
msgstr ""
"Megakadályozza, hogy %s webböngészőket futtasson. Korlátozott webes tartalom "
"továbbra is elérhető lehet egyéb alkalmazásokban."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:475
#: libmalcontent-ui/user-controls.c:519
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "Megakadályozza, hogy %s a megadott alkalmazásokat használja."
msgstr ""
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:480
#: libmalcontent-ui/user-controls.c:524
#, c-format
msgid "Prevents %s from installing applications."
msgstr "Megakadályozza, hogy %s alkalmazásokat telepítsen."
msgstr ""
#: libmalcontent-ui/user-controls.ui:25
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:529
#, c-format
msgid "Applications installed by %s will not appear for other users."
msgstr ""
#: libmalcontent-ui/user-controls.ui:17
msgid "Application Usage Restrictions"
msgstr "Alkalmazáshasználati korlátozások"
msgstr ""
#: libmalcontent-ui/user-controls.ui:28
#: libmalcontent-ui/user-controls.ui:68
msgid "Restrict _Web Browsers"
msgstr "_Webböngészők korlátozása"
msgstr ""
#: libmalcontent-ui/user-controls.ui:50
#: libmalcontent-ui/user-controls.ui:152
msgid "_Restrict Applications"
msgstr "_Alkalmazások korlátozása"
msgstr ""
#: libmalcontent-ui/user-controls.ui:72
#: libmalcontent-ui/user-controls.ui:231
msgid "Software Installation Restrictions"
msgstr "Szoftvertelepítési korlátozások"
msgstr ""
#: libmalcontent-ui/user-controls.ui:76
#: libmalcontent-ui/user-controls.ui:281
msgid "Restrict Application _Installation"
msgstr "Alkalmazás_telepítés korlátozása"
msgstr ""
#: libmalcontent-ui/user-controls.ui:97
#: libmalcontent-ui/user-controls.ui:366
msgid "Restrict Application Installation for _Others"
msgstr ""
#: libmalcontent-ui/user-controls.ui:451
msgid "Application _Suitability"
msgstr "Alkalmazás _alkalmassága"
msgstr ""
#: libmalcontent-ui/user-controls.ui:100
#: libmalcontent-ui/user-controls.ui:473
msgid ""
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
"Korlátozza az alkalmazások böngészését vagy telepítését a bizonyos "
"korosztályok vagy afölöttiek számára alkalmas alkalmazásokra."
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
msgid "User to select in the UI"
msgstr "A felhasználói felületen kiválasztandó felhasználó"
#. Translators: This is a placeholder for a command line argument value:
#: malcontent-control/application.c:104
msgid "USERNAME"
msgstr "FELHASZNÁLÓNÉV"
#: malcontent-control/application.c:116
msgid "— view and edit parental controls"
msgstr "— szülői felügyelet megtekintése és szerkesztése"
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:123 malcontent-control/main.ui:17
#: malcontent-control/application.c:105 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "Szülői felügyelet"
msgstr ""
#: malcontent-control/application.c:309
#: malcontent-control/application.c:270
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr ""
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:314
#: malcontent-control/application.c:275
msgid "translator-credits"
msgstr "Úr Balázs <ur dot balazs at fsf dot hu>, 2022."
msgstr ""
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:320
#: malcontent-control/application.c:281
msgid "Malcontent Website"
msgstr "A Malcontent weboldala"
msgstr ""
#: malcontent-control/application.c:341
#: malcontent-control/application.c:299
msgid "The help contents could not be displayed"
msgstr "A súgótartalmat nem sikerült megjeleníteni"
msgstr ""
#: malcontent-control/application.c:388
#: malcontent-control/application.c:336
msgid "Failed to load user data from the system"
msgstr "Nem sikerült betölteni a felhasználói adatokat a rendszerről"
msgstr ""
#: malcontent-control/application.c:390
#: malcontent-control/application.c:338
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr ""
"Győződjön meg arról, hogy az AccountsService telepítve van-e és engedélyezve "
"van-e."
#. Translators: Replace the link to commonsensemedia.org with some
#. * localised guidance for parents/carers on how to set restrictions on
#. * their child/caree in a responsible way which is in keeping with the
#. * best practice and culture of the region. If no suitable localised
#. * guidance exists, and if the default commonsensemedia.org link is not
#. * suitable, please file an issue against malcontent so we can discuss
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:421
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
"conversation with %s. <a href='https://www.commonsensemedia.org/privacy-and-"
"internet-safety'>Read guidance</a> on what to consider."
msgstr ""
"Azt javasoljuk, hogy a korlátozásokat %s felhasználóval történő folyamatos "
"beszélgetés részeként határozzák meg. <a href='https://www.commonsensemedia."
"org/privacy-and-internet-safety'>Olvasson útmutatást</a> arról, hogy mit "
"kell figyelembe venni."
#: malcontent-control/carousel.ui:38
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "Előző oldal"
msgstr ""
#: malcontent-control/carousel.ui:57
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "Következő oldal"
msgstr ""
#: malcontent-control/main.ui:87
#: malcontent-control/main.ui:93
msgid "Permission Required"
msgstr "Engedély szükséges"
msgstr ""
#: malcontent-control/main.ui:88
#: malcontent-control/main.ui:107
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"Engedély szükséges a felhasználó szülői felügyeleti beállításainak "
"megtekintéséhez és megváltoztatásához."
#: malcontent-control/main.ui:110
msgid "No Standard User Accounts"
msgstr "Nincsenek szabványos felhasználói fiókok"
#: malcontent-control/main.ui:111
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
#: malcontent-control/main.ui:148
msgid "No Child Users Configured"
msgstr ""
"A szülői felügyeletet csak szabványos felhasználói fiókokra lehet\n"
"alkalmazni. Ezek a felhasználói beállításokban hozhatók létre."
#: malcontent-control/main.ui:115
msgid "_User Settings"
msgstr "_Felhasználói beállítások"
#: malcontent-control/main.ui:162
msgid ""
"No child users are currently set up on the system. Create one before setting "
"up their parental controls."
msgstr ""
#: malcontent-control/main.ui:138
#: malcontent-control/main.ui:174
msgid "Create _Child User"
msgstr ""
#: malcontent-control/main.ui:202
msgid "Loading…"
msgstr "Betöltés…"
msgstr ""
#: malcontent-control/main.ui:171
#: malcontent-control/main.ui:265
msgid "_Help"
msgstr "_Súgó"
#: malcontent-control/main.ui:175
#: malcontent-control/main.ui:269
msgid "_About Parental Controls"
msgstr "_A szülői felügyeletről"
msgstr ""
#. Translators: the brief summary of the application as it appears in a software center.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:12
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:4
msgid "Set parental controls and monitor usage by users"
msgstr ""
"Szülői felügyelet beállítása és a felhasználók tevékenységeinek megfigyelése"
#. Translators: These are the application description paragraphs in the AppData file.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:16
@ -389,36 +384,67 @@ msgid ""
"use the computer for, what software they can install, and what installed "
"software they can run."
msgstr ""
"A felhasználók szülői felügyeleti korlátozásainak kezelése, a számítógép "
"használati idejének szabályozása, milyen szoftvereket telepíthetnek, "
"valamint mely telepített szoftvereket futtathatnak."
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:25
msgid "Main window"
msgstr "Főablak"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:39
msgid "The GNOME Project"
msgstr "A GNOME projekt"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:50
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:59
msgid "Minor improvements to parental controls application UI"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:51
msgid "Add a user manual"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:52
msgid "Translation updates"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:60
msgid "Translations to Ukrainian and Polish"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:67
msgid "Improve parental controls application UI and add icon"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:68
msgid "Support for indicating which accounts are parent accounts"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:75
msgid "Initial release of basic parental controls application"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:76
msgid "Support for setting app installation and run restrictions on users"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:83
msgid "Maintenance release of underlying parental controls library"
msgstr ""
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:7
msgid "org.freedesktop.MalcontentControl"
msgstr ""
#. Translators: Search terms to find this application. Do NOT translate or localise the semicolons! The list MUST also end with a semicolon!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:14
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:13
msgid ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
msgstr ""
"szülői felügyelet;képernyőidő;alkalmazáskorlátozások;webböngésző-"
"korlátozások;oars;használat;használati korlátozás;kölyök;gyerek;gyermek;"
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:9
msgid "Manage parental controls"
msgstr "Szülői felügyelet kezelése"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:10
msgid "Authentication is required to read and change user parental controls"
msgstr ""
"Hitelesítés szükséges a felhasználó szülői felügyeletének olvasásához és "
"megváltoztatásához"
#: malcontent-control/user-selector.c:426
msgid "Your account"
@ -429,20 +455,331 @@ msgstr "Az Ön fiókja"
#: pam/pam_malcontent.c:142 pam/pam_malcontent.c:188
#, c-format
msgid "User %s has no time limits enabled"
msgstr "„%s” felhasználónak nincsenek időkorlátok engedélyezve"
msgstr ""
#: pam/pam_malcontent.c:151 pam/pam_malcontent.c:172
#, c-format
msgid "Error getting session limits for user %s: %s"
msgstr "Hiba történt „%s” felhasználó munkamenetkorlátjainak lekérésekor: %s"
msgstr ""
#: pam/pam_malcontent.c:182
#, c-format
msgid "User %s has no time remaining"
msgstr "„%s” felhasználónak nincs hátralévő ideje"
msgstr ""
#: pam/pam_malcontent.c:200
#, c-format
msgid "Error setting time limit on login session: %s"
msgstr ""
"Hiba történt a bejelentkezési munkameneten való időkorlát beállításakor: %s"
#~ msgid "No cartoon violence"
#~ msgstr "Nincs rajzfilmes erőszak"
#~ msgid "Cartoon characters in unsafe situations"
#~ msgstr "Rajzfilmfigurák veszélyes helyzetekben"
#~ msgid "Cartoon characters in aggressive conflict"
#~ msgstr "Rajzfilmfigurák agresszív konfliktusban"
#~ msgid "Graphic violence involving cartoon characters"
#~ msgstr "Rajzfilmfigurákat érintő grafikus erőszak"
#~ msgid "No fantasy violence"
#~ msgstr "Nincs kitalált erőszak"
#~ msgid "Characters in unsafe situations easily distinguishable from reality"
#~ msgstr ""
#~ "Karakterek veszélyes helyzetekben, amely könnyen megkülönböztethető a "
#~ "valóságtól"
#~ msgid ""
#~ "Characters in aggressive conflict easily distinguishable from reality"
#~ msgstr ""
#~ "Karakterek agresszív konfliktusban, amely könnyen megkülönböztethető a "
#~ "valóságtól"
#~ msgid "Graphic violence easily distinguishable from reality"
#~ msgstr "Grafikus erőszak, amely könnyen megkülönböztethető a valóságtól"
#~ msgid "No realistic violence"
#~ msgstr "Nincs valósághű erőszak"
#~ msgid "Mildly realistic characters in unsafe situations"
#~ msgstr "Enyhén valósághű karakterek veszélyes helyzetekben"
#~ msgid "Depictions of realistic characters in aggressive conflict"
#~ msgstr "Valósághű karakterek ábrázolása agresszív konfliktusban"
#~ msgid "Graphic violence involving realistic characters"
#~ msgstr "Valósághű karaktereket érintő grafikus erőszak"
#~ msgid "No bloodshed"
#~ msgstr "Nincs vérontás"
#~ msgid "Unrealistic bloodshed"
#~ msgstr "Nem valósághű vérontás"
#~ msgid "Realistic bloodshed"
#~ msgstr "Valósághű vérontás"
#~ msgid "Depictions of bloodshed and the mutilation of body parts"
#~ msgstr "Várontás és a testrészek megcsonkításának ábrázolása"
#~ msgid "No sexual violence"
#~ msgstr "Nincs szexuális erőszak"
#~ msgid "Rape or other violent sexual behavior"
#~ msgstr "Megerőszakolás vagy egyéb erőszakos szexuális viselkedés"
#~ msgid "No references to alcohol"
#~ msgstr "Nincs alkoholtartalmú italokra való hivatkozás"
#~ msgid "References to alcoholic beverages"
#~ msgstr "Alkoholtartalmú italokra való hivatkozások"
#~ msgid "Use of alcoholic beverages"
#~ msgstr "Alkoholtartalmú italok használata"
#~ msgid "No references to illicit drugs"
#~ msgstr "Nincs tiltott kábítószerekre való hivatkozás"
#~ msgid "References to illicit drugs"
#~ msgstr "Tiltott kábítószerekre való hivatkozások"
#~ msgid "Use of illicit drugs"
#~ msgstr "Tiltott kábítószerek használata"
#~ msgid "References to tobacco products"
#~ msgstr "Dohánytermékekre való hivatkozások"
#~ msgid "Use of tobacco products"
#~ msgstr "Dohánytermékek használata"
#~ msgid "No nudity of any sort"
#~ msgstr "Nincs semmiféle meztelenség"
#~ msgid "Brief artistic nudity"
#~ msgstr "Rövid művészi meztelenség"
#~ msgid "Prolonged nudity"
#~ msgstr "Hosszan tartó meztelenség"
#~ msgid "No references or depictions of sexual nature"
#~ msgstr "Nincs szexuális hivatkozás vagy ábrázolás"
#~ msgid "Provocative references or depictions"
#~ msgstr "Kihívó hivatkozások vagy ábrázolások"
#~ msgid "Sexual references or depictions"
#~ msgstr "Szexuális hivatkozások vagy ábrázolások"
#~ msgid "Graphic sexual behavior"
#~ msgstr "Grafikus szexuális viselkedés"
#~ msgid "No profanity of any kind"
#~ msgstr "Nincs káromkodás"
#~ msgid "Mild or infrequent use of profanity"
#~ msgstr "Enyhe vagy ritka káromkodáshasználat"
#~ msgid "Moderate use of profanity"
#~ msgstr "Mérsékelt káromkodáshasználat"
#~ msgid "Strong or frequent use of profanity"
#~ msgstr "Erős vagy gyakori káromkodáshasználat"
#~ msgid "No inappropriate humor"
#~ msgstr "Nincs helytelen humor"
#~ msgid "Slapstick humor"
#~ msgstr "Helyzethumor"
#~ msgid "Vulgar or bathroom humor"
#~ msgstr "Vulgáris vagy fürdőszoba humor"
#~ msgid "Mature or sexual humor"
#~ msgstr "Felnőtt vagy szexuális humor"
#~ msgid "No discriminatory language of any kind"
#~ msgstr "Nincs semmiféle diszkriminatív nyelvezet"
#~ msgid "Negativity towards a specific group of people"
#~ msgstr "Negatívság egy bizonyos embercsoport felé"
#~ msgid "Discrimination designed to cause emotional harm"
#~ msgstr "Érzelmi károsodást okozó tervezett diszkrimináció"
#~ msgid "Explicit discrimination based on gender, sexuality, race or religion"
#~ msgstr ""
#~ "Kifejezetten nemi, szexuális, faji vagy vallási alapú diszkrimináció"
#~ msgid "No advertising of any kind"
#~ msgstr "Nincs semmiféle hirdetés"
#~ msgid "Product placement"
#~ msgstr "Termékelhelyezés"
#~ msgid "Explicit references to specific brands or trademarked products"
#~ msgstr ""
#~ "Közvetlen utalások egy bizonyos márkára vagy védjeggyel védett termékre"
#~ msgid "Users are encouraged to purchase specific real-world items"
#~ msgstr ""
#~ "A felhasználókat arra ösztönzik, hogy a valódi világban bizonyos "
#~ "tárgyakat vásároljanak"
#~ msgid "No gambling of any kind"
#~ msgstr "Nincs semmiféle szerencsejáték"
#~ msgid "Gambling on random events using tokens or credits"
#~ msgstr ""
#~ "Szerencsejáték véletlenszerű eseményeken zsetonok vagy kreditek "
#~ "használatával"
#~ msgid "Gambling using “play” money"
#~ msgstr "Szerencsejáték „játékpénz” használatával"
#~ msgid "Gambling using real money"
#~ msgstr "Szerencsejáték valódi pénz használatával"
#~ msgid "No ability to spend money"
#~ msgstr "Nem lehet valódi pénzt elkölteni"
#~ msgid "Users are encouraged to donate real money"
#~ msgstr "A felhasználókat arra ösztönzik, hogy valós pénzt adományozzanak"
#~ msgid "Ability to spend real money in-game"
#~ msgstr "Lehetséges a játékon belül valódi pénzt elkölteni"
#~ msgid "No way to chat with other users"
#~ msgstr "Nincs mód a csevegésre más felhasználókkal"
#~ msgid "User-to-user game interactions without chat functionality"
#~ msgstr ""
#~ "Felhasználók közötti játékinterakció, csevegés funkcionalitás nélkül"
#~ msgid "Moderated chat functionality between users"
#~ msgstr "Moderált csevegés funkcionalitás a felhasználók között"
#~ msgid "Uncontrolled chat functionality between users"
#~ msgstr "Ellenőrizetlen csevegés funkcionalitás a felhasználók között"
#~ msgid "No way to talk with other users"
#~ msgstr "Nincs mód a beszélgetésre más felhasználókkal"
#~ msgid "Uncontrolled audio or video chat functionality between users"
#~ msgstr ""
#~ "Ellenőrizetlen hang- vagy videocsevegés funkcionalitás a felhasználók "
#~ "között"
#~ msgid "No sharing of social network usernames or email addresses"
#~ msgstr ""
#~ "Nincs közösségi hálózatokon használt felhasználónevek vagy e-mail címek "
#~ "megosztása"
#~ msgid "Sharing social network usernames or email addresses"
#~ msgstr ""
#~ "Közösségi hálózatokon használt felhasználónevek vagy e-mail címek "
#~ "megosztása"
#~ msgid "No sharing of user information with 3rd parties"
#~ msgstr "Felhasználói információk nem kerülnek megosztásra harmadik féllel"
#~ msgid "Checking for the latest application version"
#~ msgstr "A legfrissebb alkalmazásverzió ellenőrzése"
#~ msgid "Sharing diagnostic data that does not let others identify the user"
#~ msgstr ""
#~ "Diagnosztikai adatok megosztása, amelyek mások számára nem azonosítják a "
#~ "felhasználót"
#~ msgid "Sharing information that lets others identify the user"
#~ msgstr ""
#~ "Információk megosztása, amelyek mások számára azonosítják a felhasználót"
#~ msgid "No sharing of physical location to other users"
#~ msgstr "Fizikai hely nem kerül megosztásra más felhasználók számára"
#~ msgid "Sharing physical location to other users"
#~ msgstr "Fizikai hely megosztása más felhasználók számára"
#~ msgid "No references to homosexuality"
#~ msgstr "Nincs homoszexualitásra való hivatkozás"
#~ msgid "Indirect references to homosexuality"
#~ msgstr "Közvetett homoszexualitásra való hivatkozás"
#~ msgid "Kissing between people of the same gender"
#~ msgstr "Csókolózás azonos nemű emberek között"
#~ msgid "Graphic sexual behavior between people of the same gender"
#~ msgstr "Grafikus szexuális viselkedés azonos nemű emberek között"
#~ msgid "No references to prostitution"
#~ msgstr "Nincs prostitúcióra való hivatkozás"
#~ msgid "Indirect references to prostitution"
#~ msgstr "Közvetett prostitúcióra való hivatkozás"
#~ msgid "Direct references to prostitution"
#~ msgstr "Közvetlen prostitúcióra való hivatkozás"
#~ msgid "Graphic depictions of the act of prostitution"
#~ msgstr "Prostitúció grafikus ábrázolása"
#~ msgid "No references to adultery"
#~ msgstr "Nincs házasságtörésre való hivatkozás"
#~ msgid "Indirect references to adultery"
#~ msgstr "Közvetett házasságtörésre való hivatkozás"
#~ msgid "Direct references to adultery"
#~ msgstr "Közvetlen házasságtörésre való hivatkozás"
#~ msgid "Graphic depictions of the act of adultery"
#~ msgstr "Házasságtörés grafikus ábrázolása"
#~ msgid "No sexualized characters"
#~ msgstr "Nincsenek szexualizált karakterek"
#~ msgid "Scantily clad human characters"
#~ msgstr "Hiányosan öltözött emberi karakterek"
#~ msgid "Overtly sexualized human characters"
#~ msgstr "Nyíltan szexualizált emberi karakterek"
#~ msgid "No references to desecration"
#~ msgstr "Nincs gyalázásra való hivatkozás"
#~ msgid "Depictions or references to historical desecration"
#~ msgstr "Gyalázás történelmi ábrázolása vagy arra való hivatkozás"
#~ msgid "Depictions of modern-day human desecration"
#~ msgstr "Modern kori emberi gyalázás ábrázolása"
#~ msgid "Graphic depictions of modern-day desecration"
#~ msgstr "Modern kori emberi gyalázás grafikus ábrázolása"
#~ msgid "No visible dead human remains"
#~ msgstr "Nincsenek látható emberi maradványok"
#~ msgid "Visible dead human remains"
#~ msgstr "Látható emberi maradványok"
#~ msgid "Dead human remains that are exposed to the elements"
#~ msgstr "Emberi maradványok, kitéve az időjárási viszonyoknak"
#~ msgid "Graphic depictions of desecration of human bodies"
#~ msgstr "Emberi testek gyalázásának grafikus ábrázolása"
#~ msgid "No references to slavery"
#~ msgstr "Nincs rabszolgaságra való hivatkozás"
#~ msgid "Depictions or references to historical slavery"
#~ msgstr "Rabszolgaság történelmi ábrázolása vagy arra való hivatkozás"
#~ msgid "Depictions of modern-day slavery"
#~ msgstr "Modern kori rabszolgaság ábrázolása"
#~ msgid "Graphic depictions of modern-day slavery"
#~ msgstr "Modern kori rabszolgaság grafikus ábrázolása"

479
po/ka.po
View file

@ -1,479 +0,0 @@
# Georgian translations for malcontent package.
# Copyright (C) 2022 THE malcontent'S COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2021-09-18 12:41+0000\n"
"PO-Revision-Date: 2022-09-14 09:48+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <(nothing)>\n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1.1\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
msgstr "შეცვალეთ თქვენი საკუთარი აპის ფილტრი"
#: accounts-service/com.endlessm.ParentalControls.policy.in:5
msgid "Authentication is required to change your app filter."
msgstr "თქვენი აპის ფილტრის შესაცვლელად საჭიროა ავთენტიკაცია."
#: accounts-service/com.endlessm.ParentalControls.policy.in:14
msgid "Read your own app filter"
msgstr "წაიკთხეთ თქვენი საკუთარი აპის ფილტრი"
#: accounts-service/com.endlessm.ParentalControls.policy.in:15
msgid "Authentication is required to read your app filter."
msgstr "თქვენი აპის ფილტრის წასაკითხად საჭიროა ავთენტიკაცია."
#: accounts-service/com.endlessm.ParentalControls.policy.in:24
msgid "Change another users app filter"
msgstr "სხვა მომხმარებლის აპის ფილტრის შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:25
msgid "Authentication is required to change another users app filter."
msgstr "სხვა მომხმარებლის აპის ფილტრის შესაცვლელად ავთენტიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:34
msgid "Read another users app filter"
msgstr "სხვა მომხმარებლის აპის ფილტრის წაკითხვა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:35
msgid "Authentication is required to read another users app filter."
msgstr "სხვა მომხმარებლის აპის ფილტრის წასაკითხად ავთენტიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:44
msgid "Change your own session limits"
msgstr "თქვენი საკუთარი სესიის ლიმიტების შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:45
msgid "Authentication is required to change your session limits."
msgstr "თქვენი საკუთარი სესიის ლიმიტების შესაცვლელად ავთენთიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:54
msgid "Read your own session limits"
msgstr "თქვენი საკუთარი სესიის ლიმიტების შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:55
msgid "Authentication is required to read your session limits."
msgstr "თქვენი საკუთარი სესიის ლიმიტების წასაკითხად ავთენთიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:64
msgid "Change another users session limits"
msgstr "სხვა მომხმარებლის სესიის ლიმიტების შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:65
msgid "Authentication is required to change another users session limits."
msgstr "სხვა მომხმარებლის სესიის ლიმიტების შესაცვლელად ავთენტიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:74
msgid "Read another users session limits"
msgstr "სხვა მომხმარებლის სესიის ლიმიტების წაკითხვა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:75
msgid "Authentication is required to read another users session limits."
msgstr "სხვა მომხმარებლის სესიის ლიმიტების წასაკითხად ავთენტიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:84
msgid "Change your own account info"
msgstr "თქვენი საკუთარი ანგარიშის ინფორმაციის შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:85
msgid "Authentication is required to change your account info."
msgstr ""
"თქვენი საკუთარი ანგარიშის ინფორმაციის შესაცვლელად ავთენთიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:94
msgid "Read your own account info"
msgstr "თქვენი საკუთარი ანგარიშის ინფორმაციის წაკითხვა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:95
msgid "Authentication is required to read your account info."
msgstr "თქვენი საკუთარი ანგარიშის ინფორმაციის წასაკითხად ავთენთიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:104
msgid "Change another users account info"
msgstr "სხვა მომხმარებლის ანგარიშის ინფორმაციის შეცვლა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:105
msgid "Authentication is required to change another users account info."
msgstr ""
"სხვა მომხმარებლის ანგარიშის ინფორმაციის შესაცვლელად ავთენტიკაციაა საჭირო."
#: accounts-service/com.endlessm.ParentalControls.policy.in:114
msgid "Read another users account info"
msgstr "სხვა მომხმარებლის ანგარიშის ინფორმაციის წაკითხვა"
#: accounts-service/com.endlessm.ParentalControls.policy.in:115
msgid "Authentication is required to read another users account info."
msgstr ""
"სხვა მომხმარებლის ანგარიშის ინფორმაციის წასაკითხად ავთენტიკაციაა საჭირო."
#: libmalcontent/app-filter.c:694
#, c-format
msgid "App filter for user %u was in an unrecognized format"
msgstr "აპის ფილტრი მომხმარებლისთვის %u უცნობი ფორმატითაა"
#: libmalcontent/app-filter.c:725
#, c-format
msgid "OARS filter for user %u has an unrecognized kind %s"
msgstr "OARS ფილტრი მომხმარებლისთვის %u უცნობი სახისაა: '%s'"
#: libmalcontent/manager.c:283 libmalcontent/manager.c:420
#: libmalcontent/manager.c:803
#, c-format
msgid "Not allowed to query parental controls data for user %u"
msgstr ""
"მშობლების კონტროლის მონაცემების გამოთხოვა მომხმარებლისთვის %u დაშვებული არაა"
#: libmalcontent/manager.c:288
#, c-format
msgid "User %u does not exist"
msgstr "მომხმარებელი %u არ არსებობს"
#: libmalcontent/manager.c:296
msgid "System accounts service not available"
msgstr "სისტემური ანგარიშების სერვისი მიუწვდომელია"
#: libmalcontent/manager.c:402
msgid "App filtering is globally disabled"
msgstr "აპის გაფილტვრა გლობალურადაა გათიშული"
#: libmalcontent/manager.c:785
msgid "Session limits are globally disabled"
msgstr "სესიის ლიმიტები გლობალურადაა გათიშული"
#: libmalcontent/session-limits.c:306
#, c-format
msgid "Session limit for user %u was in an unrecognized format"
msgstr "მომხმარებლისთვის %u სესიის ლიმიტი უცნობ ფორმატშია"
#: libmalcontent/session-limits.c:328
#, c-format
msgid "Session limit for user %u has an unrecognized type %u"
msgstr "მომხმარებლისთვის %u სესიის ლიმიტის ტიპი (%u) უცნობია"
#: libmalcontent/session-limits.c:346
#, c-format
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr ""
"სესიის ლიმიტს მომხმარებლისთვის %u არასწორი დღიური გრაფიკი(%u%u) გააჩნია"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr "%s (%s)"
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr "ზოგადი"
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr "ყველა"
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr "მხოლოდ დიდებისთვის"
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr "ასაკიანები"
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr "მოზარდები"
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr "ყველა 10+"
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr "ყველა"
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr "პტარა ბავშვები"
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr "%s-სთვის მითითებული დაყენებული აპლიკაციების გამოყენების აკრძალვა."
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "აპლიკაციების შეზღუდვა"
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "შესაზღუდი აპლიკაციების გარეშე."
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:207 libmalcontent-ui/user-controls.c:218
msgid "unknown"
msgstr "უცნობი"
#: libmalcontent-ui/user-controls.c:312 libmalcontent-ui/user-controls.c:397
#: libmalcontent-ui/user-controls.c:669
msgid "All Ages"
msgstr "ყველა ასაკი"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:477
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
"available in other applications."
msgstr ""
"%s-სთვის ბრაუზერების გაშვების აკრძალვა. სხვა აპლიკაციებში შეზღუდული ვებ-"
"შემცველობა მაინც შეიძლება ხელმისაწვდომი იყოს."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:482
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "%s-სთვის მითითებული აპლიკაციების გამოყენების აკრძალვა."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:487
#, c-format
msgid "Prevents %s from installing applications."
msgstr "%s-სთვის აპლიკაციების დაყენების უფლების წართმევა."
#: libmalcontent-ui/user-controls.ui:16
msgid "Application Usage Restrictions"
msgstr "აპლიკაციის გამოყენების შეზღუდვები"
#: libmalcontent-ui/user-controls.ui:67
msgid "Restrict _Web Browsers"
msgstr "_ვებ ბრაუზერების შეზღუდვა"
#: libmalcontent-ui/user-controls.ui:151
msgid "_Restrict Applications"
msgstr "აპლიკაციების _შეზღუდვა"
#: libmalcontent-ui/user-controls.ui:230
msgid "Software Installation Restrictions"
msgstr "პროგრამების დაყენების შეზღუდვები"
#: libmalcontent-ui/user-controls.ui:280
msgid "Restrict Application _Installation"
msgstr "აპლიკაციების _დაენების შეზღუდვა"
#: libmalcontent-ui/user-controls.ui:365
msgid "Application _Suitability"
msgstr "აპლიკაციის _შესაბამისობა"
#: libmalcontent-ui/user-controls.ui:387
msgid ""
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
"ზღუდავს აპლიკაციების დათვალიერებას ან დაყენებას გარკვეული ასაკამდე ან ქვემოთ."
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
msgid "User to select in the UI"
msgstr "UI-ში ასარჩევი მომხმარებელი"
#. Translators: This is a placeholder for a command line argument value:
#: malcontent-control/application.c:104
msgid "USERNAME"
msgstr "მომხმარებლის სახელი"
#: malcontent-control/application.c:115
msgid "— view and edit parental controls"
msgstr "— მშობლის კონტროლების ნახვა და ჩასწორება"
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:122 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "მშობლის კონტროლი"
#: malcontent-control/application.c:308
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "© 2019, 2020 Endless Mobile, Inc., ყველა უფლება დაცულია."
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:313
msgid "translator-credits"
msgstr "თემური დოღონაძე"
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:319
msgid "Malcontent Website"
msgstr "Malcontent -ის ვებგვერდი"
#: malcontent-control/application.c:337
msgid "The help contents could not be displayed"
msgstr "დახმარების შემცველობის ჩვენება შეუძლებელია"
#: malcontent-control/application.c:374
msgid "Failed to load user data from the system"
msgstr "სისტემიდან მომხმარებლის მონაცემების წაკითხვის შეცდომა"
#: malcontent-control/application.c:376
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr "დარწმუნდით, რომ AccountService დაყენებული და ჩართულია."
#. Translators: Replace the link to commonsensemedia.org with some
#. * localised guidance for parents/carers on how to set restrictions on
#. * their child/caree in a responsible way which is in keeping with the
#. * best practice and culture of the region. If no suitable localised
#. * guidance exists, and if the default commonsensemedia.org link is not
#. * suitable, please file an issue against malcontent so we can discuss
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:407
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
"conversation with %s. <a href='https://www.commonsensemedia.org/privacy-and-"
"internet-safety'>Read guidance</a> on what to consider."
msgstr ""
"რეკომენდებულია, რომ შეზღუდვები %s-სთან მიმდინარე საუბრის ნაწილი იყოს. <a "
"href='https://www.commonsensemedia.org/privacy-and-internet-"
"safety'>წაიკითხეთ,</a> რა უნდა გაითვალისწინოთ."
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "წინა გვერდი"
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "შემდეგი გვერდი"
#: malcontent-control/main.ui:115
msgid "Permission Required"
msgstr "საჭიროა წვდომის უფლება"
#: malcontent-control/main.ui:129
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"მომხმარებლის მშობლის კონტროლის პარამეტრების შესაცვლელად საჭირო წვდომა არ "
"გაგაჩნიათ."
#: malcontent-control/main.ui:184
msgid "No Standard User Accounts"
msgstr "სტანდარტული მომხმარებლის ანგარიშების გარეშე"
#: malcontent-control/main.ui:199
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
msgstr ""
"მშობლის კონტროლის პოლიტიკის გადატარება მხოლოდ ჩვეულებრივ\n"
"მომხმარებლებზე შეიძლება. მათი შექმნა მომხმარებლის პარამეტრებში შეგიძლიათ."
#: malcontent-control/main.ui:212
msgid "_User Settings"
msgstr "_მომხმარებლის პარამეტრები"
#: malcontent-control/main.ui:242
msgid "Loading…"
msgstr "ჩატვირთვა…"
#: malcontent-control/main.ui:305
msgid "_Help"
msgstr "და_ხმარება"
#: malcontent-control/main.ui:309
msgid "_About Parental Controls"
msgstr "მშობლის კონტროლის _შესახებ"
#. Translators: the brief summary of the application as it appears in a software center.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:12
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:4
msgid "Set parental controls and monitor usage by users"
msgstr "დააყენეთ მშობლის კონტროლი და აკონტროლეთ მომხმარებლების ქცევა"
#. Translators: These are the application description paragraphs in the AppData file.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:16
msgid ""
"Manage users parental controls restrictions, controlling how long they can "
"use the computer for, what software they can install, and what installed "
"software they can run."
msgstr ""
"მართეთ მომხმარებლის მშობლის კონტროლის შეზღუდვები. აკონტროლეთ, რამდენ ხანს "
"შეუძლიათ, ისარგებლონ კომპიუტერით, რა პროგრამების დაყენება შეუძლიათ და "
"დაყენებული პროგრამებიდან რისი გაშვება შეუძლიათ."
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:25
msgid "Main window"
msgstr "მთავარი ფანჯარა"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:38
msgid "The GNOME Project"
msgstr "პროექტი \"GNOME\""
#. Translators: Search terms to find this application. Do NOT translate or localise the semicolons! The list MUST also end with a semicolon!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:14
msgid ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
msgstr ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:9
msgid "Manage parental controls"
msgstr "მშობლის კონტროლის მართვა"
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:10
msgid "Authentication is required to read and change user parental controls"
msgstr ""
"მომხმარებლის მშობლის კონტროლის წასაკითხად და შესაცვლელად ავთენტიკაციაა საჭირო"
#: malcontent-control/user-selector.c:426
msgid "Your account"
msgstr "თქვენი ანგარიში"
#. Always allow root, to avoid a situation where this PAM module prevents
#. * all users logging in with no way of recovery.
#: pam/pam_malcontent.c:142 pam/pam_malcontent.c:188
#, c-format
msgid "User %s has no time limits enabled"
msgstr "მომხმარებელს \"%s\" დროის ლიმიტები ჩართული არ აქვს"
#: pam/pam_malcontent.c:151 pam/pam_malcontent.c:172
#, c-format
msgid "Error getting session limits for user %s: %s"
msgstr "მომხმარებლისთვის '%s' სესიის ლიმიტების მიღების შეცდომა: %s"
#: pam/pam_malcontent.c:182
#, c-format
msgid "User %s has no time remaining"
msgstr "მომხმარებელს \"%s\" დრო დარჩენილი არ აქვს"
#: pam/pam_malcontent.c:200
#, c-format
msgid "Error setting time limit on login session: %s"
msgstr "შესვლის სესიაზე დროის ლიმიტის დაყენების შეცდომა: %s"

View file

@ -404,18 +404,10 @@ msgstr ""
msgid "Create _Child User"
msgstr "_Criar usuário filho"
#: malcontent-control/main.ui:182
msgid "No Standard User Accounts"
msgstr "Não há conta de usuário padrão"
#: malcontent-control/main.ui:202
msgid "Loading…"
msgstr "Carregando…"
#: malcontent-control/main.ui:210
msgid "_User Settings"
msgstr "Configurações do _Usuário"
#: malcontent-control/main.ui:265
msgid "_Help"
msgstr "Aj_uda"

465
po/ru.po
View file

@ -6,384 +6,377 @@
msgid ""
msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2023-10-13 16:18+0000\n"
"PO-Revision-Date: 2023-10-29 01:03+1000\n"
"Last-Translator: Ser82-png <asvmail.as@gmail.com>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-10 12:04+0100\n"
"PO-Revision-Date: 2020-04-15 13:42+0100\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 3.0.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
msgstr "Изменение собственного фильтра приложений"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:5
msgid "Authentication is required to change your app filter."
msgstr "Для изменения своего фильтра приложений требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:14
msgid "Read your own app filter"
msgstr "Чтение собственного фильтра приложений"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:15
msgid "Authentication is required to read your app filter."
msgstr "Для чтения своего фильтра приложений требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:24
msgid "Change another users app filter"
msgstr "Изменение фильтра приложений другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:25
msgid "Authentication is required to change another users app filter."
msgstr ""
"Для изменения фильтра приложений другого пользователя требуется "
"идентификация."
#: accounts-service/com.endlessm.ParentalControls.policy.in:34
msgid "Read another users app filter"
msgstr "Чтение фильтра приложений другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:35
msgid "Authentication is required to read another users app filter."
msgstr ""
"Для чтения фильтра приложений другого пользователя требуется идентификация."
#: accounts-service/com.endlessm.ParentalControls.policy.in:44
msgid "Change your own session limits"
msgstr "Изменение ограничений собственного сеанса"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:45
msgid "Authentication is required to change your session limits."
msgstr "Для изменения ограничений собственного сеанса требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:54
msgid "Read your own session limits"
msgstr "Чтение ограничений собственного сеанса"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:55
msgid "Authentication is required to read your session limits."
msgstr "Для чтения ограничений собственного сеанса требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:64
msgid "Change another users session limits"
msgstr "Изменение ограничений сеанса другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:65
msgid "Authentication is required to change another users session limits."
msgstr ""
"Для изменения ограничений сеанса другого пользователя требуется "
"идентификация."
#: accounts-service/com.endlessm.ParentalControls.policy.in:74
msgid "Read another users session limits"
msgstr "Чтение ограничений сеанса другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:75
msgid "Authentication is required to read another users session limits."
msgstr ""
"Для чтения ограничений сеанса другого пользователя требуется идентификация."
#: accounts-service/com.endlessm.ParentalControls.policy.in:84
msgid "Change your own account info"
msgstr "Изменение данных своей учётной записи"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:85
msgid "Authentication is required to change your account info."
msgstr "Для изменения данных своей учётной записи требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:94
msgid "Read your own account info"
msgstr "Чтение данных своей учётной записи"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:95
msgid "Authentication is required to read your account info."
msgstr "Для чтения данных своей учётной записи требуется идентификация."
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:104
msgid "Change another users account info"
msgstr "Изменение данных учётной записи другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:105
msgid "Authentication is required to change another users account info."
msgstr ""
"Для изменения данных учётной записи другого пользователя требуется "
"идентификация."
#: accounts-service/com.endlessm.ParentalControls.policy.in:114
msgid "Read another users account info"
msgstr "Чтение данных учётной записи другого пользователя"
msgstr ""
#: accounts-service/com.endlessm.ParentalControls.policy.in:115
msgid "Authentication is required to read another users account info."
msgstr ""
"Для чтения данных учётной записи другого пользователя требуется "
"идентификация."
#: libmalcontent/app-filter.c:694
#, c-format
msgid "App filter for user %u was in an unrecognized format"
msgstr "Фильтр приложений для пользователя %u записан в неизвестном формате"
msgstr ""
#: libmalcontent/app-filter.c:725
#, c-format
msgid "OARS filter for user %u has an unrecognized kind %s"
msgstr "Фильтр OARS для пользователя %u имеет неизвестный тип «%s»"
#: libmalcontent/manager.c:283 libmalcontent/manager.c:420
#: libmalcontent/manager.c:803
#, c-format
msgid "Not allowed to query parental controls data for user %u"
msgstr ""
"Запрещено запрашивать данные родительского контроля для пользователя %u"
#: libmalcontent/manager.c:283 libmalcontent/manager.c:412
#, c-format
msgid "Not allowed to query app filter data for user %u"
msgstr ""
#: libmalcontent/manager.c:288
#, c-format
msgid "User %u does not exist"
msgstr "Пользователь %u не существует"
msgstr ""
#: libmalcontent/manager.c:296
msgid "System accounts service not available"
msgstr "Служба системных учётных записей недоступна"
#: libmalcontent/manager.c:402
#: libmalcontent/manager.c:394
msgid "App filtering is globally disabled"
msgstr "Фильтрация приложений отключена глобально"
msgstr ""
#: libmalcontent/manager.c:785
#: libmalcontent/manager.c:777
msgid "Session limits are globally disabled"
msgstr "Ограничения сеанса отключены глобально"
msgstr ""
#: libmalcontent/manager.c:795
#, c-format
msgid "Not allowed to query session limits data for user %u"
msgstr ""
#: libmalcontent/session-limits.c:306
#, c-format
msgid "Session limit for user %u was in an unrecognized format"
msgstr "Ограничение сеанса для пользователя %u записаны в неизвестном формате"
msgstr ""
#: libmalcontent/session-limits.c:328
#, c-format
msgid "Session limit for user %u has an unrecognized type %u"
msgstr "Ограничение сеанса для пользователя %u имеет неизвестный тип «%u»"
msgstr ""
#: libmalcontent/session-limits.c:346
#, c-format
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr ""
"Ограничение сеанса для пользователя %u имеет недопустимое ежедневное "
"расписание %u%u"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr ""
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr ""
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:256
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr "Запретить %s использовать следующие установленные приложения."
msgstr ""
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "Ограничение доступа к приложениям"
msgstr ""
#: libmalcontent-ui/restrict-applications-dialog.ui:22
msgid "Search for applications…"
msgstr "Поиск приложений…"
#: libmalcontent-ui/restrict-applications-selector.ui:13
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "Не найдено приложений, доступ к которым ограничен."
msgstr ""
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:198 libmalcontent-ui/user-controls.c:209
#: libmalcontent-ui/user-controls.c:242 libmalcontent-ui/user-controls.c:253
msgid "unknown"
msgstr "неизвестный"
msgstr ""
#: libmalcontent-ui/user-controls.c:303 libmalcontent-ui/user-controls.c:388
#: libmalcontent-ui/user-controls.c:641
#: libmalcontent-ui/user-controls.c:338 libmalcontent-ui/user-controls.c:425
#: libmalcontent-ui/user-controls.c:711
msgid "All Ages"
msgstr "Все возрастные группы"
msgstr ""
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:470
#: libmalcontent-ui/user-controls.c:514
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
"available in other applications."
msgstr ""
"Запретить %s запускать веб-браузеры. Ограниченный веб-контент может быть "
"доступен в других приложениях."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:475
#: libmalcontent-ui/user-controls.c:519
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "Запретить %s использование указанных приложений."
msgstr ""
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:480
#: libmalcontent-ui/user-controls.c:524
#, c-format
msgid "Prevents %s from installing applications."
msgstr "Запретить %s устанавливать приложения."
#: libmalcontent-ui/user-controls.ui:25
msgid "Application Usage Restrictions"
msgstr "Ограничения на использование приложений"
#: libmalcontent-ui/user-controls.ui:28
msgid "Restrict _Web Browsers"
msgstr "Ограничить доступ к _Веб-браузерам"
#: libmalcontent-ui/user-controls.ui:51
msgid "_Restrict Applications"
msgstr "_Ограничить доступ к приложениям"
#: libmalcontent-ui/user-controls.ui:73
msgid "Software Installation Restrictions"
msgstr "Ограничения на установку программного обеспечения"
#: libmalcontent-ui/user-controls.ui:77
msgid "Restrict Application _Installation"
msgstr "Ограничить _установку приложений"
#: libmalcontent-ui/user-controls.ui:99
msgid "Application _Suitability"
msgstr "_Пригодность приложений"
#: libmalcontent-ui/user-controls.ui:102
msgid ""
"Restricts the browsing or installation of applications unsuitable for this "
"age or younger."
msgstr ""
"Ограничить просмотр или установку приложений неподходящих для этой "
"возрастной группы."
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
msgid "User to select in the UI"
msgstr "Пользователь для выбора в пользовательском интерфейсе"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:529
#, c-format
msgid "Applications installed by %s will not appear for other users."
msgstr ""
#. Translators: This is a placeholder for a command line argument value:
#: malcontent-control/application.c:104
msgid "USERNAME"
msgstr "ПОЛЬЗОВАТЕЛЬ"
#: libmalcontent-ui/user-controls.ui:17
msgid "Application Usage Restrictions"
msgstr ""
#: malcontent-control/application.c:116
msgid "— view and edit parental controls"
msgstr "— просмотр и редактирование родительского контроя"
#: libmalcontent-ui/user-controls.ui:68
msgid "Restrict _Web Browsers"
msgstr ""
#: libmalcontent-ui/user-controls.ui:152
msgid "_Restrict Applications"
msgstr ""
#: libmalcontent-ui/user-controls.ui:231
msgid "Software Installation Restrictions"
msgstr ""
#: libmalcontent-ui/user-controls.ui:281
msgid "Restrict Application _Installation"
msgstr ""
#: libmalcontent-ui/user-controls.ui:366
msgid "Restrict Application Installation for _Others"
msgstr ""
#: libmalcontent-ui/user-controls.ui:451
msgid "Application _Suitability"
msgstr ""
#: libmalcontent-ui/user-controls.ui:473
msgid ""
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:123 malcontent-control/main.ui:17
#: malcontent-control/application.c:105 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "Родительский контроль"
msgstr ""
#: malcontent-control/application.c:309
#: malcontent-control/application.c:270
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr ""
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:314
#: malcontent-control/application.c:275
msgid "translator-credits"
msgstr "Ser82-png <asvmail.as@gmail.com>, 2022-2023"
msgstr ""
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:320
#: malcontent-control/application.c:281
msgid "Malcontent Website"
msgstr "Веб-сайт Malcontent"
#: malcontent-control/application.c:341
msgid "The help contents could not be displayed"
msgstr "Содержание справки не может быть отображено"
#: malcontent-control/application.c:388
msgid "Failed to load user data from the system"
msgstr "Не удалось загрузить пользовательские данные из системы"
#: malcontent-control/application.c:390
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr "Убедитесь, что служба AccountsService установлена и включена."
#. Translators: Replace the link to commonsensemedia.org with some
#. * localised guidance for parents/carers on how to set restrictions on
#. * their child/caree in a responsible way which is in keeping with the
#. * best practice and culture of the region. If no suitable localised
#. * guidance exists, and if the default commonsensemedia.org link is not
#. * suitable, please file an issue against malcontent so we can discuss
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:421
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
"conversation with %s. <a href='https://www.commonsensemedia.org/privacy-and-"
"internet-safety'>Read guidance</a> on what to consider."
msgstr ""
"Рекомендуется устанавливать эти ограничения как дополнение к беседе с %s. <a "
"href='https://www.commonsensemedia.org/privacy-and-internet-"
"safety'>Ознакомьтесь с инструкцией</a> о том, что нужно учитывать."
#: malcontent-control/carousel.ui:38
#: malcontent-control/application.c:299
msgid "The help contents could not be displayed"
msgstr ""
#: malcontent-control/application.c:336
msgid "Failed to load user data from the system"
msgstr ""
#: malcontent-control/application.c:338
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr ""
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "Предыдущая страница"
msgstr ""
#: malcontent-control/carousel.ui:57
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "Следующая страница"
msgstr ""
#: malcontent-control/main.ui:87
#: malcontent-control/main.ui:93
msgid "Permission Required"
msgstr "Требуется разрешение"
msgstr ""
#: malcontent-control/main.ui:88
#: malcontent-control/main.ui:107
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"Требуется разрешение для просмотра и изменения настроек родительского "
"контроля пользователя."
#: malcontent-control/main.ui:110
msgid "No Standard User Accounts"
msgstr "Нет обычных учётных записей пользователей"
#: malcontent-control/main.ui:111
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
#: malcontent-control/main.ui:148
msgid "No Child Users Configured"
msgstr ""
"Родительский контроль может быть применен только к обычным учётным\n"
"записям пользователей. Такие записи можно создать в настройках пользователя."
#: malcontent-control/main.ui:115
msgid "_User Settings"
msgstr "Настройки _пользователя"
#: malcontent-control/main.ui:162
msgid ""
"No child users are currently set up on the system. Create one before setting "
"up their parental controls."
msgstr ""
#: malcontent-control/main.ui:138
#: malcontent-control/main.ui:174
msgid "Create _Child User"
msgstr ""
#: malcontent-control/main.ui:202
msgid "Loading…"
msgstr "Загрузка…"
msgstr ""
#: malcontent-control/main.ui:171
#: malcontent-control/main.ui:265
msgid "_Help"
msgstr "_Справка"
#: malcontent-control/main.ui:175
#: malcontent-control/main.ui:269
msgid "_About Parental Controls"
msgstr "_О родительском контроле"
msgstr ""
#. Translators: the brief summary of the application as it appears in a software center.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:12
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:4
msgid "Set parental controls and monitor usage by users"
msgstr ""
"Создание родительского контроля и управление использованием компьютера для "
"каждого пользователя"
#. Translators: These are the application description paragraphs in the AppData file.
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:16
@ -392,37 +385,67 @@ msgid ""
"use the computer for, what software they can install, and what installed "
"software they can run."
msgstr ""
"Управление ограничениями родительского контроля, позволяет контролировать "
"время использования компьютера, какое программное обеспечение вы можете "
"установить и какое уже установленное программное обеспечение разрешено "
"запускать."
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:25
msgid "Main window"
msgstr "Главное окно"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:39
msgid "The GNOME Project"
msgstr "Проект GNOME"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:50
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:59
msgid "Minor improvements to parental controls application UI"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:51
msgid "Add a user manual"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:52
msgid "Translation updates"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:60
msgid "Translations to Ukrainian and Polish"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:67
msgid "Improve parental controls application UI and add icon"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:68
msgid "Support for indicating which accounts are parent accounts"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:75
msgid "Initial release of basic parental controls application"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:76
msgid "Support for setting app installation and run restrictions on users"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:83
msgid "Maintenance release of underlying parental controls library"
msgstr ""
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:7
msgid "org.freedesktop.MalcontentControl"
msgstr ""
#. Translators: Search terms to find this application. Do NOT translate or localise the semicolons! The list MUST also end with a semicolon!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:14
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:13
msgid ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
msgstr ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;родительский контроль;ребенок;ограничение;"
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:9
msgid "Manage parental controls"
msgstr "Управление родительским контролем"
msgstr ""
#: malcontent-control/org.freedesktop.MalcontentControl.policy.in:10
msgid "Authentication is required to read and change user parental controls"
msgstr ""
"Для просмотра и внесения изменений в родительский контроль пользователя "
"требуется идентификация"
#: malcontent-control/user-selector.c:426
msgid "Your account"
@ -433,52 +456,22 @@ msgstr "Ваша учётная запись"
#: pam/pam_malcontent.c:142 pam/pam_malcontent.c:188
#, c-format
msgid "User %s has no time limits enabled"
msgstr "Пользователь «%s» не имеет ограничений по времени"
msgstr ""
#: pam/pam_malcontent.c:151 pam/pam_malcontent.c:172
#, c-format
msgid "Error getting session limits for user %s: %s"
msgstr ""
"Ошибка при попытке получить данные об ограничениях сеанса пользователя «%s»: "
"%s"
#: pam/pam_malcontent.c:182
#, c-format
msgid "User %s has no time remaining"
msgstr "У пользователя «%s» не осталось времени"
msgstr ""
#: pam/pam_malcontent.c:200
#, c-format
msgid "Error setting time limit on login session: %s"
msgstr "Ошибка установки ограничения времени на сеанс входа в систему: %s"
#, c-format
#~ msgid "%s (%s)"
#~ msgstr "%s (%s)"
#~ msgid "General"
#~ msgstr "Общие"
#~ msgid "ALL"
#~ msgstr "ВСЕ"
#~ msgid "Adults Only"
#~ msgstr "Только для взрослых"
#~ msgid "Mature"
#~ msgstr "Для повзрослевшых"
#~ msgid "Teen"
#~ msgstr "Для подростков"
#~ msgid "Everyone 10+"
#~ msgstr "Для всех старше 10"
#~ msgid "Everyone"
#~ msgstr "Для всех"
#~ msgid "Early Childhood"
#~ msgstr "Для маленьких"
msgstr ""
#~ msgid "No cartoon violence"
#~ msgstr "Отсутствуют сцены мультипликационного насилия"

164
po/sv.po
View file

@ -1,16 +1,16 @@
# Swedish translations for malcontent package.
# Copyright © 2020-2023 malcontent's COPYRIGHT HOLDER
# Copyright (C) 2020 THE malcontent'S COPYRIGHT HOLDER
# This file is distributed under the same license as the malcontent package.
# Automatically generated, 2020.
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2020, 2023.
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: malcontent\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2023-10-13 16:18+0000\n"
"PO-Revision-Date: 2023-10-20 21:11+0200\n"
"POT-Creation-Date: 2020-12-09 03:28+0000\n"
"PO-Revision-Date: 2020-12-17 18:28+0100\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.4\n"
"X-Generator: Poedit 2.4.2\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
msgid "Change your own app filter"
@ -165,36 +165,79 @@ msgstr "Sessionsgräns för användare %u har en okänd typ ”%u”"
msgid "Session limit for user %u has invalid daily schedule %u%u"
msgstr "Sessionsgräns för användare %u har ett ogiltigt dagsschema %u%u"
#. TRANSLATORS: This is the formatting of English and localized name
#. of the rating e.g. "Adults Only (solo adultos)"
#: libmalcontent-ui/gs-content-rating.c:75
#, c-format
msgid "%s (%s)"
msgstr "%s (%s)"
# Alla åldrar i MDA-systemet
#: libmalcontent-ui/gs-content-rating.c:209
msgid "General"
msgstr "Alla"
#: libmalcontent-ui/gs-content-rating.c:218
msgid "ALL"
msgstr "ALLA"
#: libmalcontent-ui/gs-content-rating.c:222
#: libmalcontent-ui/gs-content-rating.c:485
msgid "Adults Only"
msgstr "Endast för vuxna"
#: libmalcontent-ui/gs-content-rating.c:224
#: libmalcontent-ui/gs-content-rating.c:484
msgid "Mature"
msgstr "Mogen"
#: libmalcontent-ui/gs-content-rating.c:226
#: libmalcontent-ui/gs-content-rating.c:483
msgid "Teen"
msgstr "Tonåring"
#: libmalcontent-ui/gs-content-rating.c:228
#: libmalcontent-ui/gs-content-rating.c:482
msgid "Everyone 10+"
msgstr "Alla över 10 år"
#: libmalcontent-ui/gs-content-rating.c:230
#: libmalcontent-ui/gs-content-rating.c:481
msgid "Everyone"
msgstr "Alla"
#: libmalcontent-ui/gs-content-rating.c:232
#: libmalcontent-ui/gs-content-rating.c:480
msgid "Early Childhood"
msgstr "Tidig barndom"
#. Translators: the placeholder is a users full name
#: libmalcontent-ui/restrict-applications-dialog.c:256
#: libmalcontent-ui/restrict-applications-dialog.c:222
#, c-format
msgid "Restrict %s from using the following installed applications."
msgstr "Begränsa %s från att använda följande installerade program."
#: libmalcontent-ui/restrict-applications-dialog.ui:6
#: libmalcontent-ui/restrict-applications-dialog.ui:12
msgid "Restrict Applications"
msgstr "Begränsa program"
#: libmalcontent-ui/restrict-applications-dialog.ui:22
msgid "Search for applications…"
msgstr "Sök efter program…"
#: libmalcontent-ui/restrict-applications-selector.ui:13
#: libmalcontent-ui/restrict-applications-selector.ui:24
msgid "No applications found to restrict."
msgstr "Inga program att begränsa hittades."
#. Translators: this is the full name for an unknown user account.
#: libmalcontent-ui/user-controls.c:198 libmalcontent-ui/user-controls.c:209
#: libmalcontent-ui/user-controls.c:207 libmalcontent-ui/user-controls.c:218
msgid "unknown"
msgstr "okänd"
#: libmalcontent-ui/user-controls.c:303 libmalcontent-ui/user-controls.c:388
#: libmalcontent-ui/user-controls.c:641
#: libmalcontent-ui/user-controls.c:312 libmalcontent-ui/user-controls.c:397
#: libmalcontent-ui/user-controls.c:669
msgid "All Ages"
msgstr "Alla åldrar"
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:470
#: libmalcontent-ui/user-controls.c:477
#, c-format
msgid ""
"Prevents %s from running web browsers. Limited web content may still be "
@ -204,48 +247,48 @@ msgstr ""
"fortfarande finnas tillgängligt i andra program."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:475
#: libmalcontent-ui/user-controls.c:482
#, c-format
msgid "Prevents specified applications from being used by %s."
msgstr "Förhindrar angivna program från att användas av %s."
#. Translators: The placeholder is a users display name.
#: libmalcontent-ui/user-controls.c:480
#: libmalcontent-ui/user-controls.c:487
#, c-format
msgid "Prevents %s from installing applications."
msgstr "Förhindrar %s från att installera program."
#: libmalcontent-ui/user-controls.ui:25
#: libmalcontent-ui/user-controls.ui:16
msgid "Application Usage Restrictions"
msgstr "Begränsningar av programanvändning"
#: libmalcontent-ui/user-controls.ui:28
#: libmalcontent-ui/user-controls.ui:67
msgid "Restrict _Web Browsers"
msgstr "Begränsa _webbläsare"
#: libmalcontent-ui/user-controls.ui:51
#: libmalcontent-ui/user-controls.ui:151
msgid "_Restrict Applications"
msgstr "_Begränsa program"
#: libmalcontent-ui/user-controls.ui:73
#: libmalcontent-ui/user-controls.ui:230
msgid "Software Installation Restrictions"
msgstr "Begränsningar av programvaruinstallation"
#: libmalcontent-ui/user-controls.ui:77
#: libmalcontent-ui/user-controls.ui:280
msgid "Restrict Application _Installation"
msgstr "Begränsa _installation av program"
#: libmalcontent-ui/user-controls.ui:99
#: libmalcontent-ui/user-controls.ui:365
msgid "Application _Suitability"
msgstr "_Lämplighet för program"
#: libmalcontent-ui/user-controls.ui:102
#: libmalcontent-ui/user-controls.ui:387
msgid ""
"Restricts the browsing or installation of applications unsuitable for this "
"age or younger."
"Restricts browsing or installation of applications to applications suitable "
"for certain ages or above."
msgstr ""
"Begränsar bläddring bland eller installation av program som är olämpliga för "
"denna ålder och yngre."
"Begränsar bläddring bland eller installation av program till program som är "
"lämpliga för vissa åldrar och uppåt."
#. Translators: This documents the --user command line option to malcontent-control:
#: malcontent-control/application.c:102
@ -257,44 +300,44 @@ msgstr "Användare att välja i användargränssnittet"
msgid "USERNAME"
msgstr "ANVÄNDARNAMN"
#: malcontent-control/application.c:116
#: malcontent-control/application.c:115
msgid "— view and edit parental controls"
msgstr "— visa och redigera föräldrakontroller"
#. Translators: This is the title of the main window
#. Translators: the name of the application as it appears in a software center
#: malcontent-control/application.c:123 malcontent-control/main.ui:17
#: malcontent-control/application.c:122 malcontent-control/main.ui:12
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:9
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:3
msgid "Parental Controls"
msgstr "Föräldrakontroller"
#: malcontent-control/application.c:309
#: malcontent-control/application.c:308
msgid "Copyright © 2019, 2020 Endless Mobile, Inc."
msgstr "Copyright © 2019, 2020 Endless Mobile, Inc."
#. Translators: this should be "translated" to the
#. names of people who have translated Malcontent into
#. this language, one per line.
#: malcontent-control/application.c:314
#: malcontent-control/application.c:313
msgid "translator-credits"
msgstr "Anders Jonsson <anders.jonsson@norsjovallen.se>"
#. Translators: "Malcontent" is the brand name of this
#. project, so should not be translated.
#: malcontent-control/application.c:320
#: malcontent-control/application.c:319
msgid "Malcontent Website"
msgstr "Webbplats för Malcontent"
#: malcontent-control/application.c:341
#: malcontent-control/application.c:337
msgid "The help contents could not be displayed"
msgstr "Hjälpinnehållet kunde inte visas"
#: malcontent-control/application.c:388
#: malcontent-control/application.c:374
msgid "Failed to load user data from the system"
msgstr "Misslyckades med att läsa in användardata från systemet"
#: malcontent-control/application.c:390
#: malcontent-control/application.c:376
msgid "Please make sure that the AccountsService is installed and enabled."
msgstr "Försäkra dig om att AccountsService är installerat och aktiverat."
@ -307,7 +350,7 @@ msgstr "Försäkra dig om att AccountsService är installerat och aktiverat."
#. * further!
#. * https://gitlab.freedesktop.org/pwithnall/malcontent/-/issues/new
#.
#: malcontent-control/application.c:421
#: malcontent-control/application.c:407
#, c-format
msgid ""
"Its recommended that restrictions are set as part of an ongoing "
@ -319,30 +362,30 @@ msgstr ""
"internet-safety'>Du kan läsa denna guide</a> (på engelska) om vad som finns "
"att ta i beaktande."
#: malcontent-control/carousel.ui:38
#: malcontent-control/carousel.ui:48
msgid "Previous Page"
msgstr "Föregående sida"
#: malcontent-control/carousel.ui:57
#: malcontent-control/carousel.ui:74
msgid "Next Page"
msgstr "Nästa sida"
#: malcontent-control/main.ui:87
#: malcontent-control/main.ui:115
msgid "Permission Required"
msgstr "Behörighet krävs"
#: malcontent-control/main.ui:88
#: malcontent-control/main.ui:129
msgid ""
"Permission is required to view and change user parental controls settings."
msgstr ""
"Behörighet krävs för att visa och ändra inställningar för föräldrakontroll "
"för användare."
#: malcontent-control/main.ui:110
#: malcontent-control/main.ui:182
msgid "No Standard User Accounts"
msgstr "Inga standardanvändarkonton"
#: malcontent-control/main.ui:111
#: malcontent-control/main.ui:197
msgid ""
"Parental controls can only be applied to standard user\n"
"accounts. These can be created in the user settings."
@ -351,19 +394,19 @@ msgstr ""
"standardanvändarkonton. Dessa kan skapas i\n"
"användarinställningarna."
#: malcontent-control/main.ui:115
#: malcontent-control/main.ui:210
msgid "_User Settings"
msgstr "_Användarinställningar"
#: malcontent-control/main.ui:138
#: malcontent-control/main.ui:238
msgid "Loading…"
msgstr "Läser in…"
#: malcontent-control/main.ui:171
#: malcontent-control/main.ui:301
msgid "_Help"
msgstr "_Hjälp"
#: malcontent-control/main.ui:175
#: malcontent-control/main.ui:305
msgid "_About Parental Controls"
msgstr "_Om Föräldrakontroller"
@ -388,12 +431,12 @@ msgstr ""
msgid "Main window"
msgstr "Huvudfönster"
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:39
#: malcontent-control/org.freedesktop.MalcontentControl.appdata.xml.in:38
msgid "The GNOME Project"
msgstr "GNOME-projektet"
#. Translators: Search terms to find this application. Do NOT translate or localise the semicolons! The list MUST also end with a semicolon!
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:14
#: malcontent-control/org.freedesktop.MalcontentControl.desktop.in:13
msgid ""
"parental controls;screen time;app restrictions;web browser restrictions;oars;"
"usage;usage limit;kid;child;"
@ -435,3 +478,26 @@ msgstr "Användaren ”%s” har ingen återstående tid"
#, c-format
msgid "Error setting time limit on login session: %s"
msgstr "Fel vid inställning av tidsgräns på inloggningssession: %s"
#~ msgid "Not allowed to query session limits data for user %u"
#~ msgstr "Ej tillåtet att efterfråga sessionsgränsdata för användare %u"
#~ msgid "Applications installed by %s will not appear for other users."
#~ msgstr "Program installerade av %s kommer inte visas för andra användare."
# Systeminstallation ej tillåtet, användaren kan bara installera åt sig själv
#~ msgid "Restrict Application Installation for _Others"
#~ msgstr "Begränsa installation av program åt _andra"
#~ msgid "No Child Users Configured"
#~ msgstr "Inga barnanvändare konfigurerade"
#~ msgid ""
#~ "No child users are currently set up on the system. Create one before "
#~ "setting up their parental controls."
#~ msgstr ""
#~ "Inga barnanvändare har konfigurerats på systemet. Skapa en innan du "
#~ "konfigurerar deras föräldrakontroller."
#~ msgid "Create _Child User"
#~ msgstr "Skapa _barnanvändare"

View file

@ -11,15 +11,15 @@ msgstr ""
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pwithnall/malcontent/"
"issues\n"
"POT-Creation-Date: 2022-05-18 03:25+0000\n"
"PO-Revision-Date: 2023-03-09 03:35+0300\n"
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
"PO-Revision-Date: 2022-05-18 17:06+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.1.1\n"
"X-Generator: Poedit 3.0.1\n"
"X-POOTLE-MTIME: 1434043811.000000\n"
#: accounts-service/com.endlessm.ParentalControls.policy.in:4
@ -288,7 +288,7 @@ msgstr "Uygulama _Kurulumunu Kısıtla"
#: libmalcontent-ui/user-controls.ui:367
msgid "Application _Suitability"
msgstr "Uygulama _Uygunluğu"
msgstr "Uygulama _Elverişliliği"
# Biraz serbest çeviri oldu.
#: libmalcontent-ui/user-controls.ui:389

View file

@ -1,4 +0,0 @@
[wrap-git]
url = https://gitlab.gnome.org/GNOME/libadwaita.git
revision = 1.1.0
depth = 1