parent
e3f1278259
commit
99c5d8776f
@ -0,0 +1,204 @@
|
|||||||
|
#include "ubinstall-gtk.h"
|
||||||
|
|
||||||
|
void on_locale_changed(GtkWidget *,main_window *widgets){
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LanguagesTree)),&model,&iter)) return;
|
||||||
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(widgets->InstallerCountryFilter));
|
||||||
|
char *config_code = config(installer_locale_parameter);
|
||||||
|
if (yon_char_is_empty(config_code)){
|
||||||
|
config_code = setlocale(LC_ALL,NULL);
|
||||||
|
}
|
||||||
|
GtkTreeIter itar;
|
||||||
|
for_iter(widgets->InstallerCountryFilter,&iter){
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(widgets->InstallerCountryFilter),&itar,&iter);
|
||||||
|
char *target;
|
||||||
|
gtk_tree_model_get(GTK_TREE_MODEL(widgets->InstallerCountryList),&itar,2,&target,-1);
|
||||||
|
if (!strcmp(config_code,target)){
|
||||||
|
gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(widgets->InstallerCountryFilter),&iter,&itar);
|
||||||
|
gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->CountryLanguagesTree)),&iter);
|
||||||
|
GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(widgets->InstallerCountryFilter),&iter);
|
||||||
|
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(widgets->CountryLanguagesTree),path,0,0,0,0);
|
||||||
|
gtk_tree_path_free(path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_installer_language_changed(GtkWidget *self,GtkTreePath*,GtkTreeViewColumn*, main_window *widgets){
|
||||||
|
char *window_language;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->CountryLanguagesTree)),&model,&iter)) return;
|
||||||
|
gtk_tree_model_get(model,&iter,2,&window_language,-1);
|
||||||
|
if (!yon_char_is_empty(window_language)){
|
||||||
|
char *prev_lang = config(installer_locale_parameter);
|
||||||
|
if (!yon_char_is_empty(prev_lang)&&!strcmp(prev_lang,window_language)) return;
|
||||||
|
yon_config_register(installer_locale_parameter,installer_locale_parameter_command,(char*)window_language);
|
||||||
|
}
|
||||||
|
char *active_lang_id = gtk_tree_model_get_string_from_iter(model,&iter);
|
||||||
|
int size;
|
||||||
|
config_str parameters = yon_config_get_save_parameters_by_key(&size,installer_locale_parameter,NULL);
|
||||||
|
char *command_parameters = yon_char_parsed_to_string(parameters,size," ");
|
||||||
|
char *command = yon_char_unite(ubconfig_dull_command,"--target system ",command_parameters,NULL);
|
||||||
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->MainWindow),G_CALLBACK(on_yon_exit),widgets);
|
||||||
|
if (!system(command)){};
|
||||||
|
yon_main_window_update_locale(widgets);
|
||||||
|
g_signal_handlers_block_by_func(G_OBJECT(self),G_CALLBACK(on_locale_changed),widgets);
|
||||||
|
model = GTK_TREE_MODEL(widgets->InstallerLanguageList);
|
||||||
|
gtk_tree_model_get_iter_from_string(model,&iter,active_lang_id);
|
||||||
|
g_signal_handlers_unblock_by_func(G_OBJECT(self),G_CALLBACK(on_locale_changed),widgets);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void yon_startup_language_init(){
|
||||||
|
char *source = yon_config_get_type_path(main_config.load_mode);
|
||||||
|
if (!source){
|
||||||
|
source = main_config.custom_load_path;
|
||||||
|
}
|
||||||
|
char *command =yon_config_parameter_prepare_command(get_localisation_command,source,NULL,NULL);
|
||||||
|
int size;
|
||||||
|
config_str parsed = yon_config_load(command,&size);
|
||||||
|
{
|
||||||
|
if (!yon_char_is_empty(parsed[0])&&strcmp(parsed[0],"(null)\n")){
|
||||||
|
yon_char_remove_last_symbol(parsed[0],'\n');
|
||||||
|
free(yon_char_divide_search(parsed[0],"=",-1));
|
||||||
|
yon_config_register(installer_locale_parameter,installer_locale_parameter_command,parsed[0]);
|
||||||
|
}
|
||||||
|
if (!yon_char_is_empty(parsed[1])&&strcmp(parsed[1],"(null)\n")){
|
||||||
|
yon_char_remove_last_symbol(parsed[1],'\n');
|
||||||
|
free(yon_char_divide_search(parsed[1],"=",-1));
|
||||||
|
yon_config_register(lang_parameter,lang_parameter_command,parsed[1]);
|
||||||
|
}
|
||||||
|
if (!yon_char_is_empty(parsed[2])&&strcmp(parsed[2],"(null)\n")){
|
||||||
|
yon_char_remove_last_symbol(parsed[2],'\n');
|
||||||
|
free(yon_char_divide_search(parsed[2],"=",-1));
|
||||||
|
yon_config_register(SYSTEM_LANG_parameter,SYSTEM_LANG_parameter_command,parsed[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void yon_main_window_update_locale(main_window *widgets){
|
||||||
|
char *locale = config(installer_locale_parameter);
|
||||||
|
if (yon_char_is_empty(locale)){
|
||||||
|
char *sys_locale = config(lang_parameter);
|
||||||
|
|
||||||
|
if (!yon_char_is_empty(sys_locale)){
|
||||||
|
locale = sys_locale;
|
||||||
|
} else {
|
||||||
|
char *lang = config("LANG");
|
||||||
|
if (!yon_char_is_empty(lang)){
|
||||||
|
locale = lang;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
locale = setlocale(LC_ALL,locale);
|
||||||
|
|
||||||
|
gtk_widget_destroy(widgets->MainWindow);
|
||||||
|
bind_textdomain_codeset(LocaleName,"UTF-8");
|
||||||
|
g_setenv("LANGUAGE",locale,1);
|
||||||
|
|
||||||
|
yon_main_window_create(widgets);
|
||||||
|
char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL);
|
||||||
|
yon_window_config_setup(GTK_WINDOW(widgets->MainWindow));
|
||||||
|
yon_window_config_load(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
char *locale_name;
|
||||||
|
char *code;
|
||||||
|
char *localised_name;
|
||||||
|
char *code_full;
|
||||||
|
} locale_struct;
|
||||||
|
|
||||||
|
int yon_char_parsed_compare(const void *a, const void *b){
|
||||||
|
const config_str str_a = (const config_str)a;
|
||||||
|
const config_str str_b = (const config_str)b;
|
||||||
|
|
||||||
|
return strcmp(*str_a,*str_b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_locales_list(main_window *widgets){
|
||||||
|
gtk_list_store_clear(widgets->InstallerLanguageList);
|
||||||
|
gtk_list_store_clear(widgets->InstallerCountryList);
|
||||||
|
|
||||||
|
char *config_code = yon_char_new(config(installer_locale_parameter));
|
||||||
|
int size;
|
||||||
|
config_str locales = yon_locale_get_all_codes(&size);
|
||||||
|
qsort(locales,size,sizeof(char*),yon_char_parsed_compare);
|
||||||
|
GtkTreeIter iter,itar;
|
||||||
|
GHashTable *added = g_hash_table_new(g_str_hash,g_str_equal);
|
||||||
|
bind_textdomain_codeset(LOCALES_DOMAIN_NAME,"UTF-8");
|
||||||
|
textdomain(LOCALES_DOMAIN_NAME);
|
||||||
|
for (int i=0;i<size;i++){
|
||||||
|
char *lang_ab = yon_locale_get_parameter(locales[i],YON_LOCALE_LANG_AB);
|
||||||
|
char *code = yon_locale_get_parameter(locales[i],YON_LOCALE_CODE);
|
||||||
|
char *language = yon_locale_get_parameter(locales[i],YON_LOCALE_LANGUAGE);
|
||||||
|
char *lang_name = yon_locale_get_parameter(locales[i],YON_LOCALE_LANG_NAME);
|
||||||
|
char *territory = yon_locale_get_parameter(locales[i],YON_LOCALE_TERRITORY);
|
||||||
|
char *title = yon_locale_get_parameter(locales[i],YON_LOCALE_TITLE);
|
||||||
|
if (yon_char_is_empty(lang_ab)||
|
||||||
|
yon_char_is_empty(language)||
|
||||||
|
yon_char_is_empty(lang_name)||
|
||||||
|
yon_char_is_empty(territory)||
|
||||||
|
yon_char_is_empty(title)) continue;
|
||||||
|
|
||||||
|
char *country = yon_char_unite(language,", ",territory,NULL);
|
||||||
|
if (!g_hash_table_contains(added,lang_ab)){
|
||||||
|
g_hash_table_add(added,yon_char_new(lang_ab));
|
||||||
|
gtk_list_store_append(widgets->InstallerLanguageList,&iter);
|
||||||
|
gtk_list_store_set(widgets->InstallerLanguageList,&iter,
|
||||||
|
0,lang_ab,
|
||||||
|
1,_(language),
|
||||||
|
2,lang_name,
|
||||||
|
3,locales[i],
|
||||||
|
-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_list_store_append(widgets->InstallerCountryList,&itar);
|
||||||
|
gtk_list_store_set(widgets->InstallerCountryList,&itar,
|
||||||
|
0,lang_ab,
|
||||||
|
1,_(country),
|
||||||
|
2,code,
|
||||||
|
3,_(title),
|
||||||
|
-1);
|
||||||
|
if (yon_char_is_empty(config_code)){
|
||||||
|
config_code=yon_char_new(setlocale(LC_ALL,NULL));
|
||||||
|
}
|
||||||
|
char *temp = strstr(config_code,".");
|
||||||
|
if (temp) temp[0]='\0';
|
||||||
|
if (!strcmp(config_code,locales[i])){
|
||||||
|
GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(widgets->InstallerLanguageList),&iter);
|
||||||
|
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(widgets->LanguagesTree),path,0,0,0,0);
|
||||||
|
gtk_tree_path_free(path);
|
||||||
|
gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LanguagesTree)),&iter);
|
||||||
|
on_locale_changed(NULL,widgets);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bind_textdomain_codeset(LocaleName,"UTF-8");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean on_country_filter(GtkTreeModel *self, GtkTreeIter *iter, main_window *widgets){
|
||||||
|
GtkTreeIter itar;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LanguagesTree)),&model,&itar)) return 0;
|
||||||
|
char *cur_code,*country;
|
||||||
|
gtk_tree_model_get(self,iter,0,&cur_code,1,&country,-1);
|
||||||
|
if (yon_char_is_empty(cur_code)) return 0;
|
||||||
|
|
||||||
|
char *code;
|
||||||
|
gtk_tree_model_get(model,&itar,0,&code,-1);
|
||||||
|
if (!strcmp(code,cur_code)){
|
||||||
|
char *config_lang = config(installer_locale_parameter);
|
||||||
|
if (!yon_char_is_empty(config_lang)&&!strcmp(cur_code,config_lang)){
|
||||||
|
if (gtk_tree_model_filter_convert_child_iter_to_iter(GTK_TREE_MODEL_FILTER(widgets->InstallerCountryFilter),iter,&itar)){
|
||||||
|
gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->CountryLanguagesTree)),&itar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in new issue