home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / select_language.ycp < prev    next >
Text File  |  2006-11-29  |  18KB  |  670 lines

  1. /**
  2.  * File:
  3.  *    select_language.ycp
  4.  *
  5.  * Module:
  6.  *    yast2-country
  7.  *
  8.  * Authors:
  9.  *    Klaus   KΣmpf <kkaempf@suse.de>
  10.  *    Michael Hager <mike@suse.de>
  11.  *    Stefan  Hundhammer <sh@suse.de>
  12.  *    Thomas Roelz <tom@suse.de>
  13.  *    Jiri Suchomel <jsuchome@suse.cz>
  14.  *
  15.  * Summary:
  16.  *    This client shows main dialog for choosing the language.
  17.  *
  18.  * $Id: select_language.ycp 33853 2006-10-30 15:07:21Z jsuchome $
  19.  *
  20.  */
  21. {
  22.     textdomain "country";
  23.  
  24.     import "Console";
  25.     import "GetInstArgs";
  26.     import "Keyboard";
  27.     import "Label";
  28.     import "Language";
  29.     import "Mode";
  30.     import "Popup";
  31.     import "ProductFeatures";
  32.     import "Report";
  33.     import "Stage";
  34.     import "Timezone";
  35.     import "Wizard";
  36.  
  37.     string language        = Language::language;
  38.  
  39.     /**
  40.      * Popup for setting expert language values
  41.      */
  42.     define symbol LanguageExpertDialog() {
  43.  
  44.     // help text for langauge expert screen
  45.     string help_text = _("<p>
  46. Here, fine-tune settings for the language handling.
  47. These settings are written into the file <tt>/etc/sysconfig/language</tt>.
  48. If unsure, use the default values already selected.
  49. </p>
  50. ");
  51.  
  52.     // help text for langauge expert screen
  53.     help_text = help_text + _("<p>
  54. <b>Locale Settings for User root</b>
  55. determines how the locale variables (LC_*) are set for the root user.</p>") +
  56.  
  57.     // help text for langauge expert screen
  58.     _("<p><b>ctype Only</b>: root has the same LC_CTYPE as a normal user. Other values
  59. are unset.<br>
  60. <b>Yes</b>: root has the same locale settings as normal user.<br>
  61. <b>No</b>: root has all locale variables unset.
  62. </p>
  63. ") +
  64.  
  65.     // help text for langauge expert screen
  66.     _("<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>");
  67.  
  68.     map val        = Language::GetExpertValues();
  69.     map val_on_entry    = val;
  70.     y2debug ("expert values %1", val);
  71.  
  72.     // get the list of locales for our language
  73.     string lang        = substring (language, 0, 2);
  74.     list locales_list    = [];
  75.  
  76.     foreach (string code, integer i, Language::GetLocales (), {
  77.     if (substring (code, 0, 2) == lang)
  78.     {
  79.         locales_list = add (locales_list, code);
  80.     }
  81.     });
  82.     if (!contains (locales_list, language))
  83.     locales_list    = add (locales_list, language);
  84.  
  85.     UI::OpenDialog (`opt (`decorated), `HBox(
  86.     `HWeight (40, `RichText (help_text)),
  87.     `HStretch (),
  88.     `HSpacing (),
  89.     `HWeight (60, `VBox (
  90.         `HSpacing (45),
  91.         // heading text
  92.         `Heading( _("Language Details") ),
  93.         `VSpacing(`opt(`vstretch), 2),
  94.         `Left (
  95.         // combo box label
  96.         `ComboBox(`id(`rootlang), _("Locale Settings for User &root"),
  97.             [
  98.             // do not translate "ctype"
  99.             `item( `id("ctype"), _("ctype Only")),
  100.             `item( `id("yes"), _("Yes")),
  101.             `item( `id("no"), _("No"))
  102.             ]
  103.         )),
  104.         `VSpacing (`opt(`vstretch), 1),
  105.         `Left (
  106.         // checkbox label
  107.         `CheckBox (`id(`use_utf8), _("Use &UTF-8 Encoding"),
  108.             val["use_utf8"]:true)
  109.         ),
  110.         `VSpacing (),
  111.         `Left (
  112.         // combo box label
  113.             `ComboBox (`id(`locales), _("&Detailed Locale Setting"),
  114.             locales_list)
  115.         ),
  116.         `VSpacing (`opt(`vstretch), 7),
  117.         `HBox (
  118.         `PushButton(`id(`ok), `opt(`default), Label::OKButton()),
  119.         `PushButton(`id(`cancel),`opt (`key_F9), Label::CancelButton())
  120.         ),
  121.         `VSpacing (0.5)
  122.     ))
  123.     ));
  124.  
  125.     UI::ChangeWidget (`id(`rootlang), `Value, val["rootlang"]:"ctype");
  126.     UI::ChangeWidget (`id(`locales), `Value, language);
  127.  
  128.     symbol ret        = `none;
  129.     symbol retval    = `expert;
  130.     repeat
  131.     {
  132.     ret = (symbol)UI::UserInput();
  133.     if( ret == `ok )
  134.     {
  135.         val = $[];
  136.         val["rootlang"]    = UI::QueryWidget( `id(`rootlang), `Value );
  137.         val["use_utf8"]    = UI::QueryWidget( `id(`use_utf8), `Value );
  138.         if (val != val_on_entry)
  139.         {
  140.         y2milestone ("expert settings changed to %1", val );
  141.         Language::SetExpertValues (val);
  142.         Language::ExpertSettingsChanged = true;
  143.         }
  144.         if (language != (string)UI::QueryWidget( `id(`locales), `Value))
  145.         {
  146.             language    = (string)UI::QueryWidget(`id(`locales),`Value);
  147.         retval        = `changed_locale;
  148.         }
  149.     }
  150.     } until ( ret == `cancel || ret == `ok );
  151.     UI::CloseDialog();
  152.     return retval;
  153.     };
  154.  
  155.     /**
  156.      * check if selected language has support on media (F301238)
  157.      * show a warning when not
  158.      */
  159.     define void check_languages_support (string selected_language) {
  160.  
  161.     string linguas = (string) SCR::Read (.content.LINGUAS);
  162.     y2milestone ("content LINGUAS %1", linguas);
  163.     list<string> ll    = splitstring (linguas, " ");
  164.     string l = substring (selected_language, 0, 2);
  165.     if (!contains (ll, selected_language) && !contains (ll, l))
  166.         // popup message
  167.         Popup::Message (_("Only minimal support for the selected language is included on the media.
  168. Add the Language Add-On CD as an installation source to get better support
  169. for this language."));
  170.     }
  171.  
  172.  
  173.     /**
  174.      * helper function for updating the "adapt terms" to current language
  175.      */
  176.     define void update_adapt_term () {
  177.  
  178.     string kb = Keyboard::GetKeyboardForLanguage (language, "english-us");
  179.     string tz = Timezone::GetTimezoneForLanguage (language, "US/Mountain");
  180.     string kbd_name    = Keyboard::Selection ()[kb]:"";
  181.     string tmz_name    = Timezone::GetTimezoneCountry (tz);
  182.  
  183.     UI::ReplaceWidget (`id(`rpadapt), `VBox (
  184.         `Left (`CheckBox (`id (`adapt_kbd),
  185.         // check box label (%1 is keyboard layout name)
  186.         sformat(_("Adapt &Keyboard Layout to %1"),kbd_name))),
  187.         `Left (`CheckBox (`id (`adapt_tmz),
  188.         // check box label (%1 is country name)
  189.         sformat (_("Adapt &Time Zone to %1"), tmz_name)))
  190.     ));
  191.     UI::ChangeWidget(`id(`adapt_kbd),`Enabled, kb != Keyboard::current_kbd);
  192.     UI::ChangeWidget(`id(`adapt_tmz),`Enabled, tz != Timezone::timezone);
  193.     }
  194.  
  195.     // ------------------------------------- main part of the client -----------
  196.  
  197.     map argmap = GetInstArgs::argmap();
  198.  
  199.     // Check if the current call should be treated as the first run (3rd param).
  200.     // In this case if the user exits with next the the current setting
  201.     // will be made the default that is restored with "Reset to defaults".
  202.     //
  203.     boolean set_default = argmap["first_run"]:"no" == "yes";
  204.     y2milestone("set_default: %1", set_default );
  205.  
  206.     string preselected = Language::preselected;
  207.  
  208.     if (Stage::initial () && preselected != "en_US" && set_default)
  209.     {
  210.     if (ProductFeatures::GetBooleanFeature ("globals", "skip_language_dialog"))
  211.     {
  212.         y2milestone("Skipping language dialog, Language changed to %1",preselected);
  213.         check_languages_support (preselected);
  214.         return `auto;
  215.     }
  216.     }
  217.  
  218.  
  219.     // when the possibility for selecting more languages should be shown
  220.     // (this includes differet UI layout)
  221.     boolean more_languages    = true;
  222.  
  223.     list<string>languages    = splitstring (Language::languages, ",");
  224.  
  225.     // filter the primary language from the list of secondary ones:
  226.     languages    = filter (string l, languages, ``(l != language));
  227.  
  228.  
  229.     // Build the contents of the dialog.
  230.  
  231.     // build up language selection box
  232.     // with the default selection according to Language::language
  233.  
  234.     // set up selection list with default item
  235.  
  236.     boolean use_ascii    = Language::GetTextMode ();
  237.     boolean show_expert = true;
  238.  
  239.    /* ----------------------------------------------------------------------
  240.     * Build dialog
  241.     * ----------------------------------------------------------------------*/
  242.     // heading text
  243.     string heading_text = _("Languages");
  244.  
  245.     if (Stage::initial () && set_default && !Mode::repair ())
  246.     {
  247.     // heading text
  248.     heading_text = _("Language");
  249.     }
  250.     if (Mode::repair ())
  251.     {
  252.     // heading text
  253.     heading_text = _("Welcome to System Repair");
  254.     }
  255.  
  256.     if (Stage::initial () && set_default)
  257.     {
  258.     show_expert    = false;
  259.     more_languages    = false;
  260.     }
  261.     if (Mode::config ())
  262.     {
  263.     show_expert    = false;
  264.     }
  265.  
  266.  
  267.     // sort language by ASCII with help of a map
  268.     // $[ "ascii-name" : [ "user-readable-string", "code" ], ...]
  269.     // the "user-readable-string" is either ascii or utf8, depending
  270.     // on textmode probed above (workaround because there isn't any
  271.     // usable console font for all languages).
  272.  
  273.     map<string,list> languageselsort = mapmap (
  274.     string lang_code, list lang_info, Language::Selection(), {
  275.         string key    = lang_info [1]:lang_code;
  276.         return $[
  277.         key        : [
  278.             lang_info[use_ascii ? 1 : 0]:"",
  279.             lang_code,
  280.             lang_info[2]:key
  281.         ]
  282.         ];
  283.     }
  284.     );
  285.  
  286.     // mapping of language name (translated) to language code
  287.     map lang2code        = $[];
  288.     // list of language names (translated)
  289.     list<string> lang_list    = [];
  290.     foreach (any name, list codelist, languageselsort, {
  291.     lang2code [codelist[2]:""]    = codelist[1]:"";
  292.     lang_list    = add (lang_list, codelist[2]:"");
  293.     });
  294.  
  295.     term languagesel = `SelectionBox (`id(`language), `opt(`notify), "",
  296.     maplist (any name, list codelist, languageselsort,
  297.         ``(`item(`id(codelist[1]:""), codelist[0]:"",
  298.               (language == codelist[1]:""))))
  299.     );
  300.  
  301.     // this type of contents will be shown only for initial installation dialog
  302.     term contents = `HVCenter (
  303.     `BackgroundPixmap ("wallpapers/welcome.jpg"),
  304.     `MinSize (25, 12, languagesel)
  305.     );
  306.  
  307.     term expert = `HStretch();
  308.     if (show_expert)
  309.     {
  310.     expert = `VBox (
  311.         `Label (""),
  312.         // button label
  313.         `PushButton (`id(`expert), _("&Details"))
  314.     );
  315.     }
  316.  
  317.     // if checkboxes for adapting keyboard and timezone should be shown
  318.     boolean adapt_term = more_languages && !Mode::config ();
  319.  
  320.     if (more_languages)
  321.     {
  322.     boolean primary_included= false;
  323.     list primary_items    = [];
  324.  
  325.     term languages_term = `MultiSelectionBox (`id(`languages),
  326.         // multiselection box label
  327.         _("&Secondary Languages"),
  328.         maplist (string trans_lang, lsort (lang_list), {
  329.         string code    = lang2code [trans_lang]:"";
  330.         primary_items = add (primary_items,
  331.             `item (`id (code), trans_lang, language == code));
  332.         if (language == code)
  333.             primary_included    = true;
  334.         return
  335.             `item (`id (code), trans_lang, contains (languages, code));
  336.         })
  337.     );
  338.     if (!primary_included)
  339.         primary_items = add (primary_items,
  340.         `item (`id (language), language, true));
  341.  
  342.     term primary_language_term = `ComboBox (`id(`language), `opt (`notify),
  343.         // combo box label
  344.         _("Primary &Language"), primary_items);
  345.  
  346.  
  347.     term primary_term = `HBox (
  348.             `Left (primary_language_term),
  349.             `Right (expert)
  350.     );
  351.  
  352.     if (adapt_term)
  353.     {
  354.         // frame label
  355.         primary_term = `Frame (_("Primary Language Settings"), `HBox (
  356.         `HSpacing (0.5),
  357.         `VBox (
  358.             primary_term,
  359.             `VSpacing (0.5),
  360.             `ReplacePoint (`id(`rpadapt), `VBox ()),
  361.             `VSpacing (0.5)
  362.         ),
  363.         `HSpacing (0.5))
  364.         );
  365.     }
  366.  
  367.     contents = `VBox (
  368.         `VSpacing (),
  369.         `HBox (
  370.         `HSpacing (2),
  371.         `VBox (
  372.             primary_term,
  373.             `VSpacing (),
  374.             `ReplacePoint (`id(`rplangs), languages_term),
  375.             `VSpacing (0.5)
  376.         ),
  377.         `HSpacing (2)
  378.         ),
  379.         `VSpacing()
  380.     );
  381.     }
  382.  
  383.     string help_text        = "";
  384.     // help text (language dependent packages) - at the end of help
  385.     string packages_help    = _("<p>
  386. Additional packages with support for the selected primary and secondary languages will be installed. Packages no longer needed will be removed.
  387. </p>");
  388.  
  389.     if (Stage::initial ())
  390.     {
  391.     // help text for initial (first time) language screen
  392.     help_text = _("<p>
  393. Choose the <b>Language</b> to use during installation and for
  394. the installed system.
  395. </p>
  396. ");
  397.  
  398.     // help text, continued
  399.     help_text = help_text + _("<p>
  400. Click <b>Next</b> to proceed to the next dialog.
  401. </p>
  402. ");
  403.  
  404.     // help text, continued
  405.     help_text = help_text + _("<p>
  406. Nothing will happen to your computer until you confirm
  407. all your settings in the last installation dialog.
  408. </p>
  409. ");
  410.     if (set_default)
  411.     {
  412.         // help text, continued
  413.         help_text = help_text + _("<p>
  414. You can select <b>Abort Installation</b> at any time to abort the
  415. installation process.
  416. </p>
  417. ");
  418.     }
  419.     }
  420.     else
  421.     {
  422.     // different help text when called after installation
  423.     // in an installed system
  424.     help_text = _("<p>
  425. Choose the new <b>Language</b> for your system.
  426. </p>\n");
  427.     }
  428.  
  429.     if (more_languages)
  430.     {
  431.     // help text when "multiple languages" are suported 1/2
  432.     help_text = _("<p>
  433. Choose the new <b>Primary Language</b> for your system.
  434. </p>\n");
  435.  
  436.     // help text for 'adapt keyboard checkbox'
  437.     help_text    = help_text + _("<p>
  438. Check <b>Adapt Keyboard Layout</b> to adapt the keyboard layout to the primary language.
  439. Check <b>Adapt Time Zone</b> to change the current time zone according to the primary language.
  440. </p>
  441. ");
  442.  
  443.     // help text when "multiple languages" are suported 2/2
  444.     help_text    = help_text + _("<p>
  445. <b>Secondary Languages</b><br>
  446. In the selection box, specify additional languages to use on your system.
  447. </p>
  448. ");
  449.  
  450.     help_text       = help_text + packages_help;
  451.     }
  452.  
  453.     // Screen title for the first interactive dialog
  454.  
  455.     Wizard::SetContents (heading_text, contents, help_text,
  456.     argmap["enable_back"]:true , argmap["enable_next"]:true);
  457.  
  458.     Wizard::SetDesktopIcon("yast-language");
  459.  
  460.     // No .desktop files in inst-sys - use icon explicitly
  461.     if (Stage::initial () || Stage::firstboot ())
  462.     Wizard::SetTitleIcon ("yast-yast-language");
  463.  
  464.     if (adapt_term)
  465.     update_adapt_term ();
  466.  
  467.     // Get the user input.
  468.     //
  469.     any ret = nil;
  470.  
  471.     UI::SetFocus(`id(`language));
  472.  
  473.     // adapt keyboard for language?
  474.     boolean kbd_adapt = (Stage::initial () && set_default && !Mode::config ());
  475.     // adapt timezone for language?
  476.     boolean tmz_adapt = (Stage::initial () && set_default && !Mode::config ());
  477.  
  478.  
  479.     repeat
  480.     {
  481.     ret = Wizard::UserInput();
  482.     y2debug ("UserInput() returned %1", ret);
  483.  
  484.     if (ret == `abort && Popup::ConfirmAbort (`painless))
  485.     {
  486.         Wizard::RestoreNextButton();
  487.         return `abort;
  488.     }
  489.  
  490.     if (ret==`expert)
  491.     {
  492.         ret    = LanguageExpertDialog();
  493.     }
  494.  
  495.     if (ret == `help)
  496.     {
  497.         Wizard::ShowHelp( help_text );
  498.     }
  499.  
  500.     if (ret == `next ||
  501.        ((ret == `language || ret == `changed_locale) && ! Mode::config ()))
  502.     {
  503.         // Get the selected language.
  504.         //
  505.         if (ret != `changed_locale)
  506.         {
  507.         language = more_languages ?
  508.             (string) UI::QueryWidget(`id(`language), `Value) :
  509.             (string) UI::QueryWidget(`id(`language), `CurrentItem);
  510.         }
  511.  
  512.         if (ret != `changed_locale && adapt_term)
  513.         {
  514.         kbd_adapt = (boolean) UI::QueryWidget (`id(`adapt_kbd), `Value);
  515.         tmz_adapt = (boolean) UI::QueryWidget (`id(`adapt_tmz), `Value);
  516.         }
  517.  
  518.         if (ret == `next && Language::IncompleteTranslation (language))
  519.         {
  520.         // continue/cancel message
  521.         if (!Popup::ContinueCancel (_("Translation of the primary language is not complete.
  522. Some texts may be displayed in English.
  523. ")))
  524.         {
  525.             ret = `not_next;
  526.             continue;
  527.         }
  528.         }
  529.         if (ret == `next && Stage::initial ())
  530.         {
  531.         check_languages_support (language);
  532.         }
  533.         if (language != Language::language)
  534.         {
  535.         y2milestone ("Language changed from %1 to %2", Language::language, language);
  536.         if (more_languages)
  537.         {
  538.             list<string> selected_languages = (list<string>)
  539.             UI::QueryWidget (`id(`languages),`SelectedItems);
  540.  
  541.             if (ret != `next)
  542.             {
  543.             Language::languages =
  544.                 mergestring (selected_languages, ",");
  545.             }
  546.         }
  547.  
  548.  
  549.         if (Stage::initial () && set_default)
  550.         {
  551.             Timezone::ResetZonemap ();
  552.         }
  553.  
  554.         // Set it in the Language module.
  555.         //
  556.         Language::Set (language);
  557.         if (adapt_term)
  558.             update_adapt_term ();
  559.         }
  560.  
  561.         if (Stage::initial ())
  562.         {
  563.         if ((set_default && ret == `language ||
  564.             (!set_default && ret == `next)) &&
  565.             Language::CJKLanguage (language) &&
  566.             !Language::CJKLanguage (preselected) &&
  567.             Language::GetTextMode ())
  568.         {
  569.             // popup message (user selected CJK language in text mode)
  570.             Popup::Message (_("The selected language cannot be used in text mode. English is used for
  571. installation, but the selected language will be used for the new system."));
  572.  
  573.             Language::WfmSetGivenLanguage ("en_US");
  574.         }
  575.         else if (ret == `next || (set_default && ret == `language))
  576.         {
  577.             Console::SelectFont (language);
  578.             Language::WfmSetLanguage ();
  579.         }
  580.         }
  581.  
  582.         if (ret == `language && set_default)
  583.         {
  584.         // Display newly translated dialog.
  585.         Wizard::SetFocusToNextButton();
  586.         return `again;
  587.         }
  588.  
  589.         if (ret == `next)
  590.         {
  591.         // Language has been set already.
  592.         // On first run store users decision as default.
  593.         //
  594.         if (set_default)
  595.         {
  596.             y2milestone("Resetting to default language");
  597.             Language::SetDefault();
  598.         }
  599.  
  600.         if (tmz_adapt)
  601.         {
  602.             Timezone::SetTimezoneForLanguage (language);
  603.         }
  604.         else
  605.         {
  606.             Timezone::user_decision = true;
  607.         }
  608.  
  609.         if (kbd_adapt)
  610.         {
  611.             Keyboard::SetKeyboardForLanguage (language);
  612.             if (Stage::initial () && set_default)
  613.             {
  614.             Keyboard::SetKeyboardDefault();
  615.             }
  616.         }
  617.         else
  618.         {
  619.             Keyboard::user_decision = true;
  620.         }
  621.  
  622.         if (!Stage::initial () && !Mode::update ())
  623.         {
  624.             // save settings (rest is saved in LanguageWrite)
  625.             if (kbd_adapt)
  626.             Keyboard::Save (true);
  627.             if (tmz_adapt)
  628.             Timezone::Save ();
  629.         }
  630.         y2milestone ("Language: '%1', system encoding '%2'", language,
  631.                      WFM::GetEncoding());
  632.  
  633.         if (more_languages)
  634.         {
  635.             list<string> selected_languages = (list<string>)
  636.             UI::QueryWidget (`id(`languages),`SelectedItems);
  637.  
  638.             if (!contains (selected_languages, language))
  639.             {
  640.             selected_languages = add (selected_languages, language);
  641.             }
  642.             y2milestone ("selected languages: %1", selected_languages);
  643.  
  644.             Language::languages = mergestring (selected_languages, ",");
  645.  
  646.             // now adapt language seletions
  647.             if (Stage::initial () || Mode::update ())
  648.             {
  649.             Pkg::SetAdditionalLocales (selected_languages);
  650.             }
  651.             else if (Language::PackagesModified () && !Mode::config ())
  652.             {
  653.             if (!Language::PackagesInit (selected_languages))
  654.             {
  655.                 // error message
  656.                 Report::Error (_("There is not enough space to install all additional packages.
  657. Remove some languages from the selection."));
  658.                 ret = `not_next;
  659.                 continue;
  660.             }
  661.             }
  662.         }
  663.         }
  664.     }
  665.     }
  666.     until (ret == `next || ret == `back);
  667.  
  668.     return (symbol) ret;
  669. }
  670.