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 / inst_language_add-on.ycp < prev    next >
Text File  |  2006-11-29  |  10KB  |  328 lines

  1. /**
  2.  * File:    clients/inst_language_add-on.ycp
  3.  * Authors:    Lukas Ocilka <locilka@suse.cz>
  4.  * Summary:    Template client for language Add-On products
  5.  *
  6.  * This is a template for Language Add-Ons. It can be either called
  7.  * from the installation.xml in the root ("/") of the product or
  8.  * called from command-line for testing purposes:
  9.  * `yast2 inst_language_add-on.ycp "$[]" url_to_add_on_source`.
  10.  *
  11.  * $Id$
  12.  */
  13. {
  14.     import "Pkg";
  15.     import "Language";
  16.     import "Wizard";
  17.     import "Label";
  18.     import "Popup";
  19.     
  20.     textdomain "installation";
  21.  
  22.     /**
  23.      * Returns the list of available languages. It is based on the
  24.      * "LINGUAS" entry in the /content file. Returns nil if something
  25.      * is wrong.
  26.      *
  27.      * @return list <string> supported languages
  28.      *   (e.g., ["af", "ar", "be_BY", "bg", "ca", "cs", "cy", "da", "el", "et", "fi"])
  29.      */
  30.     list <string> GetListOfSupportedLanguages (integer source) {
  31.     string content_file = Pkg::SourceProvideFile (source, 1, "/content");
  32.     if (content_file == nil || content_file == "") {
  33.         y2error ("There is no content file!");
  34.         return nil;
  35.     }
  36.  
  37.     SCR::RegisterAgent (.media.content, `ag_ini(
  38.         `IniAgent( content_file,
  39.         $[
  40.         "options" : [ "read_only", "global_values", "flat" ],
  41.         "comments" : [ "^#.*", "^[ \t]*$", ],
  42.         "params" : [
  43.             $[ "match" : [ "^[ \t]*([a-zA-Z0-9_\.]+)[ \t]*(.*)[ \t]*$", "%s %s" ] ]
  44.         ]
  45.         ]
  46.     )));
  47.     string supported_languages = tostring (SCR::Read (.media.content.LINGUAS));
  48.     if (supported_languages == nil || supported_languages == "") {
  49.         y2error ("No languages [LINGUAS] defined!");
  50.         return nil;
  51.     }
  52.  
  53.     y2milestone("Languages found: %1", supported_languages);
  54.     SCR::UnregisterAgent (.media.content);
  55.  
  56.     return splitstring (supported_languages, " ");
  57.     }
  58.  
  59.     /**
  60.      * Solves dependencies and installs packages
  61.      */
  62.     boolean Install (list <string> languages_to_install) {
  63.     y2milestone ("Installing packages for languages: %1", languages_to_install);
  64.     Pkg::SetAdditionalLocales (languages_to_install);
  65.  
  66.     y2milestone("Solving dependencies");
  67.     if (Pkg::PkgSolve(true) != true) {
  68.         y2error("Cannot solve dependencies");
  69.         return false;
  70.     }
  71.  
  72.     y2milestone("Installing packages");
  73.     WFM::call("inst_rpmcopy");
  74.     WFM::call("inst_suseconfig");
  75.     
  76.     Popup::Message (
  77.         // TRANSLATORS: popup message
  78.         _("Installation of the Language Extension has been finished.")
  79.     );
  80.  
  81.     return true;
  82.     }
  83.  
  84.     /**
  85.      * Only when WFM::Args[1] contains an URL to be added
  86.      */
  87.     void InitFunction () {
  88.     list args = WFM::Args();
  89.     y2milestone ("Args: %1", args);
  90.     string add_on_url = tostring (args[1]:"");
  91.  
  92.     if (add_on_url == "") {
  93.         y2milestone("No URL given as an argument, not initializing source.");
  94.         return;
  95.     }
  96.     
  97.     y2milestone ("Using URL: '%1'", add_on_url);
  98.  
  99.     import "PackageCallbacksInit";
  100.     import "SourceManager";
  101.  
  102.     PackageCallbacksInit::InitPackageCallbacks();
  103.     
  104.     Pkg::TargetInit ("/", true);
  105.     Pkg::SourceStartManager (true);
  106.     
  107.         SourceManager::createSource (add_on_url);
  108.     }
  109.  
  110.     // Dialog definitions -->
  111.     
  112.     void Dialog_Init () {
  113.     Wizard::SetContentsButtons(
  114.         // TRANSLATORS: dialog caption
  115.         _("Add-On Product Installation"),
  116.         // TRANSLATORS: dialog content - a very simple label
  117.         `Label(_("Initializing...")),
  118.         // TRANSLATORS: help text
  119.         _("<p>Initializing add-on products...</p>"),
  120.         Label::BackButton(),
  121.         Label::NextButton()
  122.     );
  123.     Wizard::SetDesktopIcon("yast-language");
  124.     Wizard::DisableBackButton();
  125.     Wizard::DisableAbortButton();
  126.     Wizard::DisableNextButton();
  127.     }
  128.  
  129.     list <string> Dialog_SelectLanguagesUI (
  130.     map <string, string> & known_languages,
  131.     list <string> & already_installed_languages
  132.     ) {
  133.     list <term> items = [];
  134.     list <string> pre_selected_languages = [];
  135.     boolean pre_selected = nil;
  136.  
  137.     // for each language supported on the medium
  138.     foreach (string short, string long, known_languages, {
  139.         // installed is 'de' or 'cs' or 'zh'
  140.         if (contains (already_installed_languages, short)) {
  141.         pre_selected = true;
  142.         // installed is 'de_XY' or 'cs_AB' or 'zh_CD'
  143.         // but not on the medium, find similar
  144.         } else if (size (short) > 2) {
  145.         string language_substring = substring (short, 0, 2);
  146.         if (contains (already_installed_languages, language_substring)) {
  147.             pre_selected = true;
  148.         } else {
  149.             pre_selected = false;
  150.         }
  151.         } else {
  152.         pre_selected = false;
  153.         }
  154.         if (pre_selected) pre_selected_languages = add (pre_selected_languages,
  155.         sformat ("%1 (%2)", short, long)
  156.         );
  157.         items = add (items, `item (`id (short), long, pre_selected));
  158.     });
  159.     y2milestone ("Preselected languages: %1", pre_selected_languages);
  160.     
  161.     items = sort (term x, term y, items, ``(x[1]:"" < y[1]:""));
  162.     Wizard::SetContentsButtons(
  163.         // TRANSLATORS: dialog caption
  164.         _("Add-On Product Installation"),
  165.         `VBox (
  166.         `HBox (
  167.             `HStretch (),
  168.             `MultiSelectionBox (
  169.             `id ("languages"),
  170.             // TRANSLATORS:: multi-selection box
  171.             _("&Select Language Extensions to Be Installed"),
  172.             items
  173.             ),
  174.             `HStretch ()
  175.         )
  176.         ),
  177.         // TRANSLATORS: help text
  178.         _("<p>Select language extensions to be installed and click <b>Accept</b>.</p>"),
  179.         Label::BackButton(),
  180.         Label::AcceptButton()
  181.     );
  182.     Wizard::SetDesktopIcon("yast-language");
  183.     Wizard::DisableBackButton();
  184.     Wizard::EnableAbortButton();
  185.     Wizard::EnableNextButton();
  186.     
  187.     list <string> selected_languages = nil;
  188.     any ret = nil;
  189.     while (true) {
  190.         ret = UI::UserInput();
  191.         
  192.         if (ret == `cancel || ret == `abort) {
  193.         if (Popup::YesNo(
  194.             // TRANSLATORS: popup question
  195.             _("Are you sure you want to abort the Add-On product installation?")
  196.         )) {
  197.             selected_languages = [];
  198.             break;
  199.         }
  200.         } else if (ret == `next) {
  201.         selected_languages = (list <string>) UI::QueryWidget(`id ("languages"), `SelectedItems);
  202.         if (size (selected_languages) == 0) {
  203.             if (! Popup::YesNo (
  204.             _("There are no selected languages to be installed.
  205. Are you sure you want to abort the installation?")
  206.             )) {
  207.             continue;
  208.             } else {
  209.             y2warning ("User decided not to install any language support.");
  210.             }
  211.         }
  212.         
  213.         break;
  214.         }
  215.     }
  216.     
  217.     return selected_languages;
  218.     }
  219.     
  220.     list <string> Dialog_SelectLanguages (
  221.     list <string> available_languages,
  222.     list <string> & already_installed_languages
  223.     ) {
  224.     if (available_languages == nil || available_languages == []) {
  225.         y2error ("No availabel languages");
  226.         return nil;
  227.     } else if (size (available_languages) == 1) {
  228.         y2milestone ("Only one language available, using %1", available_languages);
  229.         return available_languages;
  230.     } else {
  231.         map <string, list> known_languages = Language::GetLanguagesMap(false);
  232.         
  233.         map <string, string> short_to_lang = $[];
  234.         foreach (string one_lang, available_languages, {
  235.         // full xx_YY
  236.         if (known_languages[one_lang]:nil != nil) {
  237.             short_to_lang[one_lang] = known_languages[one_lang,4]:"";
  238.         // xx only without _YY
  239.         } else {
  240.             boolean found = false;
  241.             foreach (string lang_short, list lang_params, known_languages, {
  242.             if (regexpmatch(lang_short, sformat("%1_.*", one_lang))) {
  243.                 short_to_lang[one_lang] = tostring(lang_params[4]:"");
  244.                 found = true;
  245.                 break;
  246.             }
  247.             });
  248.             if (! found) {
  249.             y2warning ("Couldn't find language for '%1'", one_lang);
  250.             // TRANSLATORS: multiselection box item, %1 stands for 'ar', 'mk', 'zh_TW'
  251.             // it used only as a fallback
  252.             short_to_lang[one_lang] = sformat (_("Language %1"), one_lang);
  253.             }
  254.         }
  255.         });
  256.  
  257.         y2milestone("%1", short_to_lang);
  258.         list <string> selected_languages = Dialog_SelectLanguagesUI (short_to_lang, already_installed_languages);
  259.         
  260.         return selected_languages;
  261.     }
  262.     }
  263.     
  264.     // Dialog definitions <--
  265.     
  266.     integer MainFunction () {
  267.     Dialog_Init ();
  268.  
  269.     // This call can be removed
  270.     InitFunction ();
  271.  
  272.     // Finding out the source, can be also used AddOnProduct::src_id
  273.     // but this is better for testing
  274.     list <integer> all_sources = Pkg::SourceGetCurrent (true);
  275.     all_sources = sort (integer x, integer y, all_sources, ``(x < y));
  276.     integer source = all_sources[size(all_sources) - 1]:-1;
  277.     Pkg::SourceSetEnabled (source, true);
  278.     
  279.     // one language   -> preselect it and install
  280.     // more languages -> let user decides
  281.     list <string> available_languages = GetListOfSupportedLanguages (source);
  282.     if (available_languages == nil || available_languages == []) {
  283.         y2error ("No languages available!");
  284.         return 10;
  285.     }
  286.     
  287.     // bugzilla #217052
  288.     // some languages should be pre-selected (already installed, at least partly)
  289.     list <map <string, any> > installed_languages = Pkg::ResolvableProperties("", `language, "");
  290.     list <string> already_installed_languages = [];
  291.     foreach (map <string, any> language, installed_languages, {
  292.         if (language["status"]:nil == `installed) {
  293.         if (language["name"]:nil != nil) {
  294.             already_installed_languages = add (already_installed_languages, language["name"]:"");
  295.         } else {
  296.             y2error ("Language %1 has no 'name'", language);
  297.         }
  298.         }
  299.     });
  300.  
  301.     y2milestone ("Already installed languages: %1", already_installed_languages);
  302.     list <string> selected_languages = Dialog_SelectLanguages (available_languages, already_installed_languages);
  303.     if (selected_languages == nil || selected_languages == []) {
  304.         y2warning("User did not select any language, finishing...");
  305.         return 15;
  306.     }
  307.  
  308.     if (Install (selected_languages) != true) {
  309.         y2error("Error occured during installation");
  310.         return 20;
  311.     }
  312.     
  313.     return 0;
  314.     }
  315.     
  316.     Wizard::CreateDialog();
  317.     y2milestone("====================[ Language Add-On Script ]====================");
  318.     integer ret = MainFunction ();
  319.     y2milestone("====================[ Language Add-On Script ]====================");
  320.     Wizard::CloseDialog();
  321.  
  322.     if (ret == 0) {
  323.     return `next;
  324.     } else {
  325.     return `abort;
  326.     }
  327. }
  328.