home *** CD-ROM | disk | FTP | other *** search
Wrap
/** * File: * select_language.ycp * * Module: * yast2-country * * Authors: * Klaus KΣmpf <kkaempf@suse.de> * Michael Hager <mike@suse.de> * Stefan Hundhammer <sh@suse.de> * Thomas Roelz <tom@suse.de> * Jiri Suchomel <jsuchome@suse.cz> * * Summary: * This client shows main dialog for choosing the language. * * $Id: select_language.ycp 33853 2006-10-30 15:07:21Z jsuchome $ * */ { textdomain "country"; import "Console"; import "GetInstArgs"; import "Keyboard"; import "Label"; import "Language"; import "Mode"; import "Popup"; import "ProductFeatures"; import "Report"; import "Stage"; import "Timezone"; import "Wizard"; string language = Language::language; /** * Popup for setting expert language values */ define symbol LanguageExpertDialog() { // help text for langauge expert screen string help_text = _("<p> Here, fine-tune settings for the language handling. These settings are written into the file <tt>/etc/sysconfig/language</tt>. If unsure, use the default values already selected. </p> "); // help text for langauge expert screen help_text = help_text + _("<p> <b>Locale Settings for User root</b> determines how the locale variables (LC_*) are set for the root user.</p>") + // help text for langauge expert screen _("<p><b>ctype Only</b>: root has the same LC_CTYPE as a normal user. Other values are unset.<br> <b>Yes</b>: root has the same locale settings as normal user.<br> <b>No</b>: root has all locale variables unset. </p> ") + // help text for langauge expert screen _("<p>Use <b>Detailed Locale Setting</b> to set a locale for the primary language that is not offered in the list in the main dialog. Translation may not be available for the selected locale.</p>"); map val = Language::GetExpertValues(); map val_on_entry = val; y2debug ("expert values %1", val); // get the list of locales for our language string lang = substring (language, 0, 2); list locales_list = []; foreach (string code, integer i, Language::GetLocales (), { if (substring (code, 0, 2) == lang) { locales_list = add (locales_list, code); } }); if (!contains (locales_list, language)) locales_list = add (locales_list, language); UI::OpenDialog (`opt (`decorated), `HBox( `HWeight (40, `RichText (help_text)), `HStretch (), `HSpacing (), `HWeight (60, `VBox ( `HSpacing (45), // heading text `Heading( _("Language Details") ), `VSpacing(`opt(`vstretch), 2), `Left ( // combo box label `ComboBox(`id(`rootlang), _("Locale Settings for User &root"), [ // do not translate "ctype" `item( `id("ctype"), _("ctype Only")), `item( `id("yes"), _("Yes")), `item( `id("no"), _("No")) ] )), `VSpacing (`opt(`vstretch), 1), `Left ( // checkbox label `CheckBox (`id(`use_utf8), _("Use &UTF-8 Encoding"), val["use_utf8"]:true) ), `VSpacing (), `Left ( // combo box label `ComboBox (`id(`locales), _("&Detailed Locale Setting"), locales_list) ), `VSpacing (`opt(`vstretch), 7), `HBox ( `PushButton(`id(`ok), `opt(`default), Label::OKButton()), `PushButton(`id(`cancel),`opt (`key_F9), Label::CancelButton()) ), `VSpacing (0.5) )) )); UI::ChangeWidget (`id(`rootlang), `Value, val["rootlang"]:"ctype"); UI::ChangeWidget (`id(`locales), `Value, language); symbol ret = `none; symbol retval = `expert; repeat { ret = (symbol)UI::UserInput(); if( ret == `ok ) { val = $[]; val["rootlang"] = UI::QueryWidget( `id(`rootlang), `Value ); val["use_utf8"] = UI::QueryWidget( `id(`use_utf8), `Value ); if (val != val_on_entry) { y2milestone ("expert settings changed to %1", val ); Language::SetExpertValues (val); Language::ExpertSettingsChanged = true; } if (language != (string)UI::QueryWidget( `id(`locales), `Value)) { language = (string)UI::QueryWidget(`id(`locales),`Value); retval = `changed_locale; } } } until ( ret == `cancel || ret == `ok ); UI::CloseDialog(); return retval; }; /** * check if selected language has support on media (F301238) * show a warning when not */ define void check_languages_support (string selected_language) { string linguas = (string) SCR::Read (.content.LINGUAS); y2milestone ("content LINGUAS %1", linguas); list<string> ll = splitstring (linguas, " "); string l = substring (selected_language, 0, 2); if (!contains (ll, selected_language) && !contains (ll, l)) // popup message Popup::Message (_("Only minimal support for the selected language is included on the media. Add the Language Add-On CD as an installation source to get better support for this language.")); } /** * helper function for updating the "adapt terms" to current language */ define void update_adapt_term () { string kb = Keyboard::GetKeyboardForLanguage (language, "english-us"); string tz = Timezone::GetTimezoneForLanguage (language, "US/Mountain"); string kbd_name = Keyboard::Selection ()[kb]:""; string tmz_name = Timezone::GetTimezoneCountry (tz); UI::ReplaceWidget (`id(`rpadapt), `VBox ( `Left (`CheckBox (`id (`adapt_kbd), // check box label (%1 is keyboard layout name) sformat(_("Adapt &Keyboard Layout to %1"),kbd_name))), `Left (`CheckBox (`id (`adapt_tmz), // check box label (%1 is country name) sformat (_("Adapt &Time Zone to %1"), tmz_name))) )); UI::ChangeWidget(`id(`adapt_kbd),`Enabled, kb != Keyboard::current_kbd); UI::ChangeWidget(`id(`adapt_tmz),`Enabled, tz != Timezone::timezone); } // ------------------------------------- main part of the client ----------- map argmap = GetInstArgs::argmap(); // Check if the current call should be treated as the first run (3rd param). // In this case if the user exits with next the the current setting // will be made the default that is restored with "Reset to defaults". // boolean set_default = argmap["first_run"]:"no" == "yes"; y2milestone("set_default: %1", set_default ); string preselected = Language::preselected; if (Stage::initial () && preselected != "en_US" && set_default) { if (ProductFeatures::GetBooleanFeature ("globals", "skip_language_dialog")) { y2milestone("Skipping language dialog, Language changed to %1",preselected); check_languages_support (preselected); return `auto; } } // when the possibility for selecting more languages should be shown // (this includes differet UI layout) boolean more_languages = true; list<string>languages = splitstring (Language::languages, ","); // filter the primary language from the list of secondary ones: languages = filter (string l, languages, ``(l != language)); // Build the contents of the dialog. // build up language selection box // with the default selection according to Language::language // set up selection list with default item boolean use_ascii = Language::GetTextMode (); boolean show_expert = true; /* ---------------------------------------------------------------------- * Build dialog * ----------------------------------------------------------------------*/ // heading text string heading_text = _("Languages"); if (Stage::initial () && set_default && !Mode::repair ()) { // heading text heading_text = _("Language"); } if (Mode::repair ()) { // heading text heading_text = _("Welcome to System Repair"); } if (Stage::initial () && set_default) { show_expert = false; more_languages = false; } if (Mode::config ()) { show_expert = false; } // sort language by ASCII with help of a map // $[ "ascii-name" : [ "user-readable-string", "code" ], ...] // the "user-readable-string" is either ascii or utf8, depending // on textmode probed above (workaround because there isn't any // usable console font for all languages). map<string,list> languageselsort = mapmap ( string lang_code, list lang_info, Language::Selection(), { string key = lang_info [1]:lang_code; return $[ key : [ lang_info[use_ascii ? 1 : 0]:"", lang_code, lang_info[2]:key ] ]; } ); // mapping of language name (translated) to language code map lang2code = $[]; // list of language names (translated) list<string> lang_list = []; foreach (any name, list codelist, languageselsort, { lang2code [codelist[2]:""] = codelist[1]:""; lang_list = add (lang_list, codelist[2]:""); }); term languagesel = `SelectionBox (`id(`language), `opt(`notify), "", maplist (any name, list codelist, languageselsort, ``(`item(`id(codelist[1]:""), codelist[0]:"", (language == codelist[1]:"")))) ); // this type of contents will be shown only for initial installation dialog term contents = `HVCenter ( `BackgroundPixmap ("wallpapers/welcome.jpg"), `MinSize (25, 12, languagesel) ); term expert = `HStretch(); if (show_expert) { expert = `VBox ( `Label (""), // button label `PushButton (`id(`expert), _("&Details")) ); } // if checkboxes for adapting keyboard and timezone should be shown boolean adapt_term = more_languages && !Mode::config (); if (more_languages) { boolean primary_included= false; list primary_items = []; term languages_term = `MultiSelectionBox (`id(`languages), // multiselection box label _("&Secondary Languages"), maplist (string trans_lang, lsort (lang_list), { string code = lang2code [trans_lang]:""; primary_items = add (primary_items, `item (`id (code), trans_lang, language == code)); if (language == code) primary_included = true; return `item (`id (code), trans_lang, contains (languages, code)); }) ); if (!primary_included) primary_items = add (primary_items, `item (`id (language), language, true)); term primary_language_term = `ComboBox (`id(`language), `opt (`notify), // combo box label _("Primary &Language"), primary_items); term primary_term = `HBox ( `Left (primary_language_term), `Right (expert) ); if (adapt_term) { // frame label primary_term = `Frame (_("Primary Language Settings"), `HBox ( `HSpacing (0.5), `VBox ( primary_term, `VSpacing (0.5), `ReplacePoint (`id(`rpadapt), `VBox ()), `VSpacing (0.5) ), `HSpacing (0.5)) ); } contents = `VBox ( `VSpacing (), `HBox ( `HSpacing (2), `VBox ( primary_term, `VSpacing (), `ReplacePoint (`id(`rplangs), languages_term), `VSpacing (0.5) ), `HSpacing (2) ), `VSpacing() ); } string help_text = ""; // help text (language dependent packages) - at the end of help string packages_help = _("<p> Additional packages with support for the selected primary and secondary languages will be installed. Packages no longer needed will be removed. </p>"); if (Stage::initial ()) { // help text for initial (first time) language screen help_text = _("<p> Choose the <b>Language</b> to use during installation and for the installed system. </p> "); // help text, continued help_text = help_text + _("<p> Click <b>Next</b> to proceed to the next dialog. </p> "); // help text, continued help_text = help_text + _("<p> Nothing will happen to your computer until you confirm all your settings in the last installation dialog. </p> "); if (set_default) { // help text, continued help_text = help_text + _("<p> You can select <b>Abort Installation</b> at any time to abort the installation process. </p> "); } } else { // different help text when called after installation // in an installed system help_text = _("<p> Choose the new <b>Language</b> for your system. </p>\n"); } if (more_languages) { // help text when "multiple languages" are suported 1/2 help_text = _("<p> Choose the new <b>Primary Language</b> for your system. </p>\n"); // help text for 'adapt keyboard checkbox' help_text = help_text + _("<p> Check <b>Adapt Keyboard Layout</b> to adapt the keyboard layout to the primary language. Check <b>Adapt Time Zone</b> to change the current time zone according to the primary language. </p> "); // help text when "multiple languages" are suported 2/2 help_text = help_text + _("<p> <b>Secondary Languages</b><br> In the selection box, specify additional languages to use on your system. </p> "); help_text = help_text + packages_help; } // Screen title for the first interactive dialog Wizard::SetContents (heading_text, contents, help_text, argmap["enable_back"]:true , argmap["enable_next"]:true); Wizard::SetDesktopIcon("yast-language"); // No .desktop files in inst-sys - use icon explicitly if (Stage::initial () || Stage::firstboot ()) Wizard::SetTitleIcon ("yast-yast-language"); if (adapt_term) update_adapt_term (); // Get the user input. // any ret = nil; UI::SetFocus(`id(`language)); // adapt keyboard for language? boolean kbd_adapt = (Stage::initial () && set_default && !Mode::config ()); // adapt timezone for language? boolean tmz_adapt = (Stage::initial () && set_default && !Mode::config ()); repeat { ret = Wizard::UserInput(); y2debug ("UserInput() returned %1", ret); if (ret == `abort && Popup::ConfirmAbort (`painless)) { Wizard::RestoreNextButton(); return `abort; } if (ret==`expert) { ret = LanguageExpertDialog(); } if (ret == `help) { Wizard::ShowHelp( help_text ); } if (ret == `next || ((ret == `language || ret == `changed_locale) && ! Mode::config ())) { // Get the selected language. // if (ret != `changed_locale) { language = more_languages ? (string) UI::QueryWidget(`id(`language), `Value) : (string) UI::QueryWidget(`id(`language), `CurrentItem); } if (ret != `changed_locale && adapt_term) { kbd_adapt = (boolean) UI::QueryWidget (`id(`adapt_kbd), `Value); tmz_adapt = (boolean) UI::QueryWidget (`id(`adapt_tmz), `Value); } if (ret == `next && Language::IncompleteTranslation (language)) { // continue/cancel message if (!Popup::ContinueCancel (_("Translation of the primary language is not complete. Some texts may be displayed in English. "))) { ret = `not_next; continue; } } if (ret == `next && Stage::initial ()) { check_languages_support (language); } if (language != Language::language) { y2milestone ("Language changed from %1 to %2", Language::language, language); if (more_languages) { list<string> selected_languages = (list<string>) UI::QueryWidget (`id(`languages),`SelectedItems); if (ret != `next) { Language::languages = mergestring (selected_languages, ","); } } if (Stage::initial () && set_default) { Timezone::ResetZonemap (); } // Set it in the Language module. // Language::Set (language); if (adapt_term) update_adapt_term (); } if (Stage::initial ()) { if ((set_default && ret == `language || (!set_default && ret == `next)) && Language::CJKLanguage (language) && !Language::CJKLanguage (preselected) && Language::GetTextMode ()) { // popup message (user selected CJK language in text mode) Popup::Message (_("The selected language cannot be used in text mode. English is used for installation, but the selected language will be used for the new system.")); Language::WfmSetGivenLanguage ("en_US"); } else if (ret == `next || (set_default && ret == `language)) { Console::SelectFont (language); Language::WfmSetLanguage (); } } if (ret == `language && set_default) { // Display newly translated dialog. Wizard::SetFocusToNextButton(); return `again; } if (ret == `next) { // Language has been set already. // On first run store users decision as default. // if (set_default) { y2milestone("Resetting to default language"); Language::SetDefault(); } if (tmz_adapt) { Timezone::SetTimezoneForLanguage (language); } else { Timezone::user_decision = true; } if (kbd_adapt) { Keyboard::SetKeyboardForLanguage (language); if (Stage::initial () && set_default) { Keyboard::SetKeyboardDefault(); } } else { Keyboard::user_decision = true; } if (!Stage::initial () && !Mode::update ()) { // save settings (rest is saved in LanguageWrite) if (kbd_adapt) Keyboard::Save (true); if (tmz_adapt) Timezone::Save (); } y2milestone ("Language: '%1', system encoding '%2'", language, WFM::GetEncoding()); if (more_languages) { list<string> selected_languages = (list<string>) UI::QueryWidget (`id(`languages),`SelectedItems); if (!contains (selected_languages, language)) { selected_languages = add (selected_languages, language); } y2milestone ("selected languages: %1", selected_languages); Language::languages = mergestring (selected_languages, ","); // now adapt language seletions if (Stage::initial () || Mode::update ()) { Pkg::SetAdditionalLocales (selected_languages); } else if (Language::PackagesModified () && !Mode::config ()) { if (!Language::PackagesInit (selected_languages)) { // error message Report::Error (_("There is not enough space to install all additional packages. Remove some languages from the selection.")); ret = `not_next; continue; } } } } } } until (ret == `next || ret == `back); return (symbol) ret; }