Merge pull request 'Added localisation configuration for users' (#295) from YanTheKaller/ubl-settings-usergroups:master into master

Reviewed-on: #295
pull/304/head v2.43
Dmitry Razumov 1 month ago
commit 35c294ae75

@ -1043,3 +1043,15 @@ msgstr ""
#: source/ubl-strings.h:302
msgid "The selected home directory is used by another user"
msgstr ""
#: source/ubl-strings.h:302
msgid "System language:"
msgstr ""
#: source/ubl-strings.h:302
msgid "Regional settings"
msgstr ""
#: source/ubl-strings.h:302
msgid "System"
msgstr ""

@ -1123,6 +1123,18 @@ msgstr "ММ-ДД-ГГГГ"
msgid "The selected home directory is used by another user"
msgstr "Указанный домашний каталог используется другим пользователем"
#: source/ubl-strings.h:302
msgid "System language:"
msgstr "Язык системы:"
#: source/ubl-strings.h:302
msgid "Regional settings"
msgstr "Региональные настройки"
#: source/ubl-strings.h:302
msgid "System"
msgstr "Системный"
#~ msgid "User(-s)"
#~ msgstr "Пользователь(-ли)"

@ -39,7 +39,7 @@ set(DEPENDFILES
../ubl-settings-usergroups-savesettings.glade
../ubl-settings-usergroups-confirmation.glade
../ubl-settings-usergroups-system-deletion-confirmation.glade
../sync_parameters.csv
../csv/sync_parameters.csv
../csv/hash_list.csv
../csv/shell_list.csv
../gresource.xml

@ -58,7 +58,7 @@ void yon_gtk_login_block_symbols(GtkEntry *target){
void on_parameter_changed(GtkWidget *,ubl_settings_usergroups_user_window *window){
char *user_shell=NULL;
char *user_home=NULL;
char *login=NULL;
// char *login=NULL;
char *create_system_user=NULL;
char *create_ununique=NULL;
char *do_not_check=NULL;
@ -69,19 +69,26 @@ void on_parameter_changed(GtkWidget *,ubl_settings_usergroups_user_window *windo
if (do_not_check_actve)
do_not_check = "--badnames";
login = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry));
if (login[0]>'0'&&login[0]<'9'&&!do_not_check_actve){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),USER_BEGINS_WITH_DIGIT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
yon_ubl_status_highlight_incorrect(window->userLoginEntry);
return;
}
if (yon_char_is_empty(login)){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
yon_ubl_status_highlight_incorrect(window->userLoginEntry);
return;
}
// login = (char*)gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry));
// if (login[0]>'0'&&login[0]<'9'&&!do_not_check_actve){
// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),USER_BEGINS_WITH_DIGIT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
// gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
// yon_ubl_status_highlight_incorrect(window->userLoginEntry);
// return;
// }
// if (yon_char_is_empty(login)){
// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
// gtk_notebook_set_current_page(GTK_NOTEBOOK(window->MainNotebook),0);
// yon_ubl_status_highlight_incorrect(window->userLoginEntry);
// return;
// }
char *user_lang = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->LanguageCombo));
if (!yon_char_is_empty(user_lang)){
user_lang = yon_char_unite("--lang ",user_lang,NULL);
} else user_lang="";
int user_shell_active = gtk_combo_box_get_active(GTK_COMBO_BOX(window->userShellCombo));
if (user_shell_active>0){
@ -119,6 +126,8 @@ void on_parameter_changed(GtkWidget *,ubl_settings_usergroups_user_window *windo
final_string = yon_char_unite(final_string,!yon_char_is_empty(final_string)?" ":"",
yon_char_return_if_exist(user_shell,""),
!yon_char_is_empty(user_shell)?" ":"",
yon_char_return_if_exist(user_lang,""),
!yon_char_is_empty(user_lang)?" ":"",
yon_char_return_if_exist(create_system_user,""),
!yon_char_is_empty(create_system_user)?" ":"",
yon_char_return_if_exist(create_ununique,""),
@ -180,6 +189,38 @@ void on_home_changed(GtkWidget *self,ubl_settings_usergroups_user_window *window
free(home_parameter);
}
gboolean yon_user_set_locales(GtkWidget *target){
char *languages_string = config(LOCALE_parameter);
int languages_size;
config_str languages = yon_char_parse(languages_string,&languages_size,",");
GHashTable *hash = main_config.locales_hash;
char *config_lang = g_object_get_data(G_OBJECT(target),"value");
for (int i=0;i<languages_size;i++){
char *locale_str = g_hash_table_lookup(hash,languages[i]);
if (!yon_char_is_empty(locale_str)){
int parsed_size;
config_str parsed = yon_char_parse(locale_str,&parsed_size,"|");
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(target),parsed[0],parsed[1]);
}
}
if (!yon_char_is_empty(config_lang)){
gtk_combo_box_set_active_id(GTK_COMBO_BOX(target),config_lang);
}
return G_SOURCE_REMOVE;
}
void *yon_load_languages(void *){
int size;
config_str locales = yon_config_load(languages_command,&size);
for (int i=0;i<size;i++){
yon_char_remove_last_symbol(locales[i],'\n');
int parsed_size;
config_str parsed = yon_char_parse(locales[i],&parsed_size,"|");
g_hash_table_insert(main_config.locales_hash,yon_char_new(parsed[0]),yon_char_new(locales[i]));
}
g_thread_exit(NULL);
}
ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){
ubl_settings_usergroups_user_window *window = malloc(sizeof(ubl_settings_usergroups_user_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_ubl_settings_usergroups_user);
@ -205,6 +246,7 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){
window->userWarningSpin=yon_gtk_builder_get_widget(builder,"userWarningSpin");
window->userActivitySpin=yon_gtk_builder_get_widget(builder,"userActivitySpin");
window->userForceChangeCheck=yon_gtk_builder_get_widget(builder,"userForceChangeCheck");
window->LanguageCombo=yon_gtk_builder_get_widget(builder,"LanguageCombo");
window->userShellCombo=yon_gtk_builder_get_widget(builder,"userShellCombo");
window->userShellEntry=yon_gtk_builder_get_widget(builder,"userShellEntry");
window->userHomeCombo=yon_gtk_builder_get_widget(builder,"userHomeCombo");
@ -297,6 +339,7 @@ ubl_settings_usergroups_user_window *yon_ubl_settings_usergroups_user_new(){
g_signal_connect(G_OBJECT(window->userHomeEntry),"changed",G_CALLBACK(on_home_changed),window);
g_signal_connect(G_OBJECT(window->userHomeCombo),"changed",G_CALLBACK(on_parameter_changed),window);
g_signal_connect(G_OBJECT(window->userShellCombo),"changed",G_CALLBACK(on_parameter_changed),window);
g_signal_connect(G_OBJECT(window->LanguageCombo),"changed",G_CALLBACK(on_parameter_changed),window);
g_signal_connect(G_OBJECT(window->userShellEntry),"changed",G_CALLBACK(on_parameter_changed),window);
g_signal_connect(G_OBJECT(window->userCreateSystemCheck),"toggled",G_CALLBACK(on_parameter_changed),window);
g_signal_connect(G_OBJECT(window->userCreateUnuniqueCheck),"toggled",G_CALLBACK(on_parameter_changed),window);

@ -157,11 +157,9 @@ void yon_interface_update(main_window *widgets){
}
GdkRGBA rgba = {0};
char *wheel = yon_char_parsed_check_exist_begins_with(main_config.shadow,main_config.shadow_size,"wheel");
int wheel_size;
config_str wheel_parsed = yon_char_parse(wheel,&wheel_size,":");
yon_char_check_element(parameters[3],"wheel",",");
char *param = config(ADDADM_parameter);
if ((parameters_size>1&&atoi(parameters[1])==1000&&!yon_char_is_empty(param)&&!strcmp(param,"yes"))||yon_char_parsed_check_exist(wheel_parsed,wheel_size,login)>-1){
if ((parameters_size>1&&atoi(parameters[1])==1000&&!yon_char_is_empty(param)&&!strcmp(param,"yes"))||yon_char_check_element(parameters[3],"wheel",",")){
rgba.red=253.0/255.0;
rgba.green=251.0/255.0;
rgba.blue=216.0/255.0;
@ -1559,6 +1557,7 @@ void on_main_add(GtkWidget *, main_window *widgets){
g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_user_save),dict);
gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window));
yon_user_set_locales(window->LanguageCombo);
gtk_widget_show(window->CreateUserWindow);
} else {
gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->GroupsTree)));
@ -1583,6 +1582,7 @@ void on_main_edit(GtkWidget *, main_window *widgets){
model = GTK_TREE_MODEL(widgets->UsersList);
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UsersTree)),&model,&iter)){
ubl_settings_usergroups_user_window *window = yon_ubl_settings_usergroups_user_new();
gtk_widget_set_sensitive(window->userLoginEntry,0);
gtk_window_set_title(GTK_WINDOW(window->CreateUserWindow),CONFIGURE_USER_TITLE_LABEL);
gtk_label_set_text(GTK_LABEL(window->userTitleNameLabel),CONFIGURE_USER_TITLE_LABEL);
dictionary *dict = NULL;
@ -1649,11 +1649,18 @@ void on_main_edit(GtkWidget *, main_window *widgets){
gtk_combo_box_set_active(GTK_COMBO_BOX(window->userHomeCombo),2);
i++;
} else if (!strcmp(parameters_substring[i],"--shell")||!strcmp(parameters_substring[i],"-s")){
if (yon_char_is_empty(parameters_substring[i+1])){
gtk_combo_box_set_active(GTK_COMBO_BOX(window->userShellCombo),0);
} else {
if (!gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->userShellCombo),parameters_substring[i+1])){
gtk_entry_set_text(GTK_ENTRY(window->userShellEntry),parameters_substring[i+1]);
gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->userShellCombo),"Set");
}
}
i++;
} else if (!strcmp(parameters_substring[i],"--lang")){
g_object_set_data(G_OBJECT(window->LanguageCombo),"value",parameters_substring[i+1]);
window->config_locale=yon_char_new(parameters_substring[i+1]);
}else if (!strcmp(parameters_substring[i],"--system")||!strcmp(parameters_substring[i],"-r")){
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->userCreateSystemCheck),1);
@ -1749,6 +1756,7 @@ void on_main_edit(GtkWidget *, main_window *widgets){
}
}
}
yon_user_set_locales(window->LanguageCombo);
}
} else {
@ -2182,6 +2190,7 @@ void config_init(){
main_config.launch_arguments=NULL;
main_config.launch_size=0;
int login_size;
main_config.locales_hash = g_hash_table_new(g_str_hash,g_str_equal);
config_str login_defs = yon_file_open(uid_path,&login_size);
for (int i=0;i<login_size;i++){
if (login_defs[i][0]!='#'){
@ -2356,6 +2365,8 @@ template_main_window *yon_main_window_complete(main_window *widgets){
main_config.users_list = widgets->UsersList;
main_config.groups_list = widgets->GroupsList;
g_thread_new("locales",(GThreadFunc)yon_load_languages,NULL);
/* Signal connection | Присоединение сигналов */
g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_main_add),widgets);

@ -19,7 +19,7 @@
#endif
#include "ubl-strings.h"
#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечениерограммы_и_утилиты/Все/ubl-settings-usergroups"
#define WIKI_LINK "https://wiki.ublinux.ru/software/programs_and_utilities/all/ubl-settings-usergroups"
#define _(String) gettext(String)
@ -59,6 +59,8 @@
#define get_system_shadow_command(target) yon_char_unite("/usr/lib/ublinux/functions get_conf_usershadow_from_system ",target,NULL)
#define get_system_group_command(target) yon_char_unite("/usr/lib/ublinux/functions get_conf_groupadd_from_system ",target,NULL)
#define languages_command "while IFS= read -ru3 SELECT_LOCALE; do SELECT_LOCALE=\"${SELECT_LOCALE% *}\"; [[ $(< /usr/share/i18n/locales/${SELECT_LOCALE%.*}) =~ (\"language\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"territory\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"country_name\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"lang_name\"[[:blank:]]*\\\"([^\\\"]*)\\\")|(\"language\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"territory\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"lang_name\"[[:blank:]]*\\\"([^\\\"]*)\\\")|(\"language\"[[:blank:]]*\\\"([^\\\"]*)\\\".*\"territory\"[[:blank:]]*\\\"([^\\\"]*)\\\") ]] && echo \"${SELECT_LOCALE}|${BASH_REMATCH[2]}${BASH_REMATCH[7]}${BASH_REMATCH[11]}${BASH_REMATCH[5]:+ (${BASH_REMATCH[5]})}${BASH_REMATCH[9]:+ (${BASH_REMATCH[9]})}|${BASH_REMATCH[3]}${BASH_REMATCH[8]}${BASH_REMATCH[12]}${BASH_REMATCH[4]:+ (${BASH_REMATCH[4]})}\" || echo \"${SELECT_LOCALE}\"; done 3< \"/usr/share/i18n/SUPPORTED\""
#define remove_user_from_system_command(target) yon_char_append("userdel ",target)
#define remove_user_and_homedir_from_system_command(target) yon_char_append("userdel -r ",target)
#define remove_group_from_system_command(target) yon_char_append("groupdel ",target)
@ -105,8 +107,8 @@
#define user_info_pdf_command(target,path) yon_char_unite("echo ",target,path,NULL)
#define user_info_txt_command(target,path) yon_char_unite("echo ",target,path,NULL)
#define config_get_command(source) yon_char_unite("ubconfig --source ",source," -ea get [users] DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERADD_SYNC USERADD_SYNC[*] USERSHADOW[*] USERSHADOW_SYNC[*] GROUPADD[*] GROUPADD_SYNC[*] GROUPADD_SYNC"," -- [system] SYSTEMBOOT_STATEMODE"," -- [save] SAVE_ROOTCOPY_CHANGES",NULL)
#define config_get_default_command "ubconfig --source default -ea get users DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM"
#define config_get_command(source) yon_char_unite("ubconfig --source ",source," -ea get [users] DEFAULTPASSWD DEFAULTROOTPASSWD DEFAULTUSER HASHPASSWD USERGROUPS ADDADM USERADD[*] USERADD_SYNC USERADD_SYNC[*] USERSHADOW[*] USERSHADOW_SYNC[*] GROUPADD[*] GROUPADD_SYNC[*] GROUPADD_SYNC"," -- [system] SYSTEMBOOT_STATEMODE"," -- [save] SAVE_ROOTCOPY_CHANGES", " -- [locale] LOCALE",NULL)
#define config_get_default_command "ubconfig --source default -ea get users DEFAULTPASSWD DEFAULTROOTPASSWD USERGROUPS DEFAULTUSER HASHPASSWD ADDADM -- get [locale] LOCALE"
#define config_get_global_only_parameters "ubconfig --source global -ea get users DEFAULTPASSWD DEFAULTROOTPASSWD"
#define config_get_local_only_parameters ""
@ -156,6 +158,8 @@
#define USERADD_SYNC_parameter "USERADD_SYNC"
#define USERADD_SYNC_parameter_command "ubconfig --source system get users USERADD_SYNC"
#define LOCALE_parameter "LOCALE"
#define LOCALE_parameter_command "ubconfig --source system get [locale] LOCALE"
#define USERADD_SEARCH_macro "USERADD["
#define USERADD_parameter_command yon_char_unite("ubconfig --source system get users USERADD[",target,"]",NULL)
@ -202,6 +206,7 @@ typedef struct {
int save_config;
int launch_size;
config_str launch_arguments;
GHashTable *locales_hash;
} config;
extern config main_config;
@ -410,6 +415,7 @@ typedef struct{
GtkWidget *userWarningSpin;
GtkWidget *userActivitySpin;
GtkWidget *userForceChangeCheck;
GtkWidget *LanguageCombo;
GtkWidget *userShellCombo;
GtkWidget *userShellEntry;
GtkWidget *userHomeCombo;
@ -438,6 +444,8 @@ typedef struct{
char *old_password;
char *old_username;
char *last_uid;
char *config_locale;
GThread *locale_thread;
} ubl_settings_usergroups_user_window;
typedef struct {
@ -627,4 +635,6 @@ int yon_system_user_sync(char *user);
void on_homedir_changed(GtkComboBox *self, GtkWidget *target);
int yon_config_check_valid();
void on_home_changed(GtkWidget *self,ubl_settings_usergroups_user_window *window);
gboolean yon_user_set_locales(GtkWidget *target);
void *yon_load_languages(void *target);
#endif

@ -302,3 +302,6 @@
#define MDY_FORMAT_LABEL _("MM-DD-YYYY")
#define HOMEDIR_USED_LABEL _("The selected home directory is used by another user")
#define SYSTEM_LANGUAGE_LABEL _("System language:")
#define REGIONAL_SETTINGS_LABEL _("Regional settings")
#define SYSTEM_LABEL _("System")

@ -76,8 +76,8 @@
<row>
<col id="0">False</col>
<col id="1" translatable="yes">Group GID range</col>
<col id="2" translatable="yes"/>
<col id="3" translatable="yes"/>
<col id="2" translatable="yes"></col>
<col id="3" translatable="yes"></col>
<col id="4">True</col>
<col id="5">True</col>
<col id="6">False</col>
@ -90,8 +90,8 @@
<row>
<col id="0">False</col>
<col id="1" translatable="yes">Group GID in system</col>
<col id="2" translatable="yes"/>
<col id="3" translatable="yes"/>
<col id="2" translatable="yes"></col>
<col id="3" translatable="yes"></col>
<col id="4">True</col>
<col id="5">True</col>
<col id="6">False</col>
@ -176,8 +176,8 @@
<row>
<col id="0">False</col>
<col id="1" translatable="yes">Users UID range</col>
<col id="2" translatable="yes"/>
<col id="3" translatable="yes"/>
<col id="2" translatable="yes"></col>
<col id="3" translatable="yes"></col>
<col id="4">True</col>
<col id="5">True</col>
<col id="6">False</col>
@ -190,8 +190,8 @@
<row>
<col id="0">False</col>
<col id="1" translatable="yes">User UID in system</col>
<col id="2" translatable="yes"/>
<col id="3" translatable="yes"/>
<col id="2" translatable="yes"></col>
<col id="3" translatable="yes"></col>
<col id="4">True</col>
<col id="5">True</col>
<col id="6">False</col>
@ -339,7 +339,7 @@
</child>
<child>
<object class="GtkCheckButton" id="DefaultUserAdministratorCheck">
<property name="label" translatable="yes"> user ID of 1000 is an administrator included in the wheel group</property>
<property name="label" translatable="yes">A user ID of 1000 is an administrator included in the wheel group</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>

@ -582,6 +582,83 @@
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0.019999999552965164</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="bottom-padding">5</property>
<property name="left-padding">5</property>
<property name="right-padding">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">System language:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="LanguageCombo">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="active">0</property>
<items>
<item translatable="yes">Default</item>
<item id="system" translatable="yes">System</item>
</items>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Regional settings</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
@ -816,7 +893,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
<property name="position">1</property>
</packing>
</child>
<child>
@ -1099,7 +1176,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
@ -1135,7 +1212,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>

Loading…
Cancel
Save