Adding upstream version 0.10.96~24-gd87b750.
This commit is contained in:
parent
ad9505eaaf
commit
df848b7b59
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
||||
build
|
2
AUTHORS
2
AUTHORS
@ -2,7 +2,7 @@ Upstream Authors:
|
||||
LXQt team: http://lxqt.org
|
||||
|
||||
Copyright:
|
||||
Copyright (c) 2014 LXQt team
|
||||
Copyright (c) 2014-2016 LXQt team
|
||||
|
||||
License: LGPL-2.1+
|
||||
The full text of the licenses can be found in the 'COPYING' file.
|
||||
|
@ -11,12 +11,6 @@ find_package(Qt5Widgets REQUIRED QUIET)
|
||||
find_package(lxqt REQUIRED QUIET)
|
||||
find_package(KF5WindowSystem REQUIRED QUIET)
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(OOBS REQUIRED
|
||||
glib-2.0
|
||||
liboobs-1
|
||||
)
|
||||
|
||||
include(LXQtCompilerSettings NO_POLICY_SCOPE)
|
||||
include(LXQtTranslate)
|
||||
|
||||
|
73
README.md
Normal file
73
README.md
Normal file
@ -0,0 +1,73 @@
|
||||
# lxqt-admin
|
||||
|
||||
## Overview
|
||||
|
||||
This repository is providing two GUI tools to adjust settings of the operating system LXQt is running on.
|
||||
|
||||
"Time and date configuration", binary `lxqt-admin-time`, can adjust system time and timezone.
|
||||
|
||||

|
||||
|
||||
It is using `systemd-timedated` as backend which is accessed by its D-Bus interface. Among other this means the option
|
||||
to sync the system time by NTP is relying on `systemd-timesyncd` as backend.
|
||||
|
||||
In "User and Group Settings", binary `lxqt-admin-user`, users and groups of the operating system can be modified.
|
||||
|
||||

|
||||
|
||||
The backend is a script `lxqt-admin-user-helper`. By default it is in turn using the shadow tools to do the actual work.
|
||||
The script can be modified to use different tools, though.
|
||||
|
||||
Both are using [polkit](https://www.freedesktop.org/wiki/Software/polkit/) to handle permissions. So polkit and a corresponding
|
||||
authentication agent are needed at runtime. As for LXQt sessions [lxqt-policykit](https://github.com/lxde/lxqt-policykit/)
|
||||
is the first choice.
|
||||
|
||||
Earlier versions of lxqt-admin were relying on [system-tools-backends](http://system-tools-backends.freedesktop.org)
|
||||
and their wrapper [liboobs](https://github.com/GNOME/liboobs). These were replaced as both go unmaintained for years and
|
||||
were hence dropped from many distributions heavily restricting the usage of lxqt-admin.
|
||||
As long as they can be built it should still be possible to compile lxqt-admin release ≤ 0.10 against them in order
|
||||
to make use of it on platforms lacking systemd like BSD.
|
||||
|
||||
## Installing
|
||||
|
||||
### Compiling sources
|
||||
|
||||
Build dependencies are Git, CMake, qttools to handle localization as well as library [liblxqt](https://github.com/lxde/liblxqt)
|
||||
and its dependency [libqtxdg](https://github.com/lxde/libqtxdg).
|
||||
By default lxqt-admin is pulling translations from repository [translations](https://github.com/lxde/translations/) at
|
||||
compile time, see file README.md of the latter.
|
||||
|
||||
To compile, run `cmake`, `make` and `make install`.
|
||||
`cmake` can be invoked in an out of source build directory and will normally need variable `-DCMAKE_INSTALL_PREFIX=/usr`.
|
||||
`make install` can be invoked with `DESTDIR=<some path>`.
|
||||
|
||||
### Binary packages
|
||||
|
||||
#### Arch Linux
|
||||
|
||||
[AUR](https://aur.archlinux.org) packages `lxqt-admin` and `lxqt-admin-git` are providing the current stable release and the
|
||||
actual master checkout at compile time as usual.
|
||||
Note that package `lxqt-admin` had to be kept in the AUR due to lack of the dependency liboobs as depicted [above](#overview).
|
||||
So it will be transferred to community as of release 0.11.
|
||||
|
||||
#### Debian
|
||||
|
||||
Package `lxqt-admin` is available in the official repositories as of Debian stretch.
|
||||
|
||||
#### Fedora
|
||||
|
||||
Fedora doesn't provide lxqt-admin so far due to lack of the dependency liboobs as depicted [above](#overview). This will hopefully change
|
||||
once release LXQt release 0.11 makes it into the Fedora repositories.
|
||||
|
||||
#### openSUSE
|
||||
|
||||
openSUSE does not ship with lxqt-admin in it's standard repositories since the functionality is covered by openSUSE's [YaST](http://yast.github.io/).
|
||||
However it is still possible to install it on openSUSE. The package and its dependencies, like the [above](#overview) mentioned, outdated liboobs are available through the [X11:LXQt](https://build.opensuse.org/project/show/X11:LXQt) repository.
|
||||
|
||||
## Usage
|
||||
|
||||
Both GUIs can be launched from GUI "Configuration Center" of [lxqt-config](https://github.com/lxde/lxqt-config) and are available
|
||||
in LXQt panel's main menu at Preferences - LXQt settings as well.
|
||||
|
||||
The actual usage should be self-explanatory. To apply settings the GUI of the polkit authentication agent that's in use is
|
||||
launched to acquire the root password.
|
BIN
lxqt-admin-time.png
Normal file
BIN
lxqt-admin-time.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
@ -3,13 +3,13 @@ project(lxqt-admin-time)
|
||||
# build static helper class first
|
||||
include_directories (
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${OOBS_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set ( lxqt-admin-time_HDRS
|
||||
timeadmindialog.h
|
||||
datetime.h
|
||||
timezone.h
|
||||
timedatectl.h
|
||||
)
|
||||
|
||||
set ( lxqt-admin-time_SRCS
|
||||
@ -17,6 +17,7 @@ set ( lxqt-admin-time_SRCS
|
||||
timeadmindialog.cpp
|
||||
datetime.cpp
|
||||
timezone.cpp
|
||||
timedatectl.cpp
|
||||
)
|
||||
|
||||
set ( lxqt-admin-time_MOCS
|
||||
@ -42,6 +43,16 @@ lxqt_translate_ts(lxqt-admin-time_QM_FILES
|
||||
${lxqt-admin-time_UIS}
|
||||
INSTALL_DIR
|
||||
"${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}"
|
||||
PULL_TRANSLATIONS
|
||||
${PULL_TRANSLATIONS}
|
||||
CLEAN_TRANSLATIONS
|
||||
${CLEAN_TRANSLATIONS}
|
||||
TRANSLATIONS_REPO
|
||||
${TRANSLATIONS_REPO}
|
||||
TRANSLATIONS_REFSPEC
|
||||
${TRANSLATIONS_REFSPEC}
|
||||
REPO_SUBDIR
|
||||
"lxqt-admin/${PROJECT_NAME}"
|
||||
)
|
||||
|
||||
lxqt_translate_desktop(DESKTOP_FILES
|
||||
@ -64,8 +75,8 @@ add_executable(lxqt-admin-time
|
||||
target_link_libraries(lxqt-admin-time
|
||||
KF5::WindowSystem
|
||||
Qt5::Widgets
|
||||
Qt5::DBus
|
||||
lxqt
|
||||
${OOBS_LIBRARIES}
|
||||
)
|
||||
|
||||
install(TARGETS lxqt-admin-time RUNTIME DESTINATION bin)
|
||||
|
@ -31,15 +31,16 @@
|
||||
#include <QTimer>
|
||||
#include <QTextCharFormat>
|
||||
|
||||
DateTime::DateTime(QWidget *parent) :
|
||||
DateTimePage::DateTimePage(bool useNtp, bool localRtc, QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::DateTime)
|
||||
ui(new Ui::DateTime),
|
||||
mUseNtp(useNtp),
|
||||
mLocalRtc(localRtc)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
mTimer = new QTimer(this);
|
||||
connect(mTimer,SIGNAL(timeout()),SLOT(timeout()));
|
||||
|
||||
|
||||
//highlight today
|
||||
QDate date = QDate::currentDate();
|
||||
QTextCharFormat format = ui->calendar->dateTextFormat(date);
|
||||
@ -51,43 +52,56 @@ DateTime::DateTime(QWidget *parent) :
|
||||
reload();
|
||||
}
|
||||
|
||||
DateTime::~DateTime()
|
||||
DateTimePage::~DateTimePage()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void DateTime::timeout()
|
||||
void DateTimePage::timeout()
|
||||
{
|
||||
ui->edit_time->blockSignals(true);
|
||||
ui->edit_time->setTime(QTime::currentTime());
|
||||
ui->edit_time->blockSignals(false);
|
||||
}
|
||||
|
||||
void DateTime::reload()
|
||||
void DateTimePage::reload()
|
||||
{
|
||||
ui->calendar->setSelectedDate(QDate::currentDate());
|
||||
ui->edit_time->setTime(QTime::currentTime());
|
||||
|
||||
ui->localRTC->setChecked(mLocalRtc);
|
||||
ui->ntp->setChecked(mUseNtp);
|
||||
|
||||
mTimer->start(1000);
|
||||
|
||||
mModified = 0;
|
||||
emit changed(mModified);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
void DateTime::on_edit_time_userTimeChanged(const QTime &time)
|
||||
void DateTimePage::on_edit_time_userTimeChanged(const QTime &time)
|
||||
{
|
||||
mModified |= M_TIME;
|
||||
mTimer->stop();
|
||||
|
||||
emit changed(mModified);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
QDateTime DateTime::dateTime() const
|
||||
QDateTime DateTimePage::dateTime() const
|
||||
{
|
||||
QDateTime dt(ui->calendar->selectedDate(),ui->edit_time->time());
|
||||
return dt;
|
||||
}
|
||||
|
||||
void DateTime::on_calendar_selectionChanged()
|
||||
bool DateTimePage::useNtp() const
|
||||
{
|
||||
return ui->ntp->isChecked();
|
||||
}
|
||||
|
||||
bool DateTimePage::localRtc() const
|
||||
{
|
||||
return ui->localRTC->isChecked();
|
||||
}
|
||||
|
||||
void DateTimePage::on_calendar_selectionChanged()
|
||||
{
|
||||
QDate date = ui->calendar->selectedDate();
|
||||
if (date != QDate::currentDate())
|
||||
@ -98,6 +112,32 @@ void DateTime::on_calendar_selectionChanged()
|
||||
{
|
||||
mModified &= ~M_DATE;
|
||||
}
|
||||
|
||||
emit changed(mModified);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
void DateTimePage::on_ntp_toggled(bool toggled)
|
||||
{
|
||||
if(toggled != mUseNtp)
|
||||
{
|
||||
mModified |= M_NTP;
|
||||
}
|
||||
else
|
||||
{
|
||||
mModified &= ~M_NTP;
|
||||
}
|
||||
emit changed();
|
||||
}
|
||||
|
||||
void DateTimePage::on_localRTC_toggled(bool toggled)
|
||||
{
|
||||
if(toggled != mLocalRtc)
|
||||
{
|
||||
mModified |= M_LOCAL_RTC;
|
||||
}
|
||||
else
|
||||
{
|
||||
mModified &= ~M_LOCAL_RTC;
|
||||
}
|
||||
emit changed();
|
||||
}
|
||||
|
||||
|
@ -34,38 +34,46 @@ namespace Ui {
|
||||
class DateTime;
|
||||
}
|
||||
|
||||
class DateTime : public QWidget
|
||||
class DateTimePage : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DateTime(QWidget *parent = 0);
|
||||
~DateTime();
|
||||
explicit DateTimePage(bool useNtp, bool localRtc, QWidget *parent = 0);
|
||||
~DateTimePage();
|
||||
|
||||
enum modified_enum {M_DATE = 0x1, M_TIME = 0x2};
|
||||
Q_DECLARE_FLAGS(modified_t, modified_enum)
|
||||
enum ModifiedFlag {M_DATE = (1 << 0), M_TIME = (1 << 1), M_NTP = (1 << 2), M_LOCAL_RTC = (1 << 3)};
|
||||
Q_DECLARE_FLAGS(ModifiedFlags,ModifiedFlag)
|
||||
|
||||
ModifiedFlags modified() const
|
||||
{
|
||||
return mModified;
|
||||
}
|
||||
|
||||
QDateTime dateTime() const;
|
||||
inline modified_t modified() const {return mModified;}
|
||||
bool useNtp() const;
|
||||
bool localRtc() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
void reload();
|
||||
|
||||
|
||||
private Q_SLOTS:
|
||||
void on_edit_time_userTimeChanged(const QTime &time);
|
||||
void timeout();
|
||||
void on_calendar_selectionChanged();
|
||||
void on_ntp_toggled(bool toggled);
|
||||
void on_localRTC_toggled(bool toggled);
|
||||
|
||||
Q_SIGNALS:
|
||||
void changed(bool);
|
||||
void changed();
|
||||
|
||||
private:
|
||||
Ui::DateTime *ui;
|
||||
QTimer * mTimer;
|
||||
modified_t mModified;
|
||||
bool mUseNtp;
|
||||
bool mLocalRtc;
|
||||
ModifiedFlags mModified;
|
||||
};
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(DateTime::modified_t)
|
||||
|
||||
#endif // DATETIME_H
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>354</width>
|
||||
<height>308</height>
|
||||
<width>365</width>
|
||||
<height>323</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
@ -16,7 +16,7 @@
|
||||
<height>50</height>
|
||||
</size>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,1,0,0,0">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_time">
|
||||
<property name="text">
|
||||
@ -64,6 +64,20 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="ntp">
|
||||
<property name="text">
|
||||
<string>Enable network time synchronization (NTP)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="localRTC">
|
||||
<property name="text">
|
||||
<string>RTC is in local time</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
@ -77,24 +91,41 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>ntp</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>calendar</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>221</x>
|
||||
<y>269</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>228</x>
|
||||
<y>162</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>ntp</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>edit_time</receiver>
|
||||
<slot>setDisabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>105</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>173</x>
|
||||
<y>55</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
|
@ -31,82 +31,59 @@
|
||||
#include <QMessageBox>
|
||||
#include <QDateTime>
|
||||
#include <QMap>
|
||||
#include <QDebug>
|
||||
|
||||
#include "datetime.h"
|
||||
#include "timezone.h"
|
||||
|
||||
|
||||
#define ZONETAB_PATH "/usr/share/zoneinfo/zone.tab"
|
||||
|
||||
TimeAdminDialog::TimeAdminDialog(QWidget *parent):
|
||||
LXQt::ConfigDialog(tr("Time and date configuration"),new LXQt::Settings("TimeDate"), parent),
|
||||
mTimeConfig(OOBS_TIME_CONFIG(oobs_time_config_get())),
|
||||
mUserLogedIn(false)
|
||||
LXQt::ConfigDialog(tr("Time and date configuration"),new LXQt::Settings("TimeDate"), parent)
|
||||
{
|
||||
oobs_object_update(OOBS_OBJECT(mTimeConfig));
|
||||
|
||||
setMinimumSize(QSize(400,400));
|
||||
mWindowTitle = windowTitle();
|
||||
|
||||
|
||||
mDateTimeWidget = new DateTime(this);
|
||||
mDateTimeWidget = new DateTimePage(mTimeDateCtl.useNtp(), mTimeDateCtl.localRtc(), this);
|
||||
addPage(mDateTimeWidget,tr("Date and time"));
|
||||
connect(this,SIGNAL(reset()),mDateTimeWidget,SLOT(reload()));
|
||||
connect(mDateTimeWidget,&DateTime::changed,this,&TimeAdminDialog::onChanged);
|
||||
mDateTimeWidget->setProperty("pModified",M_TIMEDATE);
|
||||
connect(mDateTimeWidget,&DateTimePage::changed,this,&TimeAdminDialog::onChanged);
|
||||
|
||||
QStringList zones;
|
||||
QString currentZone;
|
||||
loadTimeZones(zones,currentZone);
|
||||
mTimezoneWidget = new Timezone(zones,currentZone,this);
|
||||
mTimezoneWidget = new TimezonePage(zones,currentZone,this);
|
||||
addPage(mTimezoneWidget,tr("Timezone"));
|
||||
connect(this,&TimeAdminDialog::reset,mTimezoneWidget,&Timezone::reload);
|
||||
connect(mTimezoneWidget,&Timezone::changed,this,&TimeAdminDialog::onChanged);
|
||||
mTimezoneWidget->setProperty("pModified",M_TIMEZONE);
|
||||
connect(this,&TimeAdminDialog::reset,mTimezoneWidget,&TimezonePage::reload);
|
||||
connect(mTimezoneWidget,&TimezonePage::changed,this,&TimeAdminDialog::onChanged);
|
||||
|
||||
setButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
|
||||
connect(this, &LXQt::ConfigDialog::clicked, this, &TimeAdminDialog::onButtonClicked);
|
||||
adjustSize();
|
||||
}
|
||||
|
||||
TimeAdminDialog::~TimeAdminDialog()
|
||||
{
|
||||
if(mTimeConfig)
|
||||
g_object_unref(mTimeConfig);
|
||||
}
|
||||
|
||||
void TimeAdminDialog::onChanged(bool ch)
|
||||
void TimeAdminDialog::onChanged()
|
||||
{
|
||||
widgets_modified_enum flag = (widgets_modified_enum)
|
||||
sender()->property("pModified").toUInt();
|
||||
ch ? mWidgetsModified |= flag : mWidgetsModified &= ~flag;
|
||||
showChangedStar();
|
||||
}
|
||||
|
||||
|
||||
void TimeAdminDialog::showChangedStar()
|
||||
{
|
||||
if (mWidgetsModified)
|
||||
if(mTimezoneWidget->isChanged() || mDateTimeWidget->modified())
|
||||
setWindowTitle(mWindowTitle + "*");
|
||||
else
|
||||
setWindowTitle(mWindowTitle);
|
||||
}
|
||||
|
||||
void TimeAdminDialog::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
//save changes to system
|
||||
if (mWidgetsModified)
|
||||
{
|
||||
if (logInUser())
|
||||
{
|
||||
saveChangesToSystem();
|
||||
event->accept();
|
||||
}
|
||||
else
|
||||
{
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TimeAdminDialog::loadTimeZones(QStringList & timeZones, QString & currentTimezone)
|
||||
{
|
||||
currentTimezone = mTimeDateCtl.timeZone();
|
||||
|
||||
timeZones.clear();
|
||||
QFile file(ZONETAB_PATH);
|
||||
if(file.open(QIODevice::ReadOnly))
|
||||
@ -124,44 +101,61 @@ void TimeAdminDialog::loadTimeZones(QStringList & timeZones, QString & currentTi
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
currentTimezone = QString::fromLatin1(oobs_time_config_get_timezone(mTimeConfig));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TimeAdminDialog::saveChangesToSystem()
|
||||
{
|
||||
QByteArray timeZone = mTimezoneWidget->timezone().toLatin1();
|
||||
// FIXME: currently timezone settings does not work. is this a bug of system-tools-backend?
|
||||
if(!timeZone.isEmpty() && mWidgetsModified.testFlag(M_TIMEZONE))
|
||||
oobs_time_config_set_timezone(mTimeConfig, timeZone.constData());
|
||||
|
||||
if(mWidgetsModified.testFlag(M_TIMEDATE))
|
||||
QString errorMessage;
|
||||
if(mTimezoneWidget->isChanged())
|
||||
{
|
||||
QDate d = mDateTimeWidget->dateTime().date();
|
||||
QTime t = mDateTimeWidget->dateTime().time();
|
||||
// oobs seems to use 0 based month
|
||||
oobs_time_config_set_time(mTimeConfig, d.year(), d.month() - 1, d.day(), t.hour(), t.minute(), t.second());
|
||||
QString timeZone = mTimezoneWidget->timezone();
|
||||
if(!timeZone.isEmpty())
|
||||
{
|
||||
if(false == mTimeDateCtl.setTimeZone(timeZone, errorMessage)) {
|
||||
QMessageBox::critical(this, tr("Error"), errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto modified = mDateTimeWidget->modified();
|
||||
bool useNtp = mDateTimeWidget->useNtp();
|
||||
if(modified.testFlag(DateTimePage::M_NTP))
|
||||
{
|
||||
if(false == mTimeDateCtl.setUseNtp(useNtp, errorMessage)) {
|
||||
QMessageBox::critical(this, tr("Error"), errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
if(modified.testFlag(DateTimePage::M_LOCAL_RTC))
|
||||
{
|
||||
if(false == mTimeDateCtl.setLocalRtc(mDateTimeWidget->localRtc(), errorMessage)) {
|
||||
QMessageBox::critical(this, tr("Error"), errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
// we can only change the date & time explicitly when NTP is disabled.
|
||||
if(false == useNtp)
|
||||
{
|
||||
if(modified.testFlag(DateTimePage::M_DATE) || modified.testFlag(DateTimePage::M_TIME))
|
||||
{
|
||||
if(false == mTimeDateCtl.setDateTime(mDateTimeWidget->dateTime(), errorMessage)) {
|
||||
QMessageBox::critical(this, tr("Error"), errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
oobs_object_commit(OOBS_OBJECT(mTimeConfig));
|
||||
}
|
||||
|
||||
bool TimeAdminDialog::logInUser()
|
||||
void TimeAdminDialog::onButtonClicked(QDialogButtonBox::StandardButton button)
|
||||
{
|
||||
if (mUserLogedIn)
|
||||
return true;
|
||||
|
||||
GError* err = NULL;
|
||||
if(oobs_object_authenticate(OOBS_OBJECT(mTimeConfig), &err))
|
||||
if(button == QDialogButtonBox::Ok)
|
||||
{
|
||||
mUserLogedIn = true;
|
||||
return true;
|
||||
saveChangesToSystem();
|
||||
accept();
|
||||
}
|
||||
else if(err)
|
||||
else if(button == QDialogButtonBox::Cancel)
|
||||
{
|
||||
QMessageBox::critical(this, tr("Authentication Error"), QString::fromUtf8(err->message));
|
||||
g_error_free(err);
|
||||
reject();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -26,13 +26,10 @@
|
||||
* END_COMMON_COPYRIGHT_HEADER */
|
||||
|
||||
#include <LXQt/ConfigDialog>
|
||||
#include <glib.h>
|
||||
#include <oobs/oobs-timeconfig.h>
|
||||
#include <oobs/oobs-ntpconfig.h>
|
||||
#include <oobs/oobs-ntpserver.h>
|
||||
#include "timedatectl.h"
|
||||
|
||||
class DateTime;
|
||||
class Timezone;
|
||||
class DateTimePage;
|
||||
class TimezonePage;
|
||||
|
||||
class TimeAdminDialog: public LXQt::ConfigDialog
|
||||
{
|
||||
@ -42,30 +39,18 @@ public:
|
||||
TimeAdminDialog(QWidget * parent = NULL) ;
|
||||
~TimeAdminDialog();
|
||||
|
||||
|
||||
typedef enum {M_TIMEDATE = 1 , M_TIMEZONE = 0x2} widgets_modified_enum;
|
||||
Q_DECLARE_FLAGS(widgets_modified_t, widgets_modified_enum)
|
||||
|
||||
protected:
|
||||
virtual void closeEvent(QCloseEvent * event);
|
||||
|
||||
private Q_SLOTS:
|
||||
void onChanged(bool);
|
||||
void onChanged();
|
||||
void onButtonClicked(QDialogButtonBox::StandardButton button);
|
||||
|
||||
private:
|
||||
bool logInUser();
|
||||
void saveChangesToSystem();
|
||||
void loadTimeZones(QStringList & timeZones, QString & currentTimezone);
|
||||
void showChangedStar();
|
||||
|
||||
private:
|
||||
OobsTimeConfig* mTimeConfig;
|
||||
DateTime * mDateTimeWidget;
|
||||
Timezone * mTimezoneWidget;
|
||||
bool mUserLogedIn;
|
||||
TimeDateCtl mTimeDateCtl;
|
||||
DateTimePage * mDateTimeWidget;
|
||||
TimezonePage * mTimezoneWidget;
|
||||
QString mWindowTitle;
|
||||
widgets_modified_t mWidgetsModified;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(TimeAdminDialog::widgets_modified_enum)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(TimeAdminDialog::widgets_modified_t)
|
||||
|
85
lxqt-admin-time/timedatectl.cpp
Normal file
85
lxqt-admin-time/timedatectl.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
#include "timedatectl.h"
|
||||
#include <QProcess>
|
||||
#include <QDebug>
|
||||
#include <QDBusInterface>
|
||||
#include <QDBusConnection>
|
||||
#include <QMessageBox>
|
||||
|
||||
|
||||
TimeDateCtl::TimeDateCtl()
|
||||
{
|
||||
mIface = new QDBusInterface(QStringLiteral("org.freedesktop.timedate1"),
|
||||
QStringLiteral("/org/freedesktop/timedate1"),
|
||||
QStringLiteral("org.freedesktop.timedate1"),
|
||||
QDBusConnection::systemBus());
|
||||
}
|
||||
|
||||
TimeDateCtl::~TimeDateCtl()
|
||||
{
|
||||
delete mIface;
|
||||
}
|
||||
|
||||
QString TimeDateCtl::timeZone() const
|
||||
{
|
||||
return mIface->property("Timezone").toString();
|
||||
}
|
||||
|
||||
bool TimeDateCtl::setTimeZone(QString timeZone, QString& errorMessage)
|
||||
{
|
||||
mIface->call("SetTimezone", timeZone, true);
|
||||
QDBusError err = mIface->lastError();
|
||||
if(err.isValid())
|
||||
{
|
||||
errorMessage = err.message();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TimeDateCtl::setDateTime(QDateTime dateTime, QString& errorMessage)
|
||||
{
|
||||
// the timedatectl dbus service accepts "usec" input.
|
||||
// Qt can only get "msec" => convert to usec here.
|
||||
mIface->call("SetTime", dateTime.toMSecsSinceEpoch() * 1000, false, true);
|
||||
QDBusError err = mIface->lastError();
|
||||
if(err.isValid())
|
||||
{
|
||||
errorMessage = err.message();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TimeDateCtl::useNtp() const
|
||||
{
|
||||
return mIface->property("NTP").toBool();
|
||||
}
|
||||
|
||||
bool TimeDateCtl::setUseNtp(bool value, QString& errorMessage)
|
||||
{
|
||||
mIface->call("SetNTP", value, true);
|
||||
QDBusError err = mIface->lastError();
|
||||
if(err.isValid())
|
||||
{
|
||||
errorMessage = err.message();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TimeDateCtl::localRtc() const
|
||||
{
|
||||
return mIface->property("LocalRTC").toBool();
|
||||
}
|
||||
|
||||
bool TimeDateCtl::setLocalRtc(bool value, QString& errorMessage)
|
||||
{
|
||||
mIface->call("SetLocalRTC", value, false, true);
|
||||
QDBusError err = mIface->lastError();
|
||||
if(err.isValid())
|
||||
{
|
||||
errorMessage = err.message();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
30
lxqt-admin-time/timedatectl.h
Normal file
30
lxqt-admin-time/timedatectl.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef TIMEDATECTL_H
|
||||
#define TIMEDATECTL_H
|
||||
|
||||
#include <QString>
|
||||
#include <QDateTime>
|
||||
|
||||
class QDBusInterface;
|
||||
|
||||
class TimeDateCtl
|
||||
{
|
||||
public:
|
||||
explicit TimeDateCtl();
|
||||
~TimeDateCtl();
|
||||
|
||||
bool useNtp() const;
|
||||
bool setUseNtp(bool value, QString& errorMessage);
|
||||
|
||||
bool localRtc() const;
|
||||
bool setLocalRtc(bool value, QString& errorMessage);
|
||||
|
||||
QString timeZone() const;
|
||||
bool setTimeZone(QString timeZone, QString& errorMessage);
|
||||
|
||||
bool setDateTime(QDateTime dateTime, QString& errorMessage);
|
||||
|
||||
private:
|
||||
QDBusInterface* mIface;
|
||||
};
|
||||
|
||||
#endif // TIMEDATECTL_H
|
@ -28,7 +28,7 @@
|
||||
#include "timezone.h"
|
||||
#include "ui_timezone.h"
|
||||
|
||||
Timezone::Timezone(const QStringList & zones, const QString & currentimezone, QWidget *parent) :
|
||||
TimezonePage::TimezonePage(const QStringList & zones, const QString & currentimezone, QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::Timezone),
|
||||
mZoneChanged(false),
|
||||
@ -47,12 +47,12 @@ Timezone::Timezone(const QStringList & zones, const QString & currentimezone, QW
|
||||
reload();
|
||||
}
|
||||
|
||||
Timezone::~Timezone()
|
||||
TimezonePage::~TimezonePage()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void Timezone::reload()
|
||||
void TimezonePage::reload()
|
||||
{
|
||||
ui->list_zones->setCurrentRow(-1);
|
||||
mZoneChanged = false;
|
||||
@ -60,10 +60,10 @@ void Timezone::reload()
|
||||
if (list.count())
|
||||
ui->list_zones->setCurrentItem(list.at(0));
|
||||
|
||||
emit changed(mZoneChanged);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
QString Timezone::timezone() const
|
||||
QString TimezonePage::timezone() const
|
||||
{
|
||||
if (ui->list_zones->currentItem())
|
||||
return ui->list_zones->currentItem()->text();
|
||||
@ -71,16 +71,17 @@ QString Timezone::timezone() const
|
||||
return QString();
|
||||
}
|
||||
|
||||
void Timezone::on_list_zones_itemActivated(QListWidgetItem * item)
|
||||
void TimezonePage::on_list_zones_itemSelectionChanged()
|
||||
{
|
||||
bool old = mZoneChanged;
|
||||
QList<QListWidgetItem*> selected = ui->list_zones->selectedItems();
|
||||
if(selected.empty())
|
||||
return;
|
||||
QListWidgetItem *item = selected.first();
|
||||
mZoneChanged = item->text() != ui->label_timezone->text();
|
||||
|
||||
if (mZoneChanged != old)
|
||||
emit changed(mZoneChanged);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
void Timezone::on_edit_filter_textChanged(const QString &arg1)
|
||||
void TimezonePage::on_edit_filter_textChanged(const QString &arg1)
|
||||
{
|
||||
QRegExp reg(arg1, Qt::CaseInsensitive,QRegExp::Wildcard);
|
||||
ui->list_zones->clear();
|
||||
|
@ -35,13 +35,13 @@ class Timezone;
|
||||
}
|
||||
|
||||
class QListWidgetItem;
|
||||
class Timezone : public QWidget
|
||||
class TimezonePage : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Timezone(const QStringList & zones, const QString & currentimezone, QWidget *parent = 0);
|
||||
~Timezone();
|
||||
explicit TimezonePage(const QStringList & zones, const QString & currentimezone, QWidget *parent = 0);
|
||||
~TimezonePage();
|
||||
QString timezone() const;
|
||||
inline bool isChanged() const {return mZoneChanged;}
|
||||
|
||||
@ -49,10 +49,10 @@ public slots:
|
||||
void reload();
|
||||
|
||||
Q_SIGNALS:
|
||||
void changed(bool);
|
||||
void changed();
|
||||
|
||||
private slots:
|
||||
void on_list_zones_itemActivated(QListWidgetItem *item);
|
||||
void on_list_zones_itemSelectionChanged();
|
||||
void on_edit_filter_textChanged(const QString &arg1);
|
||||
|
||||
private:
|
||||
|
@ -42,22 +42,6 @@
|
||||
<item>
|
||||
<widget class="QListWidget" name="list_zones"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
@ -1,78 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="23"/>
|
||||
<source>Time:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="53"/>
|
||||
<source>Date:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="89"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="19"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>TextLabel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="54"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,79 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="de">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="23"/>
|
||||
<source>Time:</source>
|
||||
<translation>Zeit:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translatorcomment>No need to translate.</translatorcomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="53"/>
|
||||
<source>Date:</source>
|
||||
<translation>Datum:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="89"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Das Sichern der Einstellungen benötigt Administrator-Rechte.<br>Nach dem Betätigen der Schließen-Schaltfläche wird die Berechtigung eingeholt.</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Zeit und Datum einstellen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Datum und Zeit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Zeitzone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Authentifizierungsfehler</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="19"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Derzeitige Zeitzone:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>Textfeld</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="54"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Das Sichern der Einstellungen benötigt Administrator-Rechte.<br>Nach dem Betätigen der Schließen-Schaltfläche wird die Berechtigung eingeholt.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Keine</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,78 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="el">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="23"/>
|
||||
<source>Time:</source>
|
||||
<translation>Ώρα:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation>HH:mm:ss</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="53"/>
|
||||
<source>Date:</source>
|
||||
<translation>Ημερομηνία:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="89"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Η αποθήκευση των αλλαγών απαιτεί δικαιώματα διαχειριστή.<br>Θα ερωτηθείτε αφού κάνετε κλικ στο κουμπί του κλεισίματος</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Διαμόρφωση της ώρας και της ημερομηνίας</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Ημερομηνία και ώρα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Ωρολογιακή ζώνη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Σφάλμα πιστοποίησης</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="19"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Η τρέχουσα ζώνη ώρας:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>Ετικέτα κειμένου</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Filter</source>
|
||||
<translation>Φίλτρο</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="54"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Η αποθήκευση των αλλαγών απαιτεί δικαιώματα διαχειριστή.<br>Θα ερωτηθείτε αφού κάνετε κλικ στο κουμπί του κλεισίματος</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Καμία</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="hr_HR">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation type="unfinished">Postavke datuma i vremena</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation type="unfinished">Vrijeme:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation type="unfinished">HH:mm:ss</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation type="unfinished">Nadnevak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Spremanje pronjena zahtjeva adminstracijske dozvole.<br>Biti će zatražene nakon što kliknete na dugme zatvori</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation type="unfinished">Konfiguracija vremena i nadnevka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation type="unfinished">Nadnevak i vrijeme</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation type="unfinished">Vremenska zona</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation type="unfinished">Postavljanje vremenske zone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation type="unfinished">Vaša trenutna vremenska zona</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Spremanje pronjena zahtjeva adminstracijske dozvole.<br>Biti će zatražene nakon što kliknete na dugme zatvori</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation type="unfinished">Nijedan</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="hu_HU">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation>Űrlap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Dátum és időbeállítás</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Idő:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Dátum:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Változtatások csak rendszergazdaként menthetők,<br>jelszóbekérés a kilépés után.</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Dátum és időbeállítások</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Dátum és idő</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Időzóna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Hitelesítési hiba</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation>Űrlap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Időzóna beállítás</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Mostani időzóna:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>Szövegcím</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Szűrő</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Változtatások csak rendszergazdaként menthetők,<br>jelszóbekérés a kilépés után.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Nincs</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,100 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="it_IT" sourcelanguage="it_IT">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Imposta data e ora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Ora:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Data:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation>Il salvataggio richiede privilegi di amministratore,
|
||||
saranno chiesti dopo la chiusura di questa finestra.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Configura data e ora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Data e ora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Fuso orario</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Errore di autenticazione</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Configura fuso orario</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Fuso orario attuale:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>nessuno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filtro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished">Il salvataggio richiede privilegi di amministratore,
|
||||
saranno chiesti dopo la chiusura di questa finestra.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ja">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation>フォーム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>日時設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>時刻:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation>HH:mm:ss</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>日付</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>変更の保存には管理権限が必要です。<br>閉じるボタンを押した直後に要求されるでしょう。</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>日時設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>日時</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>タイムゾーン</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>認証エラー</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation>フォーム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>タイムゾーン設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>現在のタイムゾーン</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>テキストラベル</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>フィルター</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>変更の保存には管理権限が必要です。<br>閉じるボタンを押した直後に要求されるでしょう。</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>なし</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="pl_PL">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Konfiguracja daty i czasu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Czas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Data:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Zapisywanie zmian wymaga uprawnień administratora.<br>Zostaniesz poproszony o hasło.</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Konfiguracja daty i czasu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Data i czas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Strefa czasowa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Błąd autoryzacji</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Ustawienia strefy czasowej</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Twoja aktualna strefa czasowa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filtr</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Zapisywanie zmian wymaga uprawnień administratora.<br>Zostaniesz poproszony o hasło.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Żadna</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="pt">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="20"/>
|
||||
<source>Form</source>
|
||||
<translation>Formulário</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Configuração de data e hora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Hora:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation>H:mm:ss</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Data:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>A gravação de alterações requer permissões de administrador.<br>A senha será solicitada ao clicar em Fechar.</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Configuração de data e hora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Data e hora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Fuso horário</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Erro de autenticação</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation>Formulário</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Configuração de fuso horário</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>O seu fuso horário:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="42"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>Texto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Filtrar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>A gravação de alterações requer permissões de administrador.<br>A senha será solicitada ao clicar em Fechar.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Nenhum</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,83 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ru">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Настройка даты и времени</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Время:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation>ЧЧ:мм:сс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Дата:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Для сохранения изменений необходимы права администратора.<br>Пароль будет запрошен после нажатия на кнопку «Закрыть»</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Настройки даты и времени</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Дата и время</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Часовой пояс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Ошибка аутентификации</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Настройки часового пояса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Ваш текущий часовой пояс:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Фильтр</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Для сохранения изменений необходимы права администратора.<br>Пароль будет запрошен после нажатия на кнопку «Закрыть»</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Нет</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,6 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name[ru_RU]=Дата и время
|
||||
GenericName[ru_RU]=Настройки даты и времени
|
||||
Comment[ru_RU]=Настроить дату и время вашей системы
|
||||
|
||||
#TRANSLATIONS_DIR=translations
|
@ -1,83 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ru_RU">
|
||||
<context>
|
||||
<name>DateTime</name>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="32"/>
|
||||
<source>Time and date setup</source>
|
||||
<translation>Настройка даты и времени</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="39"/>
|
||||
<source>Time:</source>
|
||||
<translation>Время:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="55"/>
|
||||
<source>HH:mm:ss</source>
|
||||
<translation>ЧЧ:мм:сс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="69"/>
|
||||
<source>Date:</source>
|
||||
<translation>Дата:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../datetime.ui" line="105"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Для сохранения изменений необходимы права администратора.<br>Пароль будет запрошен после нажатия на кнопку «Закрыть»</p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TimeAdminDialog</name>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="42"/>
|
||||
<source>Time and date configuration</source>
|
||||
<translation>Настройки даты и времени</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="53"/>
|
||||
<source>Date and time</source>
|
||||
<translation>Дата и время</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="62"/>
|
||||
<source>Timezone</source>
|
||||
<translation>Часовой пояс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timeadmindialog.cpp" line="162"/>
|
||||
<source>Authentication Error</source>
|
||||
<translation>Ошибка аутентификации</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Timezone</name>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="26"/>
|
||||
<source>Timezone setup</source>
|
||||
<translation>Настройки часового пояса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="35"/>
|
||||
<source>Your current timezone:</source>
|
||||
<translation>Ваш текущий часовой пояс:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="51"/>
|
||||
<source>Filter</source>
|
||||
<translation>Фильтр</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.ui" line="70"/>
|
||||
<source><html><head/><body><p>Saving changes requires admin permissions.<br>You will be requested after clicking close button</p></body></html></source>
|
||||
<translation><html><head/><body><p>Для сохранения изменений необходимы права администратора.<br>Пароль будет запрошен после нажатия на кнопку «Закрыть»</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../timezone.cpp" line="42"/>
|
||||
<source>None</source>
|
||||
<translation>Нет</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
BIN
lxqt-admin-user.png
Normal file
BIN
lxqt-admin-user.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
@ -3,7 +3,6 @@ project(lxqt-admin-user)
|
||||
# build static helper class first
|
||||
include_directories (
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${OOBS_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set ( lxqt-admin-user_SRCS
|
||||
@ -11,12 +10,14 @@ set ( lxqt-admin-user_SRCS
|
||||
mainwindow.cpp
|
||||
userdialog.cpp
|
||||
groupdialog.cpp
|
||||
usermanager.cpp
|
||||
)
|
||||
|
||||
set ( lxqt-admin-user_MOCS
|
||||
mainwindow.h
|
||||
userdialog.h
|
||||
groupdialog.h
|
||||
usermanager.h
|
||||
)
|
||||
|
||||
set( lxqt-admin-user_UIS
|
||||
@ -37,6 +38,16 @@ lxqt_translate_ts(lxqt-admin-user_QM_FILES
|
||||
${lxqt-admin-user_UIS}
|
||||
INSTALL_DIR
|
||||
"${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}"
|
||||
PULL_TRANSLATIONS
|
||||
${PULL_TRANSLATIONS}
|
||||
CLEAN_TRANSLATIONS
|
||||
${CLEAN_TRANSLATIONS}
|
||||
TRANSLATIONS_REPO
|
||||
${TRANSLATIONS_REPO}
|
||||
TRANSLATIONS_REFSPEC
|
||||
${TRANSLATIONS_REFSPEC}
|
||||
REPO_SUBDIR
|
||||
"lxqt-admin/${PROJECT_NAME}"
|
||||
)
|
||||
|
||||
lxqt_translate_desktop(DESKTOP_FILES
|
||||
@ -59,8 +70,17 @@ target_link_libraries(lxqt-admin-user
|
||||
KF5::WindowSystem
|
||||
Qt5::Widgets
|
||||
lxqt
|
||||
${OOBS_LIBRARIES}
|
||||
)
|
||||
|
||||
install(TARGETS lxqt-admin-user RUNTIME DESTINATION bin)
|
||||
install(FILES ${DESKTOP_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||
|
||||
# for policykit
|
||||
# manpage for pcmanfm-qt
|
||||
configure_file(
|
||||
"org.lxqt.lxqt-admin-user.policy.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/org.lxqt.lxqt-admin-user.policy"
|
||||
@ONLY
|
||||
)
|
||||
install(PROGRAMS "lxqt-admin-user-helper" DESTINATION bin)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.lxqt.lxqt-admin-user.policy" DESTINATION "share/polkit-1/actions")
|
||||
|
@ -20,111 +20,60 @@
|
||||
|
||||
#include "groupdialog.h"
|
||||
#include <QMessageBox>
|
||||
#include "usermanager.h"
|
||||
#include <QDebug>
|
||||
|
||||
#define DEFAULT_GID_MIN 1000
|
||||
#define DEFAULT_GID_MAX 32768
|
||||
|
||||
GroupDialog::GroupDialog(OobsGroup *group, QWidget *parent, Qt::WindowFlags f):
|
||||
GroupDialog::GroupDialog(UserManager* userManager, GroupInfo* group, QWidget *parent, Qt::WindowFlags f):
|
||||
QDialog(parent, f),
|
||||
mGroup(group ? OOBS_GROUP(g_object_ref(group)) : NULL)
|
||||
mUserManager(userManager),
|
||||
mGroup(group)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
ui.groupName->setText(group->name());
|
||||
ui.gid->setValue(group->gid());
|
||||
|
||||
OobsGroupsConfig* groupsConfig = OOBS_GROUPS_CONFIG(oobs_groups_config_get());
|
||||
if(group) // edit an exiting group
|
||||
{
|
||||
ui.groupName->setReadOnly(true);
|
||||
ui.groupName->setText(oobs_group_get_name(group));
|
||||
mOldGId = oobs_group_get_gid(group);
|
||||
ui.gid->setValue(mOldGId);
|
||||
}
|
||||
else // create a new group
|
||||
{
|
||||
mOldGId = -1;
|
||||
ui.gid->setValue(oobs_groups_config_find_free_gid(groupsConfig, DEFAULT_GID_MIN, DEFAULT_GID_MAX));
|
||||
}
|
||||
|
||||
GList* groupUsers = oobs_group_get_users(mGroup); // all users in this group
|
||||
const QStringList& members = group->members(); // all users in this group
|
||||
// load all users
|
||||
OobsUsersConfig* usersConfig = OOBS_USERS_CONFIG(oobs_users_config_get());
|
||||
OobsList* users = oobs_users_config_get_users(usersConfig);
|
||||
if(users)
|
||||
for(const UserInfo* user: userManager->users())
|
||||
{
|
||||
OobsListIter it;
|
||||
gboolean valid = oobs_list_get_iter_first(users, &it);
|
||||
while(valid)
|
||||
{
|
||||
OobsUser* user = OOBS_USER(oobs_list_get(users, &it));
|
||||
QListWidgetItem* item = new QListWidgetItem();
|
||||
item->setText(oobs_user_get_login_name(user));
|
||||
item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsUserCheckable|Qt::ItemIsSelectable);
|
||||
if(g_list_find(groupUsers, user)) // the user is in this group
|
||||
item->setCheckState(Qt::Checked);
|
||||
else
|
||||
item->setCheckState(Qt::Unchecked);
|
||||
QVariant obj = QVariant::fromValue<void*>(user);
|
||||
item->setData(Qt::UserRole, obj);
|
||||
ui.userList->addItem(item);
|
||||
valid = oobs_list_iter_next(users, &it);
|
||||
}
|
||||
QListWidgetItem* item = new QListWidgetItem();
|
||||
item->setText(user->name());
|
||||
item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsUserCheckable|Qt::ItemIsSelectable);
|
||||
if(members.indexOf(user->name()) != -1) // the user is in this group
|
||||
item->setCheckState(Qt::Checked);
|
||||
else
|
||||
item->setCheckState(Qt::Unchecked);
|
||||
QVariant obj = QVariant::fromValue<void*>((void*)user);
|
||||
item->setData(Qt::UserRole, obj);
|
||||
ui.userList->addItem(item);
|
||||
}
|
||||
g_list_free(groupUsers);
|
||||
}
|
||||
|
||||
GroupDialog::~GroupDialog()
|
||||
{
|
||||
if(mGroup)
|
||||
g_object_unref(mGroup);
|
||||
}
|
||||
|
||||
void GroupDialog::accept()
|
||||
{
|
||||
OobsGroupsConfig* groupsConfig = OOBS_GROUPS_CONFIG(oobs_groups_config_get());
|
||||
gid_t gid = ui.gid->value();
|
||||
if(gid != mOldGId && oobs_groups_config_is_gid_used(groupsConfig, gid))
|
||||
QString groupName = ui.groupName->text();
|
||||
if(groupName.isEmpty())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The group ID is in use."));
|
||||
QMessageBox::critical(this, tr("Error"), tr("The group name cannot be empty."));
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mGroup) // create a new group
|
||||
{
|
||||
QByteArray groupName = ui.groupName->text().toLatin1();
|
||||
if(groupName.isEmpty())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The group name cannot be empty."));
|
||||
return;
|
||||
}
|
||||
if(oobs_groups_config_is_name_used(groupsConfig, groupName))
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The group name is in use."));
|
||||
return;
|
||||
}
|
||||
mGroup = oobs_group_new(groupName);
|
||||
}
|
||||
oobs_group_set_gid(mGroup, gid);
|
||||
mGroup->setName(groupName);
|
||||
mGroup->setGid(ui.gid->value());
|
||||
|
||||
// update users
|
||||
GList* groupUsers = oobs_group_get_users(mGroup); // all users in this group
|
||||
int rowCount = ui.userList->count();
|
||||
for(int row = 0; row < rowCount; ++row)
|
||||
{
|
||||
mGroup->removeAllMemberss();
|
||||
for(int row = 0; row < ui.userList->count(); ++row) {
|
||||
QListWidgetItem* item = ui.userList->item(row);
|
||||
QVariant obj = item->data(Qt::UserRole);
|
||||
OobsUser* user = OOBS_USER(obj.value<void*>());
|
||||
if(g_list_find(groupUsers, user)) // the user belongs to this group previously
|
||||
{
|
||||
if(item->checkState() == Qt::Unchecked) // it's unchecked, remove it
|
||||
oobs_group_remove_user(mGroup, user);
|
||||
}
|
||||
else // the user does not belong to this group previously
|
||||
{
|
||||
if(item->checkState() == Qt::Checked) // it's checked, we want it!
|
||||
oobs_group_add_user(mGroup, user);
|
||||
if(item->checkState() == Qt::Checked) {
|
||||
mGroup->addMember(item->text());
|
||||
}
|
||||
}
|
||||
g_list_free(groupUsers);
|
||||
|
||||
oobs_object_commit(OOBS_OBJECT(mGroup));
|
||||
QDialog::accept();
|
||||
}
|
||||
|
@ -23,32 +23,24 @@
|
||||
|
||||
#include <QDialog>
|
||||
#include "ui_groupdialog.h"
|
||||
#include <glib.h>
|
||||
#include <oobs/oobs-usersconfig.h>
|
||||
#include <oobs/oobs-groupsconfig.h>
|
||||
|
||||
class GroupInfo;
|
||||
class UserManager;
|
||||
|
||||
class GroupDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
GroupDialog(OobsGroup* group = NULL, QWidget *parent = NULL, Qt::WindowFlags f = 0);
|
||||
GroupDialog(UserManager* userManager, GroupInfo* group, QWidget *parent = nullptr, Qt::WindowFlags f = 0);
|
||||
~GroupDialog();
|
||||
|
||||
OobsGroup* group()
|
||||
{
|
||||
return mGroup;
|
||||
}
|
||||
|
||||
virtual void accept();
|
||||
|
||||
private:
|
||||
bool hasUser(OobsUser* user);
|
||||
|
||||
private:
|
||||
Ui::GroupDialog ui;
|
||||
OobsGroup* mGroup;
|
||||
gid_t mOldGId;
|
||||
UserManager* mUserManager;
|
||||
GroupInfo* mGroup;
|
||||
};
|
||||
|
||||
#endif // GROUPDIALOG_H
|
||||
|
@ -26,6 +26,9 @@
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="gid">
|
||||
<property name="specialValueText">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>32768</number>
|
||||
</property>
|
||||
|
13
lxqt-admin-user/lxqt-admin-user-helper
Executable file
13
lxqt-admin-user/lxqt-admin-user-helper
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
case "$1" in
|
||||
# we only allow executing these commands
|
||||
useradd|usermod|userdel|groupadd|groupmod|groupdel|passwd|gpasswd)
|
||||
# TODO: platforms using different commands can add wrapper scripts here.
|
||||
export LC_ALL=C
|
||||
exec "$@"
|
||||
;;
|
||||
*)
|
||||
echo "Command '$1' is not allowed!"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
@ -21,161 +21,125 @@
|
||||
#include "mainwindow.h"
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QInputDialog>
|
||||
#include <QLineEdit>
|
||||
#include <QRegExpValidator>
|
||||
#include <QRegExp>
|
||||
#include "userdialog.h"
|
||||
#include "groupdialog.h"
|
||||
#include "usermanager.h"
|
||||
|
||||
MainWindow::MainWindow():
|
||||
QMainWindow(),
|
||||
mUsersConfig(OOBS_USERS_CONFIG(oobs_users_config_get())),
|
||||
mGroupsConfig(OOBS_GROUPS_CONFIG(oobs_groups_config_get()))
|
||||
mUserManager(new UserManager(this))
|
||||
{
|
||||
ui.setupUi(this);
|
||||
connect(ui.actionAdd, SIGNAL(triggered(bool)), SLOT(onAdd()));
|
||||
connect(ui.actionDelete, SIGNAL(triggered(bool)), SLOT(onDelete()));
|
||||
connect(ui.actionProperties, SIGNAL(triggered(bool)), SLOT(onEditProperties()));
|
||||
connect(ui.actionRefresh, SIGNAL(triggered(bool)), SLOT(onRefresh()));
|
||||
connect(ui.actionChangePasswd, SIGNAL(triggered(bool)), SLOT(onChangePasswd()));
|
||||
connect(ui.actionRefresh, SIGNAL(triggered(bool)), SLOT(reload()));
|
||||
|
||||
onRefresh(); // load the settings
|
||||
connect(ui.userList, &QListWidget::activated, this, &MainWindow::onRowActivated);
|
||||
connect(ui.groupList, &QListWidget::activated, this, &MainWindow::onRowActivated);
|
||||
|
||||
g_signal_connect(mUsersConfig, "changed" , G_CALLBACK(onUsersConfigChanged), this);
|
||||
g_signal_connect(mGroupsConfig, "changed" , G_CALLBACK(onGroupsConfigChanged), this);
|
||||
connect(mUserManager, &UserManager::changed, this, &MainWindow::reload);
|
||||
reload();
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
if(mUsersConfig)
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func(mUsersConfig, (void*)G_CALLBACK(onUsersConfigChanged), this);
|
||||
g_object_unref(mUsersConfig);
|
||||
}
|
||||
if(mGroupsConfig)
|
||||
g_object_unref(mGroupsConfig);
|
||||
}
|
||||
|
||||
void MainWindow::loadUsers()
|
||||
void MainWindow::reloadUsers()
|
||||
{
|
||||
ui.userList->clear();
|
||||
OobsList* users = oobs_users_config_get_users(mUsersConfig);
|
||||
if(users)
|
||||
const auto& users = mUserManager->users();
|
||||
for(const UserInfo* user: users)
|
||||
{
|
||||
OobsListIter it;
|
||||
gboolean valid = oobs_list_get_iter_first(users, &it);
|
||||
while(valid)
|
||||
uid_t uid = user->uid();
|
||||
if(uid > 499 && !user->shell().isEmpty()) // exclude system users
|
||||
{
|
||||
GObject* obj = oobs_list_get(users, &it);
|
||||
OobsUser* user = OOBS_USER(obj);
|
||||
uid_t uid = oobs_user_get_uid(user);
|
||||
if(uid > 499 && oobs_user_get_shell(user)) // exclude system users
|
||||
{
|
||||
QString fullName = QString::fromUtf8(oobs_user_get_full_name(user));
|
||||
QString loginName = QString::fromLatin1(oobs_user_get_login_name(user));
|
||||
QString homeDir = QString::fromLocal8Bit(oobs_user_get_home_directory(user));
|
||||
QString groupName;
|
||||
OobsGroup* group = oobs_user_get_main_group(user);
|
||||
if(group)
|
||||
groupName = QString::fromLatin1(oobs_group_get_name(group));
|
||||
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setData(0, Qt::DisplayRole, loginName);
|
||||
QVariant obj = QVariant::fromValue<void*>(user);
|
||||
item->setData(0, Qt::UserRole, obj);
|
||||
item->setData(1, Qt::DisplayRole, uid);
|
||||
item->setData(2, Qt::DisplayRole, fullName);
|
||||
item->setData(3, Qt::DisplayRole, groupName);
|
||||
item->setData(4, Qt::DisplayRole, homeDir);
|
||||
ui.userList->addTopLevelItem(item);
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setData(0, Qt::DisplayRole, user->name());
|
||||
QVariant obj = QVariant::fromValue<void*>((void*)user);
|
||||
item->setData(0, Qt::UserRole, obj);
|
||||
item->setData(1, Qt::DisplayRole, uid);
|
||||
item->setData(2, Qt::DisplayRole, user->fullName());
|
||||
GroupInfo* group = mUserManager->findGroupInfo(user->gid());
|
||||
if(group != nullptr) {
|
||||
item->setData(3, Qt::DisplayRole, group->name());
|
||||
}
|
||||
valid = oobs_list_iter_next(users, &it);
|
||||
item->setData(4, Qt::DisplayRole, user->homeDir());
|
||||
ui.userList->addTopLevelItem(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::loadGroups()
|
||||
void MainWindow::reloadGroups()
|
||||
{
|
||||
ui.groupList->clear();
|
||||
// load groups
|
||||
OobsList* groups = oobs_groups_config_get_groups(mGroupsConfig);
|
||||
if(groups)
|
||||
const auto& groups = mUserManager->groups();
|
||||
for(const GroupInfo* group: groups)
|
||||
{
|
||||
OobsListIter it;
|
||||
gboolean valid = oobs_list_get_iter_first(groups, &it);
|
||||
while(valid)
|
||||
{
|
||||
OobsGroup* group = OOBS_GROUP(oobs_list_get(groups, &it));
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setData(0, Qt::DisplayRole, QString::fromLatin1(oobs_group_get_name(group)));
|
||||
QVariant obj = QVariant::fromValue<void*>(group);
|
||||
item->setData(0, Qt::UserRole, obj);
|
||||
item->setData(1, Qt::DisplayRole, oobs_group_get_gid(group));
|
||||
ui.groupList->addTopLevelItem(item);
|
||||
valid = oobs_list_iter_next(groups, &it);
|
||||
}
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setData(0, Qt::DisplayRole, group->name());
|
||||
QVariant obj = QVariant::fromValue<void*>((void*)group);
|
||||
item->setData(0, Qt::UserRole, obj);
|
||||
item->setData(1, Qt::DisplayRole, group->gid());
|
||||
item->setData(2, Qt::DisplayRole, group->members().join(", "));
|
||||
ui.groupList->addTopLevelItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
OobsUser *MainWindow::userFromItem(QTreeWidgetItem *item)
|
||||
void MainWindow::reload() {
|
||||
reloadUsers();
|
||||
reloadGroups();
|
||||
}
|
||||
|
||||
UserInfo *MainWindow::userFromItem(QTreeWidgetItem *item)
|
||||
{
|
||||
if(item)
|
||||
{
|
||||
QVariant obj = item->data(0, Qt::UserRole);
|
||||
OobsUser* user = OOBS_USER(obj.value<void*>());
|
||||
return user;
|
||||
return reinterpret_cast<UserInfo*>(obj.value<void*>());
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
OobsGroup* MainWindow::groupFromItem(QTreeWidgetItem *item)
|
||||
GroupInfo* MainWindow::groupFromItem(QTreeWidgetItem *item)
|
||||
{
|
||||
if(item)
|
||||
{
|
||||
QVariant obj = item->data(0, Qt::UserRole);
|
||||
return OOBS_GROUP(obj.value<void*>());
|
||||
return reinterpret_cast<GroupInfo*>(obj.value<void*>());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
bool MainWindow::authenticate(T *obj)
|
||||
{
|
||||
GError* err = NULL;
|
||||
if(!oobs_object_authenticate(OOBS_OBJECT(obj), &err))
|
||||
{
|
||||
if(err)
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), QString::fromUtf8(err->message));
|
||||
g_error_free(err);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void MainWindow::onAdd()
|
||||
{
|
||||
if(ui.tabWidget->currentIndex() == PageUsers)
|
||||
{
|
||||
if(authenticate(mUsersConfig))
|
||||
UserInfo newUser;
|
||||
UserDialog dlg(mUserManager, &newUser, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
UserDialog dlg(NULL, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
OobsUser* user = dlg.user();
|
||||
oobs_users_config_add_user(mUsersConfig, user);
|
||||
oobs_object_commit(OOBS_OBJECT(mUsersConfig));
|
||||
mUserManager->addUser(&newUser);
|
||||
QByteArray newPasswd;
|
||||
if(getNewPassword(newUser.name(), newPasswd)) {
|
||||
mUserManager->changePassword(&newUser, newPasswd);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ui.tabWidget->currentIndex() == PageGroups)
|
||||
{
|
||||
if(authenticate(mGroupsConfig))
|
||||
GroupInfo newGroup;
|
||||
GroupDialog dlg(mUserManager, &newGroup, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
GroupDialog dlg(NULL, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
OobsGroup* group = dlg.group();
|
||||
oobs_groups_config_add_group(mGroupsConfig, group);
|
||||
oobs_object_commit(OOBS_OBJECT(mGroupsConfig));
|
||||
}
|
||||
mUserManager->addGroup(&newGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -185,65 +149,116 @@ void MainWindow::onDelete()
|
||||
if(ui.tabWidget->currentIndex() == PageUsers)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.userList->currentItem();
|
||||
OobsUser* user = userFromItem(item);
|
||||
UserInfo* user = userFromItem(item);
|
||||
if(user)
|
||||
{
|
||||
if(QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected user?"), QMessageBox::Ok|QMessageBox::Cancel) == QMessageBox::Ok)
|
||||
{
|
||||
oobs_users_config_delete_user(mUsersConfig, user);
|
||||
oobs_object_commit(OOBS_OBJECT(mUsersConfig));
|
||||
mUserManager->deleteUser(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(ui.tabWidget->currentIndex() == PageGroups)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.groupList->currentItem();
|
||||
OobsGroup* group = groupFromItem(item);
|
||||
GroupInfo* group = groupFromItem(item);
|
||||
if(group)
|
||||
{
|
||||
if(QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected group?"), QMessageBox::Ok|QMessageBox::Cancel) == QMessageBox::Ok)
|
||||
{
|
||||
oobs_groups_config_delete_group(mGroupsConfig, group);
|
||||
oobs_object_commit(OOBS_OBJECT(mGroupsConfig));
|
||||
mUserManager->deleteGroup(group);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool MainWindow::getNewPassword(const QString& name, QByteArray& passwd) {
|
||||
QInputDialog dlg(this);
|
||||
dlg.setTextEchoMode(QLineEdit::Password);
|
||||
dlg.setLabelText(tr("Input the new password for %1:").arg(name));
|
||||
QLineEdit* edit = dlg.findChild<QLineEdit*>(QString());
|
||||
if(edit) {
|
||||
// NOTE: do we need to add a validator to limit the input?
|
||||
// QRegExpValidator* validator = new QRegExpValidator(QRegExp(QStringLiteral("\\w*")), edit);
|
||||
// edit->setValidator(validator);
|
||||
}
|
||||
if(dlg.exec() == QDialog::Accepted) {
|
||||
passwd = dlg.textValue().toUtf8();
|
||||
if(passwd.isEmpty()) {
|
||||
if(QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to set a empty password?"), QMessageBox::Ok|QMessageBox::Cancel) != QMessageBox::Ok)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::onChangePasswd() {
|
||||
QString name;
|
||||
UserInfo* user = nullptr;
|
||||
GroupInfo* group = nullptr;
|
||||
if(ui.tabWidget->currentIndex() == PageUsers)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.userList->currentItem();
|
||||
user = userFromItem(item);
|
||||
if (!user)
|
||||
return;
|
||||
|
||||
name = user->name();
|
||||
}
|
||||
else if(ui.tabWidget->currentIndex() == PageGroups)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.groupList->currentItem();
|
||||
group = groupFromItem(item);
|
||||
if (!group)
|
||||
return;
|
||||
|
||||
name = group->name();
|
||||
}
|
||||
|
||||
QByteArray newPasswd;
|
||||
if(getNewPassword(name, newPasswd)) {
|
||||
if(user) {
|
||||
mUserManager->changePassword(user, newPasswd);
|
||||
}
|
||||
if(group) {
|
||||
mUserManager->changePassword(group, newPasswd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onRowActivated(const QModelIndex& index)
|
||||
{
|
||||
onEditProperties();
|
||||
}
|
||||
|
||||
void MainWindow::onEditProperties()
|
||||
{
|
||||
if(ui.tabWidget->currentIndex() == PageUsers)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.userList->currentItem();
|
||||
OobsUser* user = userFromItem(item);
|
||||
if(user)
|
||||
{
|
||||
if(authenticate(mUsersConfig))
|
||||
UserInfo* user = userFromItem(item);
|
||||
if(user) {
|
||||
UserInfo newSettings(*user);
|
||||
UserDialog dlg(mUserManager, &newSettings, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
UserDialog dlg(user, this);
|
||||
dlg.exec();
|
||||
mUserManager->modifyUser(user, &newSettings);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(ui.tabWidget->currentIndex() == PageGroups)
|
||||
{
|
||||
QTreeWidgetItem* item = ui.groupList->currentItem();
|
||||
OobsGroup* group = groupFromItem(item);
|
||||
if(group)
|
||||
{
|
||||
if(authenticate(mGroupsConfig))
|
||||
GroupInfo* group = groupFromItem(item);
|
||||
if(group) {
|
||||
GroupInfo newSettings(*group);
|
||||
GroupDialog dlg(mUserManager, &newSettings, this);
|
||||
if(dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
GroupDialog dlg(group, this);
|
||||
dlg.exec();
|
||||
mUserManager->modifyGroup(group, &newSettings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onRefresh()
|
||||
{
|
||||
oobs_object_update(OOBS_OBJECT(mUsersConfig));
|
||||
loadUsers();
|
||||
oobs_object_update(OOBS_OBJECT(mGroupsConfig));
|
||||
loadGroups();
|
||||
}
|
||||
|
@ -24,9 +24,9 @@
|
||||
#include <QMainWindow>
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <oobs/oobs-usersconfig.h>
|
||||
#include <oobs/oobs-groupsconfig.h>
|
||||
class UserInfo;
|
||||
class GroupInfo;
|
||||
class UserManager;
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
@ -44,34 +44,23 @@ public:
|
||||
virtual ~MainWindow();
|
||||
|
||||
private:
|
||||
void loadUsers();
|
||||
void loadGroups();
|
||||
OobsUser* userFromItem(QTreeWidgetItem* item);
|
||||
OobsGroup* groupFromItem(QTreeWidgetItem *item);
|
||||
|
||||
template <class T>
|
||||
bool authenticate(T* obj);
|
||||
|
||||
static void onUsersConfigChanged(OobsObject* obj, MainWindow* _this)
|
||||
{
|
||||
_this->loadUsers();
|
||||
}
|
||||
|
||||
static void onGroupsConfigChanged(OobsObject* obj, MainWindow* _this)
|
||||
{
|
||||
_this->loadGroups();
|
||||
}
|
||||
UserInfo* userFromItem(QTreeWidgetItem* item);
|
||||
GroupInfo* groupFromItem(QTreeWidgetItem *item);
|
||||
bool getNewPassword(const QString& name, QByteArray& passwd);
|
||||
void reloadUsers();
|
||||
void reloadGroups();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onAdd();
|
||||
void onDelete();
|
||||
void onEditProperties();
|
||||
void onRefresh();
|
||||
void onChangePasswd();
|
||||
void reload();
|
||||
void onRowActivated(const QModelIndex& index);
|
||||
|
||||
private:
|
||||
Ui::MainWindow ui;
|
||||
OobsUsersConfig* mUsersConfig;
|
||||
OobsGroupsConfig* mGroupsConfig;
|
||||
UserManager* mUserManager;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>640</width>
|
||||
<height>480</height>
|
||||
<width>676</width>
|
||||
<height>362</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -15,7 +15,16 @@
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
@ -42,9 +51,6 @@
|
||||
<property name="expandsOnDoubleClick">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<attribute name="headerStretchLastSection">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Login Name</string>
|
||||
@ -107,6 +113,11 @@
|
||||
<string>Group ID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Members</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@ -134,14 +145,14 @@
|
||||
<addaction name="actionAdd"/>
|
||||
<addaction name="actionDelete"/>
|
||||
<addaction name="actionProperties"/>
|
||||
<addaction name="actionChangePasswd"/>
|
||||
<addaction name="actionRefresh"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
<action name="actionAdd">
|
||||
<property name="icon">
|
||||
<iconset theme="list-add">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
@ -153,8 +164,7 @@
|
||||
<action name="actionDelete">
|
||||
<property name="icon">
|
||||
<iconset theme="list-remove">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Delete</string>
|
||||
@ -166,8 +176,7 @@
|
||||
<action name="actionProperties">
|
||||
<property name="icon">
|
||||
<iconset theme="document-properties">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Properties</string>
|
||||
@ -179,8 +188,7 @@
|
||||
<action name="actionRefresh">
|
||||
<property name="icon">
|
||||
<iconset theme="view-refresh">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
@ -189,6 +197,18 @@
|
||||
<string>Refresh the lists</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionChangePasswd">
|
||||
<property name="icon">
|
||||
<iconset theme="dialog-password">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Change Password</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Change password for the selected user or group</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
18
lxqt-admin-user/org.lxqt.lxqt-admin-user.policy.in
Normal file
18
lxqt-admin-user/org.lxqt.lxqt-admin-user.policy.in
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE policyconfig PUBLIC
|
||||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
|
||||
<policyconfig>
|
||||
|
||||
<action id="org.lxqt.lxqt-admin-user">
|
||||
<message>Authentication is required for user administration</message>
|
||||
<icon_name></icon_name>
|
||||
<defaults>
|
||||
<allow_any>auth_admin</allow_any>
|
||||
<allow_inactive>auth_admin</allow_inactive>
|
||||
<allow_active>auth_admin_keep</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">@CMAKE_INSTALL_PREFIX@/bin/lxqt-admin-user-helper</annotate>
|
||||
</action>
|
||||
|
||||
</policyconfig>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="de">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Gruppeneinstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Gruppen-Name:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>Gruppen-ID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Benutzer in dieser Gruppe:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="86"/>
|
||||
<location filename="../groupdialog.cpp" line="95"/>
|
||||
<location filename="../groupdialog.cpp" line="100"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="86"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>Die Gruppen-ID existiert bereits.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="95"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Der Gruppen-Name kann nicht leer sein.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="100"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Der Gruppen-Name existiert bereits.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Nutzer- und Gruppeneinstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Nutzer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Anmeldename</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>Nutzer-ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Vollständiger Name</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Gruppe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Nutzerverzeichnis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Systemnutzer anzeigen (nur für erfahrene Nutzer)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Gruppen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Name</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>Gruppen-ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Werkzeugleiste</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Hinzufügen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Neue Nutzer oder Gruppen hinzufügen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Entfernen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Ausgewähltes Element löschen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Eigenschaften</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Eigenschaften des ausgewählten Elements editieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Erneuern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Listen erneuern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Bestätigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Wollen Sie den ausgewählten Nutzer wirklich löschen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Wollen Sie die ausgewählte Gruppe wirklich löschen?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Nutzereinstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Allgemein</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Vollständiger Name:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Anmeldename:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Kennwort setzen:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>Nutzer-ID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Hauptgruppe:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Erweitert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Befehlsinterpreter (shell):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Nutzerverzeichnis:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="67"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Kennwort ändern:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="128"/>
|
||||
<location filename="../userdialog.cpp" line="141"/>
|
||||
<location filename="../userdialog.cpp" line="146"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="128"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>Die Nutzer-ID existiert bereits.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="141"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Der Nutzername kann nicht leer sein.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="146"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Der Nutzername existiert bereits.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="162"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Bestätigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="162"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Wollen Sie wirklich ein "leeres Kennwort" für den Nutzer vergeben?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="el">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Ρυθμίσεις ομάδας</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Όνομα ομάδας:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>Αναγνωριστικό ομάδας:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Χρήστες που ανήκουν στην ομάδα: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Σφάλμα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>Το αναγνωριστικό της ομάδας χρησιμοποιείται ήδη.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Το όνομα της ομάδας δεν μπορεί να είναι κενό.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Το όνομα της ομάδας χρησιμοποιείται ήδη.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Ρυθμίσεις χρηστών και ομάδων</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Χρήστες</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Όνομα χρήστη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>Αναγνωριστικό χρήστη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Πλήρες όνομα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Ομάδα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Προσωπικός κατάλογος</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Εμφάνιση των χρηστών του συστήματος (μόνο για προηγμένους χρήστες)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Ομάδες</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Όνομα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>Αναγνωριστικό ομάδας</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Γραμμή εργαλείων</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Προσθήκη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Προσθήκη νέων χρηστών ή ομάδων</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Διαγραφή</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Διαγραφή του επιλεγμένου αντικειμένου</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Ιδιότητες</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Επεξεργασία των ιδιοτήτων για το επιλεγμένο αντικείμενο</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Ανανέωση</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Ανανέωση της λίστας</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Σφάλμα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Επιβεβαίωση</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Είστε σίγουρος-η ότι θέλετε να διαγράψετε τον επιλεγμένο χρήστη;</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Είστε σίγουρος-η ότι θέλετε να διαγράψετε την επιλεγμένη ομάδα;</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Ρυθμίσεις χρήστη</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Γενικά</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Πλήρες όνομα:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Όνομα χρήστη:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Ορισμός του κωδικού πρόσβασης:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>Αναγνωριστικό χρήστη:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Κύρια ομάδα:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Προηγμένο</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Κέλυφος σύνδεσης:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Προσωπικός κατάλογος:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Αλλαγή του κωδικού πρόσβασης:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Σφάλμα</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>Το αναγνωριστικό του χρήστη χρησιμοποιείται ήδη. </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Το όνομα χρήστη δεν μπορεί να είναι κενό.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Το όνομα του χρήστη χρησιμοποιείται ήδη.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Επιβεβαίωση</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Είστε σίγουρος-η ότι θέλετε να χρησιμοποιήσετε έναν «κενό κωδικό πρόσβασης» για τον χρήστη;</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="hr_HR">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation type="unfinished">Postavke grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation type="unfinished">Ime grupe:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation type="unfinished">ID grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation type="unfinished">Korisnici koji pripadaju ovoj grupi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Greška</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation type="unfinished">ID grupe je u uporabi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation type="unfinished">Ime grupe ne može biti prazno.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation type="unfinished">Ime grupe je u uporabi.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation type="unfinished">Postavke korisnika i grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation type="unfinished">&Korisnici</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation type="unfinished">Ime prijave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation type="unfinished">ID korisnika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation type="unfinished">Puno ime</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation type="unfinished">Grupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation type="unfinished">Osobna mapa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation type="unfinished">&Grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation type="unfinished">Ime</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation type="unfinished">ID grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation type="unfinished">alatna traka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation type="unfinished">Dodaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation type="unfinished">Dodaj nove korisnike ili grupe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation type="unfinished">Izbriši</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation type="unfinished">Izbriši odabranu stavku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished">Svojstva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation type="unfinished">uredi svojstva odabrane stavke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished">Osvježi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation type="unfinished">Osvježi liste</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Greška</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation type="unfinished">Potvrdi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation type="unfinished">Jeste li sigurni da želite izbrisati odabranoga korisnika?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation type="unfinished">Jeste li sigurni da želite izbrisati odabranu grupu?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation type="unfinished">Postavke korisnika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation type="unfinished">Općenito</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation type="unfinished">Puno ime:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation type="unfinished">Ime prijave:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation type="unfinished">Postavi lozinku:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation type="unfinished">ID korisnika:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation type="unfinished">Glavna grupa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished">Napredno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation type="unfinished">Ljuska prijave:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation type="unfinished">Osobna mapa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation type="unfinished">Promjeni lozinku:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished">Greška</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation type="unfinished">ID korisnika je u uporabi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation type="unfinished">Korisničko ime ne može biti prazno.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation type="unfinished">Korisničko ime je u uoprabi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation type="unfinished">Potvrdi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation type="unfinished">Jeste li sigurni da želite koristiti "praznu lozinku" za korisnika?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="hu_HU">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Csoportbeállítás</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Csoportnév:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>Csoport ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>A csoport tagjai:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Hiba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>Csoport ID foglalt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Csoportnév nem lehet üres.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Csoportnév foglalt.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Felhasználók és csoportok</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Felhasználók</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Bejelenkezési név</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>Felhasználó ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Teljes név</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Csoport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Saját könyvtár</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Rendszer felhasználók is látszanak (csak haladóknak)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Csoportok</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Név</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>Csoport ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>eszközsáv</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Hozzáad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Új felhasználó, vagy csoport hozzáadása</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Törlés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Kiválasztott törlése</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Tulajdonságok</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>A választott elem módosítása</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Frisítés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Lista frissítése</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Hiba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Megerősítés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Tényleg töröljük az illető felhasználót?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Tényleg töröljük az illető csoportot?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Felhasználó beállítása</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Alap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Teljes név:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Bejelenkezési név:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Jelszóbeállítás:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>Felhasználó ID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Főcsoport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Bővített</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Parancsértelmező:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Saját könyvtár:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Jelszóváltoztatás:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Hiba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>Felhasználó ID foglalt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Felhasználónév nem lehet üres.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Felhasználónév foglalt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Megerősítés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Üres legyen a jelszava a felhasználónak?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,264 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="it_IT" sourcelanguage="it_IT">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Gestione gruppi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Nome del gruppo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>ID gruppo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Utenti appartenenti:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Errore</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>ID già in uso</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Il nome non può essere vuoto.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Il nome è già in uso.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Impostazioni utenti e gruppi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translatorcomment>remove &_ in source</translatorcomment>
|
||||
<translation type="unfinished">Utenti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Nome Login</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ID utente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Nome completo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Gruppo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Cartella Home</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Mostra utenti di sistema (avanzato)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>Gruppi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Nome</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>ID gruppo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Aggiungi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Aggiungi utenti o gruppi nuovi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Cancella</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Cancella selezionato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Proprietà</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Modifica proprietà</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Aggiorna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Aggiorna lista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Errore</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Conferma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Si è sicuro di voler cancellare l'utente selezionato?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Si è sicuro di voler cancellare il gruppo selezionato?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Impostazioni utente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Generali</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Nome completo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Nome al Login:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Scegli il password:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ID utente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Gruppo principale:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Avanzate:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Shell del login:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Cartella home:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Cambia password:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Errore</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>ID già in uso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Il nome non può essere vuoto.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Il nome è già in uso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Conferma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Si è sicuro di volere un password vuoto per l'utente?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ja">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>グループ設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>グループ名:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>グループID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>このグループに属しているユーザー:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>エラー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>そのグループIDはすでに使われています</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>グループ名を入力する必要があります</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>そのグループ名はすでに使われています</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>ユーザーとグループの設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>ユーザー(&U)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>ログイン名</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ユーザーID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>フルネーム</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>グループ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>ホームディレクトリー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>システムユーザーを表示(上級者専用)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>グループ(&G)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>名前</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>グループID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>ツールバー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>追加</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>新しいユーザーまたはグループを追加</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>削除</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>選択した項目を削除</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>プロパティー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>選択した項目のプロパティーを編集</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>再読込み</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>リストを再読込み</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>エラー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>確認</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>本当に、選択したユーザーを削除してよいですか?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>本当に、選択したグループを削除してよいですか?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>ユーザー設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>一般</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>フルネーム:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>ログイン名:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>パスワードを設定:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ユーザーID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>メイングループ:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>高度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>ログインシェル:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>ホームディレクトリー:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>パスワードを変更:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>エラー</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>そのユーザーIDはすでに使われています</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>ユーザー名を入力する必要があります</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>そのユーザー名はすでに使われています</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>確認</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>本当に、空のパスワードをそのユーザーに設定してよいですか?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="pl_PL">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Ustawienia Grup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Nazwa grupy:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>ID grupy:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Użytkownicy należący do tej grupy:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Błąd</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>ID grupy jest już w użyciu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Nazwa grupy nie może być pusta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Ta nazwa grupy jest już w użyciu.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Ustawienia użytkowników i grup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Użytkownicy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Login</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ID użytkownika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Pełna nazwa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Grupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Katalog domowy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Pokaż użytkowników systemowych (dla zaawansowanych)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Grupy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Nazwa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>ID grupy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Pasek narzędzi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Dodaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Dodaj nowych użytkowników lub grupy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Usuń</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Usuń zaznaczoną pozycję</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Właściwości</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>edytuj właściwości dla wybranej pozycji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Odśwież</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Odśwież listę</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Błąd</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Potwierdzenie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Czy na pewno chcesz usunąć wybranego użytkownika?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Czy na pewno chcesz usunąć wybraną grupę?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Ustawienia użytkownika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Ogólne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Pełna nazwa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Login:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Ustaw hasło:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ID użytkownika:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Grupa główna:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Zaawansowane</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Powłoka:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Katalog domowy:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Zmień hasło:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Błąd</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>To ID użytkownika jest już w użyciu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Nazwa użytkownika nie może być pusta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Ta nazwa użytkownika jest już w użyciu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Potwierdzenie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Czy na pewno chcesz użyć "pustego hasła" dla tego użytkownika?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="pt">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Definições de grupo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Nome do grupo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>ID do grupo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Utilizadores pertencentes a este grupo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Erro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>O ID do grupo já está em utilização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>O nome do grupo não pode estar vazio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>O nome do grupo já está em utilização.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Definições de grupo e utilizador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Utilizadores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Nome de acesso</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ID de utilizador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Nome completo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Grupo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Pasta pessoal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Mostrar utilizadores de sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Grupos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Nome</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>ID do grupo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Barra de ferramentas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Adicionar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Adicionar utilizadores ou grupos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Eliminar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Eliminar item selecionado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propriedades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Editar propriedades do item selecionado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Atualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Atualizar as listas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Erro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Confirmação</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Tem a certeza que quer eliminar o utilizador selecionado?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Tem a certeza que quer eliminar o grupo selecionado?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Definições de utilizador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Geral</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Nome completo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Nome de acesso:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Definir senha:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ID de utilizador:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Grupo principal:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Avançado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Consola de acesso:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Pasta pessoal:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Mudar senha:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Erro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>O ID do utilizador já está em utilização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>O nome de utilizador não pode estar vazio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>O nome de utilizador já está em utilização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Confirmação</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Tem a certeza que quer definir uma senha vazia para o utilizador?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ru">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Настройки группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Имя группы:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>ID группы:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Пользователи, относящиеся к этой группе:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>ID группы уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Имя группы не может быть пустым.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Имя группы уже используется.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Настройки пользователя и группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Пользователи</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Логин пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ID пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Полное имя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Группа</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Домашний каталог</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Показывать системных пользователей (только для продвинутых пользователей)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Имя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>ID группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Панель</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Добавить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Добавить новых пользователей или группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Удалить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Удалить выбранный элемент</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Свойства</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Редактировать свойства выделенного элемента</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Обновить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Обновить список</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Подтвердить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Вы действительно хотите удалить выбранного пользователя?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Вы действительно хотите удалить выбранную группу?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Настройки пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Общие</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Полное имя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Логин пользователя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Установить пароль:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ID пользователя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Главная группа:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Расширенные</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Оболочка:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Домашний каталог:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Изменить пароль:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>Пользовательский ID уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Имя пользователя не может быть пустым.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Имя пользователя уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Подтвердить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Вы действительно хотите использовать пустой пароль для этого пользователя?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,6 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name[ru_RU]=Пользователи и группы
|
||||
GenericName[ru_RU]=Настройки пользователей и групп
|
||||
Comment[ru_RU]=Настроить пользователей и группы вашей системы
|
||||
|
||||
#TRANSLATIONS_DIR=translations
|
@ -1,263 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ru_RU">
|
||||
<context>
|
||||
<name>GroupDialog</name>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="14"/>
|
||||
<source>Group Settings</source>
|
||||
<translation>Настройки группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="20"/>
|
||||
<source>Group name:</source>
|
||||
<translation>Имя группы:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="37"/>
|
||||
<source>Group ID:</source>
|
||||
<translation>ID группы:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.ui" line="44"/>
|
||||
<source>Users belong to this group:</source>
|
||||
<translation>Пользователи, относящиеся к этой группе:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="83"/>
|
||||
<source>The group ID is in use.</source>
|
||||
<translation>ID группы уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="92"/>
|
||||
<source>The group name cannot be empty.</source>
|
||||
<translation>Имя группы не может быть пустым.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../groupdialog.cpp" line="97"/>
|
||||
<source>The group name is in use.</source>
|
||||
<translation>Имя группы уже используется.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="14"/>
|
||||
<source>User and Group Settings</source>
|
||||
<translation>Настройки пользователя и группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="31"/>
|
||||
<source>&Users</source>
|
||||
<translation>&Пользователи</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="50"/>
|
||||
<source>Login Name</source>
|
||||
<translation>Логин пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="55"/>
|
||||
<source>User ID</source>
|
||||
<translation>ID пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="60"/>
|
||||
<source>Full Name</source>
|
||||
<translation>Полное имя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="65"/>
|
||||
<source>Group</source>
|
||||
<translation>Группа</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<source>Home Directory</source>
|
||||
<translation>Домашний каталог</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="81"/>
|
||||
<source>Show system users (for advanced users only)</source>
|
||||
<translation>Показывать системных пользователей (только для продвинутых пользователей)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="89"/>
|
||||
<source>&Groups</source>
|
||||
<translation>&Группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<source>Name</source>
|
||||
<translation>Имя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="107"/>
|
||||
<source>Group ID</source>
|
||||
<translation>ID группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<source>toolBar</source>
|
||||
<translation>Панель</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="147"/>
|
||||
<source>Add</source>
|
||||
<translation>Добавить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="150"/>
|
||||
<source>Add new users or groups</source>
|
||||
<translation>Добавить новых пользователей или группы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="160"/>
|
||||
<source>Delete</source>
|
||||
<translation>Удалить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>Delete selected item</source>
|
||||
<translation>Удалить выбранный элемент</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Properties</source>
|
||||
<translation>Свойства</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="176"/>
|
||||
<source>edit properties of the selected item</source>
|
||||
<translation>Редактировать свойства выделенного элемента</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="186"/>
|
||||
<source>Refresh</source>
|
||||
<translation>Обновить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="189"/>
|
||||
<source>Refresh the lists</source>
|
||||
<translation>Обновить список</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="145"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Подтвердить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<source>Are you sure you want to delete the selected user?</source>
|
||||
<translation>Вы действительно хотите удалить выбранного пользователя?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="204"/>
|
||||
<source>Are you sure you want to delete the selected group?</source>
|
||||
<translation>Вы действительно хотите удалить выбранную группу?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>UserDialog</name>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="14"/>
|
||||
<source>User Settings</source>
|
||||
<translation>Настройки пользователя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="24"/>
|
||||
<source>General</source>
|
||||
<translation>Общие</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="33"/>
|
||||
<source>Full name:</source>
|
||||
<translation>Полное имя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="43"/>
|
||||
<source>Login name:</source>
|
||||
<translation>Логин пользователя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="53"/>
|
||||
<source>Set password:</source>
|
||||
<translation>Установить пароль:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="77"/>
|
||||
<source>User ID:</source>
|
||||
<translation>ID пользователя:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="84"/>
|
||||
<source>Main group:</source>
|
||||
<translation>Главная группа:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="99"/>
|
||||
<source>Advanced</source>
|
||||
<translation>Расширенные</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="105"/>
|
||||
<source>Login shell:</source>
|
||||
<translation>Оболочка:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.ui" line="122"/>
|
||||
<source>Home directory:</source>
|
||||
<translation>Домашний каталог:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="64"/>
|
||||
<source>Change password:</source>
|
||||
<translation>Изменить пароль:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>Error</source>
|
||||
<translation>Ошибка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="125"/>
|
||||
<source>The user ID is in use.</source>
|
||||
<translation>Пользовательский ID уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="138"/>
|
||||
<source>The user name cannot be empty.</source>
|
||||
<translation>Имя пользователя не может быть пустым.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="143"/>
|
||||
<source>The user name is in use.</source>
|
||||
<translation>Имя пользователя уже используется.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Confirm</source>
|
||||
<translation>Подтвердить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../userdialog.cpp" line="159"/>
|
||||
<source>Are you sure you want to use an "empty password" for the user?</source>
|
||||
<translation>Вы действительно хотите использовать пустой пароль для этого пользователя?</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -20,76 +20,65 @@
|
||||
|
||||
#include "userdialog.h"
|
||||
#include <QMessageBox>
|
||||
#include <QListWidgetItem>
|
||||
#include <QDebug>
|
||||
#include "usermanager.h"
|
||||
|
||||
#define DEFAULT_UID_MIN 1000
|
||||
#define DEFAULT_UID_MAX 32768
|
||||
|
||||
UserDialog::UserDialog(OobsUser* user, QWidget* parent):
|
||||
QDialog(),
|
||||
mUser(user ? OOBS_USER(g_object_ref(user)) : NULL),
|
||||
UserDialog::UserDialog(UserManager* userManager, UserInfo* user, QWidget* parent):
|
||||
QDialog(parent),
|
||||
mUserManager(userManager),
|
||||
mUser(user),
|
||||
mFullNameChanged(false),
|
||||
mHomeDirChanged(false)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
|
||||
bool isNewUser = (user->uid() == 0 && user->name().isEmpty());
|
||||
// load all groups
|
||||
OobsGroupsConfig* groupsConfig = OOBS_GROUPS_CONFIG(oobs_groups_config_get());
|
||||
OobsList* groups = oobs_groups_config_get_groups(groupsConfig);
|
||||
if(groups)
|
||||
for(const GroupInfo* group: mUserManager->groups())
|
||||
{
|
||||
OobsListIter it;
|
||||
gboolean valid = oobs_list_get_iter_first(groups, &it);
|
||||
while(valid)
|
||||
{
|
||||
OobsGroup* group = OOBS_GROUP(oobs_list_get(groups, &it));
|
||||
ui.mainGroup->addItem(oobs_group_get_name(group));
|
||||
valid = oobs_list_iter_next(groups, &it);
|
||||
}
|
||||
}
|
||||
ui.mainGroup->addItem(group->name());
|
||||
|
||||
QListWidgetItem* item = new QListWidgetItem();
|
||||
item->setText(group->name());
|
||||
item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsUserCheckable|Qt::ItemIsSelectable);
|
||||
if(!isNewUser)
|
||||
{
|
||||
if(group->hasMember(user->name()) || user->gid() == group->gid()) // the user is in this group
|
||||
item->setCheckState(Qt::Checked);
|
||||
else
|
||||
item->setCheckState(Qt::Unchecked);
|
||||
}
|
||||
else
|
||||
item->setCheckState(Qt::Unchecked);
|
||||
ui.groupList->addItem(item);
|
||||
}
|
||||
connect(ui.loginName, SIGNAL(textChanged(QString)), SLOT(onLoginNameChanged(QString)));
|
||||
|
||||
OobsUsersConfig* userConfig = OOBS_USERS_CONFIG(oobs_users_config_get());
|
||||
ui.loginShell->addItems(mUserManager->availableShells());
|
||||
|
||||
// add known shells to the combo box for selection
|
||||
GList* shells = oobs_users_config_get_available_shells(userConfig);
|
||||
for(GList* l = shells; l; l = l->next)
|
||||
if(isNewUser) // new user
|
||||
{
|
||||
const char* shell = (const char*)l->data;
|
||||
ui.loginShell->addItem(QLatin1String(shell));
|
||||
}
|
||||
|
||||
if(user) // edit an existing user
|
||||
{
|
||||
mOldUid = oobs_user_get_uid(user);
|
||||
ui.loginName->setReadOnly(true);
|
||||
ui.loginName->setText(oobs_user_get_login_name(user));
|
||||
ui.changePasswd->setText(tr("Change password:"));
|
||||
ui.uid->setValue(mOldUid);
|
||||
ui.fullName->setText(oobs_user_get_full_name(user));
|
||||
ui.loginShell->setEditText(oobs_user_get_shell(user));
|
||||
ui.homeDir->setText(QString::fromLocal8Bit(oobs_user_get_home_directory(user)));
|
||||
|
||||
OobsGroup* group = oobs_user_get_main_group(user);
|
||||
ui.mainGroup->setEditText(oobs_group_get_name(group));
|
||||
}
|
||||
else // create a new user
|
||||
{
|
||||
mOldUid = -1;
|
||||
ui.loginName->setReadOnly(false);
|
||||
ui.loginName->setFocus();
|
||||
ui.changePasswd->setChecked(true);
|
||||
ui.uid->setValue(oobs_users_config_find_free_uid(userConfig, DEFAULT_UID_MIN, DEFAULT_UID_MAX));
|
||||
ui.loginShell->setEditText(oobs_users_config_get_default_shell(userConfig));
|
||||
ui.mainGroup->setCurrentIndex(-1);
|
||||
ui.loginShell->setCurrentIndex(-1);
|
||||
}
|
||||
else // edit an existing user
|
||||
{
|
||||
ui.loginName->setText(user->name());
|
||||
ui.uid->setValue(user->uid());
|
||||
ui.fullName->setText(user->fullName());
|
||||
ui.loginShell->setEditText(user->shell());
|
||||
ui.homeDir->setText(user->homeDir());
|
||||
GroupInfo* group = userManager->findGroupInfo(user->gid());
|
||||
if(group)
|
||||
ui.mainGroup->setEditText(group->name());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
UserDialog::~UserDialog()
|
||||
{
|
||||
if(mUser)
|
||||
g_object_unref(mUser);
|
||||
}
|
||||
|
||||
void UserDialog::onLoginNameChanged(const QString& text)
|
||||
@ -121,61 +110,33 @@ void UserDialog::onHomeDirChanged(const QString& text)
|
||||
|
||||
void UserDialog::accept()
|
||||
{
|
||||
OobsUsersConfig* usersConfig = OOBS_USERS_CONFIG(oobs_users_config_get());
|
||||
uid_t uid = ui.uid->value();
|
||||
if(uid != mOldUid && oobs_users_config_is_uid_used(usersConfig, uid))
|
||||
mUser->setUid(ui.uid->value());
|
||||
QString loginName = ui.loginName->text();
|
||||
if(loginName.isEmpty())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The user ID is in use."));
|
||||
QMessageBox::critical(this, tr("Error"), tr("The user name cannot be empty."));
|
||||
return;
|
||||
}
|
||||
mUser->setName(loginName);
|
||||
mUser->setFullName(ui.fullName->text());
|
||||
|
||||
bool createNew;
|
||||
if(mUser)
|
||||
createNew = false;
|
||||
else
|
||||
{
|
||||
createNew = true;
|
||||
QByteArray loginName = ui.loginName->text().toLatin1();
|
||||
if(loginName.isEmpty())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The user name cannot be empty."));
|
||||
return;
|
||||
}
|
||||
if(oobs_users_config_is_login_used(usersConfig, loginName))
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("The user name is in use."));
|
||||
return;
|
||||
}
|
||||
mUser = oobs_user_new(loginName);
|
||||
}
|
||||
oobs_user_set_uid(mUser, uid);
|
||||
|
||||
QByteArray fullName = ui.fullName->text().toUtf8();
|
||||
oobs_user_set_full_name(mUser, fullName);
|
||||
|
||||
// change password
|
||||
if(ui.changePasswd->isChecked())
|
||||
{
|
||||
QByteArray passwd = ui.passwd->text().toLatin1();
|
||||
if(passwd.isEmpty()) // show warnings if the password is empty
|
||||
{
|
||||
if(QMessageBox::warning(this, tr("Confirm"), tr("Are you sure you want to use an \"empty password\" for the user?"), QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes)
|
||||
oobs_user_set_password_empty(mUser, true);
|
||||
}
|
||||
else
|
||||
oobs_user_set_password(mUser, passwd);
|
||||
}
|
||||
|
||||
QByteArray homeDir = ui.homeDir->text().toLocal8Bit();
|
||||
oobs_user_set_home_directory(mUser, homeDir);
|
||||
mUser->setHomeDir(ui.homeDir->text());
|
||||
|
||||
// main group
|
||||
OobsGroupsConfig* groupsConfig = OOBS_GROUPS_CONFIG(oobs_groups_config_get());
|
||||
QByteArray groupName = ui.mainGroup->currentText().toLatin1();
|
||||
OobsGroup* group = oobs_groups_config_get_from_name(groupsConfig, groupName);
|
||||
oobs_user_set_main_group(mUser, group);
|
||||
QString groupName = ui.mainGroup->currentText();
|
||||
if(!groupName.isEmpty()) {
|
||||
GroupInfo* group = mUserManager->findGroupInfo(groupName);
|
||||
if(group)
|
||||
mUser->setGid(group->gid());
|
||||
}
|
||||
|
||||
if(!createNew)
|
||||
oobs_object_commit_async(OOBS_OBJECT(mUser), NULL, NULL);
|
||||
// other groups
|
||||
mUser->removeAllGroups();
|
||||
for(int row = 0; row < ui.groupList->count(); ++row) {
|
||||
QListWidgetItem* item = ui.groupList->item(row);
|
||||
if(item->checkState() == Qt::Checked) {
|
||||
mUser->addGroup(item->text());
|
||||
}
|
||||
}
|
||||
QDialog::accept();
|
||||
}
|
||||
|
@ -23,23 +23,19 @@
|
||||
|
||||
#include <QDialog>
|
||||
#include "ui_userdialog.h"
|
||||
#include <glib.h>
|
||||
#include <oobs/oobs-usersconfig.h>
|
||||
#include <oobs/oobs-groupsconfig.h>
|
||||
#include "usermanager.h"
|
||||
|
||||
class UserManager;
|
||||
class UserInfo;
|
||||
|
||||
class UserDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
UserDialog(OobsUser* user = NULL, QWidget* parent = NULL);
|
||||
UserDialog(UserManager* userManager, UserInfo* user, QWidget* parent = nullptr);
|
||||
~UserDialog();
|
||||
|
||||
OobsUser* user()
|
||||
{
|
||||
return mUser;
|
||||
}
|
||||
|
||||
virtual void accept();
|
||||
|
||||
private Q_SLOTS:
|
||||
@ -49,14 +45,8 @@ private Q_SLOTS:
|
||||
|
||||
private:
|
||||
Ui::UserDialog ui;
|
||||
OobsUser* mUser;
|
||||
uid_t mOldUid;
|
||||
#if 0
|
||||
QByteArray mOldLoginName;
|
||||
QByteArray mOldFullName;
|
||||
QByteArray mOldGroupName;
|
||||
QByteArray mOldHomeDir;
|
||||
#endif
|
||||
UserManager* mUserManager;
|
||||
UserInfo* mUser;
|
||||
|
||||
bool mFullNameChanged;
|
||||
bool mHomeDirChanged;
|
||||
|
@ -27,16 +27,6 @@
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Full name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="fullName"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
@ -48,44 +38,40 @@
|
||||
<widget class="QLineEdit" name="loginName"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="changePasswd">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Set password:</string>
|
||||
<string>Full name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="passwd">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLineEdit" name="fullName"/>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="uid">
|
||||
<property name="maximum">
|
||||
<number>32768</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>User ID:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="uid">
|
||||
<property name="specialValueText">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>32768</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Main group:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="mainGroup">
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
@ -94,6 +80,30 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_3">
|
||||
<attribute name="title">
|
||||
<string>Groups</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>The user belongs to the following groups:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="groupList">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Advanced</string>
|
||||
@ -173,21 +183,5 @@
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>changePasswd</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>passwd</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>71</x>
|
||||
<y>125</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>192</x>
|
||||
<y>129</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
|
355
lxqt-admin-user/usermanager.cpp
Normal file
355
lxqt-admin-user/usermanager.cpp
Normal file
@ -0,0 +1,355 @@
|
||||
#include "usermanager.h"
|
||||
#include <QDebug>
|
||||
#include <algorithm>
|
||||
#include <QFileSystemWatcher>
|
||||
#include <QTimer>
|
||||
#include <QProcess>
|
||||
#include <QFile>
|
||||
#include <unistd.h>
|
||||
|
||||
static const QString PASSWD_FILE = QStringLiteral("/etc/passwd");
|
||||
static const QString GROUP_FILE = QStringLiteral("/etc/group");
|
||||
static const QString LOGIN_DEFS_FILE = QStringLiteral("/etc/login.defs");
|
||||
|
||||
UserManager::UserManager(QObject *parent):
|
||||
QObject(parent),
|
||||
mWatcher(new QFileSystemWatcher(QStringList() << PASSWD_FILE << GROUP_FILE, this))
|
||||
{
|
||||
loadUsersAndGroups();
|
||||
connect(mWatcher, &QFileSystemWatcher::fileChanged, this, &UserManager::onFileChanged);
|
||||
}
|
||||
|
||||
UserManager::~UserManager() {
|
||||
qDeleteAll(mUsers);
|
||||
qDeleteAll(mGroups);
|
||||
}
|
||||
|
||||
void UserManager::loadUsersAndGroups()
|
||||
{
|
||||
// load groups
|
||||
setgrent();
|
||||
struct group * grp;
|
||||
while((grp = getgrent())) {
|
||||
GroupInfo* group = new GroupInfo(grp);
|
||||
mGroups.append(group);
|
||||
// add members of this group
|
||||
for(char** member_name = grp->gr_mem; *member_name; ++member_name) {
|
||||
group->addMember(QString::fromLatin1(*member_name));
|
||||
}
|
||||
}
|
||||
endgrent();
|
||||
std::sort(mGroups.begin(), mGroups.end(), [](GroupInfo* g1, GroupInfo* g2) {
|
||||
return g1->name() < g2->name();
|
||||
});
|
||||
|
||||
// load users
|
||||
setpwent();
|
||||
struct passwd * pw;
|
||||
while((pw = getpwent())) {
|
||||
UserInfo* user = new UserInfo(pw);
|
||||
mUsers.append(user);
|
||||
// add groups to this user
|
||||
for(const GroupInfo* group: mGroups) {
|
||||
if(group->hasMember(user->name())) {
|
||||
user->addGroup(group->name());
|
||||
}
|
||||
}
|
||||
}
|
||||
endpwent();
|
||||
std::sort(mUsers.begin(), mUsers.end(), [](UserInfo*& u1, UserInfo*& u2) {
|
||||
return u1->name() < u2->name();
|
||||
});
|
||||
}
|
||||
|
||||
// load settings from /etc/login.defs
|
||||
void UserManager::loadLoginDefs() {
|
||||
// FIXME: parse /etc/login.defs to get max UID, max system UID...etc.
|
||||
QFile file(LOGIN_DEFS_FILE);
|
||||
if(file.open(QIODevice::ReadOnly)) {
|
||||
while(!file.atEnd()) {
|
||||
QByteArray line = file.readLine().trimmed();
|
||||
if(line.isEmpty() || line.startsWith('#'))
|
||||
continue;
|
||||
QStringList parts = QString::fromUtf8(line).split(QRegExp("\\s"), QString::SkipEmptyParts);
|
||||
if(parts.length() >= 2) {
|
||||
QString& key = parts[0];
|
||||
QString& val = parts[1];
|
||||
if(key == QLatin1Literal("SYS_UID_MIN")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("SYS_UID_MAX")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("UID_MIN")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("UID_MAX")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("SYS_GID_MIN")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("SYS_GID_MAX")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("GID_MIN")) {
|
||||
}
|
||||
else if(key == QLatin1Literal("GID_MAX")) {
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UserInfo* UserManager::findUserInfo(const char* name) {
|
||||
auto it = std::find_if(mUsers.begin(), mUsers.end(), [name](const UserInfo* user) {
|
||||
return user->name() == name;
|
||||
});
|
||||
return it != mUsers.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
UserInfo* UserManager::findUserInfo(QString name) {
|
||||
auto it = std::find_if(mUsers.begin(), mUsers.end(), [name](const UserInfo* user) {
|
||||
return user->name() == name;
|
||||
});
|
||||
return it != mUsers.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
UserInfo* UserManager::findUserInfo(uid_t uid) {
|
||||
auto it = std::find_if(mUsers.begin(), mUsers.end(), [uid](const UserInfo* user) {
|
||||
return user->uid() == uid;
|
||||
});
|
||||
return it != mUsers.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
GroupInfo* UserManager::findGroupInfo(const char* name) {
|
||||
auto it = std::find_if(mGroups.begin(), mGroups.end(), [name](const GroupInfo* group) {
|
||||
return group->name() == name;
|
||||
});
|
||||
return it != mGroups.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
GroupInfo* UserManager::findGroupInfo(QString name) {
|
||||
auto it = std::find_if(mGroups.begin(), mGroups.end(), [name](const GroupInfo* group) {
|
||||
return group->name() == name;
|
||||
});
|
||||
return it != mGroups.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
GroupInfo* UserManager::findGroupInfo(gid_t gid) {
|
||||
auto it = std::find_if(mGroups.begin(), mGroups.end(), [gid](const GroupInfo* group) {
|
||||
return group->gid() == gid;
|
||||
});
|
||||
return it != mGroups.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
void UserManager::reload() {
|
||||
mWatcher->addPath(PASSWD_FILE);
|
||||
mWatcher->addPath(GROUP_FILE);
|
||||
|
||||
qDeleteAll(mUsers); // free the old UserInfo objects
|
||||
mUsers.clear();
|
||||
|
||||
qDeleteAll(mGroups); // free the old GroupInfo objects
|
||||
mGroups.clear();
|
||||
|
||||
loadUsersAndGroups();
|
||||
Q_EMIT changed();
|
||||
}
|
||||
|
||||
void UserManager::onFileChanged(const QString &path) {
|
||||
// QFileSystemWatcher is very broken and has a ridiculous design.
|
||||
// we get "fileChanged()" when the file is deleted or modified,
|
||||
// but there is no way to distinguish them. If the file is deleted,
|
||||
// the QFileSystemWatcher stop working silently. Hence we workaround
|
||||
// this by remove the paths from the watcher and add them back again
|
||||
// to force the creation of new notifiers.
|
||||
mWatcher->removePath(PASSWD_FILE);
|
||||
mWatcher->removePath(GROUP_FILE);
|
||||
QTimer::singleShot(500, this, &UserManager::reload);
|
||||
}
|
||||
|
||||
bool UserManager::pkexec(const QStringList& command, const QByteArray& stdinData) {
|
||||
QProcess process;
|
||||
qDebug() << command;
|
||||
QStringList args;
|
||||
args << QStringLiteral("--disable-internal-agent")
|
||||
<< QStringLiteral("lxqt-admin-user-helper")
|
||||
<< command;
|
||||
process.start(QStringLiteral("pkexec"), args);
|
||||
if(!stdinData.isEmpty()) {
|
||||
process.waitForStarted();
|
||||
process.write(stdinData);
|
||||
process.waitForBytesWritten();
|
||||
process.closeWriteChannel();
|
||||
}
|
||||
process.waitForFinished(-1);
|
||||
qDebug() << process.readAllStandardError();
|
||||
return process.exitCode() == 0;
|
||||
}
|
||||
|
||||
bool UserManager::addUser(UserInfo* user) {
|
||||
if(!user || user->name().isEmpty())
|
||||
return false;
|
||||
QStringList command;
|
||||
command << QStringLiteral("useradd");
|
||||
if(user->uid() != 0) {
|
||||
command << QStringLiteral("-u") << QString::number(user->uid());
|
||||
}
|
||||
if(!user->homeDir().isEmpty()) {
|
||||
command << QStringLiteral("-d") << user->homeDir();
|
||||
command << QStringLiteral("-m"); // create the user's home directory if it does not exist.
|
||||
}
|
||||
if(!user->shell().isEmpty()) {
|
||||
command << QStringLiteral("-s") << user->shell();
|
||||
}
|
||||
if(!user->fullName().isEmpty()) {
|
||||
command << QStringLiteral("-c") << user->fullName();
|
||||
}
|
||||
if(user->gid() != 0) {
|
||||
command << QStringLiteral("-g") << QString::number(user->gid());
|
||||
}
|
||||
if(!user->groups().isEmpty()) { // set group membership
|
||||
command << QStringLiteral("-G") << user->groups().join(',');
|
||||
}
|
||||
command << user->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
|
||||
bool UserManager::modifyUser(UserInfo* user, UserInfo* newSettings) {
|
||||
if(!user || user->name().isEmpty() || !newSettings)
|
||||
return false;
|
||||
|
||||
QStringList command;
|
||||
command << QStringLiteral("usermod");
|
||||
if(newSettings->uid() != user->uid())
|
||||
command << QStringLiteral("-u") << QString::number(newSettings->uid());
|
||||
|
||||
if(newSettings->homeDir() != user->homeDir()) {
|
||||
command << QStringLiteral("-d") << newSettings->homeDir();
|
||||
// command << QStringLiteral("-m"); // create the user's home directory if it does not exist.
|
||||
}
|
||||
if(newSettings->shell() != user->shell()) {
|
||||
command << QStringLiteral("-s") << newSettings->shell();
|
||||
}
|
||||
|
||||
if(newSettings->fullName() != user->fullName())
|
||||
command << QStringLiteral("-c") << newSettings->fullName();
|
||||
if(newSettings->gid() != user->gid())
|
||||
command << QStringLiteral("-g") << QString::number(newSettings->gid());
|
||||
|
||||
if(newSettings->name() != user->name()) // change login name
|
||||
command << QStringLiteral("-l") << newSettings->name();
|
||||
|
||||
if(newSettings->groups() != user->groups()) { // change group membership
|
||||
command << QStringLiteral("-G") << newSettings->groups().join(',');
|
||||
}
|
||||
|
||||
command << user->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
|
||||
bool UserManager::deleteUser(UserInfo* user) {
|
||||
if(!user || user->name().isEmpty())
|
||||
return false;
|
||||
|
||||
QStringList command;
|
||||
command << QStringLiteral("userdel");
|
||||
command << user->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
|
||||
bool UserManager::changePassword(UserInfo* user, QByteArray newPasswd) {
|
||||
// In theory, the current user should be able to use "passwd" to
|
||||
// reset his/her own password without root permission, but...
|
||||
// /usr/bin/passwd is a setuid program running as root and QProcess
|
||||
// does not seem to capture its stdout... So... requires root for now.
|
||||
if(geteuid() == user->uid()) {
|
||||
// FIXME: there needs to be a way to let a user change his/her own password.
|
||||
// Maybe we can use our pkexec helper script to achieve this.
|
||||
}
|
||||
QStringList command;
|
||||
command << QStringLiteral("passwd");
|
||||
command << user->name();
|
||||
|
||||
// we need to type the new password for two times.
|
||||
QByteArray stdinData;
|
||||
stdinData += newPasswd;
|
||||
stdinData += "\n";
|
||||
stdinData += newPasswd;
|
||||
stdinData += "\n";
|
||||
return pkexec(command, stdinData);
|
||||
}
|
||||
|
||||
bool UserManager::addGroup(GroupInfo* group) {
|
||||
if(!group || group->name().isEmpty())
|
||||
return false;
|
||||
|
||||
QStringList command;
|
||||
command << QStringLiteral("groupadd");
|
||||
if(group->gid() != 0) {
|
||||
command << QStringLiteral("-g") << QString::number(group->gid());
|
||||
}
|
||||
command << group->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
|
||||
bool UserManager::modifyGroup(GroupInfo* group, GroupInfo* newSettings) {
|
||||
if(!group || group->name().isEmpty() || !newSettings)
|
||||
return false;
|
||||
QStringList command;
|
||||
command << QStringLiteral("groupmod");
|
||||
if(newSettings->gid() != group->gid())
|
||||
command << QStringLiteral("-g") << QString::number(newSettings->gid());
|
||||
if(newSettings->name() != group->name())
|
||||
command << QStringLiteral("-n") << newSettings->name();
|
||||
command << group->name();
|
||||
if(!pkexec(command))
|
||||
return false;
|
||||
|
||||
// if group members are changed, use gpasswd to reset members
|
||||
if(newSettings->members() != group->members()) {
|
||||
command.clear();
|
||||
command << QStringLiteral("gpasswd");
|
||||
command << QStringLiteral("-M"); // Set the list of group members.
|
||||
command << newSettings->members().join(',');
|
||||
command << group->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool UserManager::deleteGroup(GroupInfo* group) {
|
||||
if(!group || group->name().isEmpty())
|
||||
return false;
|
||||
QStringList command;
|
||||
command << QStringLiteral("groupdel");
|
||||
command << group->name();
|
||||
return pkexec(command);
|
||||
}
|
||||
|
||||
bool UserManager::changePassword(GroupInfo* group, QByteArray newPasswd) {
|
||||
QStringList command;
|
||||
command << QStringLiteral("gpasswd");
|
||||
command << group->name();
|
||||
|
||||
// we need to type the new password for two times.
|
||||
QByteArray stdinData = newPasswd;
|
||||
stdinData += "\n";
|
||||
stdinData += newPasswd;
|
||||
stdinData += "\n";
|
||||
return pkexec(command, stdinData);
|
||||
}
|
||||
|
||||
const QStringList& UserManager::availableShells() {
|
||||
if(mAvailableShells.isEmpty()) {
|
||||
QFile file("/etc/shells");
|
||||
if(file.open(QIODevice::ReadOnly)) {
|
||||
while(!file.atEnd()) {
|
||||
QByteArray line = file.readLine().trimmed();
|
||||
if(line.isEmpty() || line.startsWith('#'))
|
||||
continue;
|
||||
mAvailableShells.append(QString::fromLocal8Bit(line));
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
return mAvailableShells;
|
||||
}
|
||||
|
212
lxqt-admin-user/usermanager.h
Normal file
212
lxqt-admin-user/usermanager.h
Normal file
@ -0,0 +1,212 @@
|
||||
#ifndef USERMANAGER_H
|
||||
#define USERMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
class QFileSystemWatcher;
|
||||
|
||||
class UserInfo
|
||||
{
|
||||
public:
|
||||
explicit UserInfo():mUid(0), mGid(0) {
|
||||
}
|
||||
explicit UserInfo(struct passwd* pw):
|
||||
mUid(pw->pw_uid),
|
||||
mGid(pw->pw_gid),
|
||||
mName(QString::fromLatin1(pw->pw_name)),
|
||||
mFullName(QString::fromUtf8(pw->pw_gecos)),
|
||||
mShell(QString::fromLocal8Bit(pw->pw_shell)),
|
||||
mHomeDir(QString::fromLocal8Bit(pw->pw_dir))
|
||||
{
|
||||
}
|
||||
|
||||
uid_t uid()const {
|
||||
return mUid;
|
||||
}
|
||||
void setUid(uid_t uid) {
|
||||
mUid = uid;
|
||||
}
|
||||
|
||||
gid_t gid() const {
|
||||
return mGid;
|
||||
}
|
||||
|
||||
void setGid(gid_t gid) {
|
||||
mGid = gid;
|
||||
}
|
||||
|
||||
QString name() const {
|
||||
return mName;
|
||||
}
|
||||
|
||||
void setName(const QString& name) {
|
||||
mName = name;
|
||||
}
|
||||
|
||||
QString fullName() const {
|
||||
return mFullName;
|
||||
}
|
||||
void setFullName(const QString& fullName) {
|
||||
mFullName = fullName;
|
||||
}
|
||||
|
||||
QString shell() const {
|
||||
return mShell;
|
||||
}
|
||||
void setShell(const QString& shell) {
|
||||
mShell = shell;
|
||||
}
|
||||
|
||||
QString homeDir() const {
|
||||
return mHomeDir;
|
||||
}
|
||||
void setHomeDir(const QString& homeDir) {
|
||||
mHomeDir = homeDir;
|
||||
}
|
||||
|
||||
const QStringList& groups() const {
|
||||
return mGroups;
|
||||
}
|
||||
|
||||
void addGroup(const QString& group) {
|
||||
mGroups.append(group);
|
||||
}
|
||||
|
||||
void removeGroup(const QString& group) {
|
||||
mGroups.removeOne(group);
|
||||
}
|
||||
|
||||
void removeAllGroups() {
|
||||
mGroups.clear();
|
||||
}
|
||||
|
||||
bool hasGroup(const QString& group) {
|
||||
return mGroups.contains(group);
|
||||
}
|
||||
|
||||
private:
|
||||
uid_t mUid;
|
||||
gid_t mGid;
|
||||
QString mName;
|
||||
QString mFullName;
|
||||
QString mShell;
|
||||
QString mHomeDir;
|
||||
QStringList mGroups;
|
||||
};
|
||||
|
||||
class GroupInfo
|
||||
{
|
||||
public:
|
||||
explicit GroupInfo(): mGid(0) {
|
||||
}
|
||||
explicit GroupInfo(struct group* grp):
|
||||
mGid(grp->gr_gid),
|
||||
mName(grp->gr_name)
|
||||
{
|
||||
}
|
||||
|
||||
gid_t gid() const {
|
||||
return mGid;
|
||||
}
|
||||
void setGid(gid_t gid) {
|
||||
mGid = gid;
|
||||
}
|
||||
|
||||
QString name() const {
|
||||
return mName;
|
||||
}
|
||||
void setName(const QString& name) {
|
||||
mName = name;
|
||||
}
|
||||
|
||||
const QStringList& members() const {
|
||||
return mMembers;
|
||||
}
|
||||
|
||||
void setMembers(const QStringList& members) {
|
||||
mMembers = members;
|
||||
}
|
||||
|
||||
void addMember(const QString& userName) {
|
||||
mMembers.append(userName);
|
||||
}
|
||||
|
||||
void removeMember(const QString& userName) {
|
||||
mMembers.removeOne(userName);
|
||||
}
|
||||
|
||||
void removeAllMemberss() {
|
||||
mMembers.clear();
|
||||
}
|
||||
|
||||
bool hasMember(const QString& userName) const {
|
||||
return mMembers.contains(userName);
|
||||
}
|
||||
|
||||
private:
|
||||
gid_t mGid;
|
||||
QString mName;
|
||||
QStringList mMembers;
|
||||
};
|
||||
|
||||
class UserManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit UserManager(QObject *parent = 0);
|
||||
~UserManager();
|
||||
|
||||
const QList<UserInfo*>& users() const {
|
||||
return mUsers;
|
||||
}
|
||||
|
||||
const QList<GroupInfo*>& groups() const {
|
||||
return mGroups;
|
||||
}
|
||||
|
||||
const QStringList& availableShells();
|
||||
|
||||
bool addUser(UserInfo* user);
|
||||
bool modifyUser(UserInfo* user, UserInfo* newSettings);
|
||||
bool deleteUser(UserInfo* user);
|
||||
bool changePassword(UserInfo* user, QByteArray newPasswd);
|
||||
|
||||
bool addGroup(GroupInfo* group);
|
||||
bool modifyGroup(GroupInfo* group, GroupInfo* newSettings);
|
||||
bool deleteGroup(GroupInfo* group);
|
||||
bool changePassword(GroupInfo* group, QByteArray newPasswd);
|
||||
|
||||
// FIXME: add APIs to change group membership with "gpasswd"
|
||||
|
||||
UserInfo* findUserInfo(const char* name);
|
||||
UserInfo* findUserInfo(QString name);
|
||||
UserInfo* findUserInfo(uid_t uid);
|
||||
|
||||
GroupInfo* findGroupInfo(const char* name);
|
||||
GroupInfo* findGroupInfo(QString name);
|
||||
GroupInfo* findGroupInfo(gid_t gid);
|
||||
|
||||
private:
|
||||
void loadUsersAndGroups();
|
||||
void loadLoginDefs();
|
||||
bool pkexec(const QStringList &command, const QByteArray &stdinData = QByteArray());
|
||||
|
||||
Q_SIGNALS:
|
||||
void changed();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void onFileChanged(const QString &path);
|
||||
void reload();
|
||||
|
||||
private:
|
||||
QList<UserInfo*> mUsers;
|
||||
QList<GroupInfo*> mGroups;
|
||||
QFileSystemWatcher* mWatcher;
|
||||
QStringList mAvailableShells;
|
||||
};
|
||||
|
||||
#endif // USERMANAGER_H
|
@ -1,3 +0,0 @@
|
||||
[Project]
|
||||
Manager=KDevCMakeManager
|
||||
Name=lxqt-admin
|
Loading…
x
Reference in New Issue
Block a user