ACC SHELL

Path : /usr/share/YaST2/clients/
File Upload :
Current File : //usr/share/YaST2/clients/select_language.ycp

/**
 * 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 60270 2010-01-07 14:09:34Z jsuchome $
 *
 */
{
    textdomain "country";

    import "Console";
    import "GetInstArgs";
    import "Keyboard";
    import "Label";
    import "Language";
    import "Mode";
    import "PackageSlideShow";
    import "Popup";
    import "ProductFeatures";
    import "Report";
    import "SlideShow";
    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;
    };

    /**
     * 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 (preselected != "en_US" && set_default)
    {
	if (ProductFeatures::GetBooleanFeature ("globals", "skip_language_dialog"))
	{
	    y2milestone("Skipping language dialog, Language changed to %1",preselected);
	    Language::CheckLanguagesSupport (preselected);
	    Language::selection_skipped	= true;
	    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 show_expert = true;

   /* ----------------------------------------------------------------------
    * Build dialog
    * ----------------------------------------------------------------------*/
    // heading text
    string heading_text = _("Languages");

    if (set_default && !Mode::repair ())
    {
	// heading text
	heading_text = _("Language");
    }
    if (Mode::repair ())
    {
	// heading text
	heading_text = _("Welcome to System Repair");
    }

    if (set_default)
    {
	show_expert	= false;
	more_languages	= false;
    }

    term languagesel = `Empty ();
    if (Stage::initial ()) // this is actually not reached now...
	languagesel	= `SelectionBox (`id(`language), `opt(`notify), "",
	    Language::GetLanguageItems (`first_screen));

    if (Stage::firstboot ())
	languagesel = `SelectionBox (`id(`language), `opt(`notify), "",
	    Language::GetLanguageItems (`primary));

    term contents = `VBox (`VSpacing (), `HBox (
	`HWeight (1, `HSpacing ()),
	`HWeight (3, languagesel),
	`HWeight (1, `HSpacing ())
   ), `VSpacing ());

    term expert = `HStretch();
    if (show_expert)
    {
	expert = `VBox (
	    `Label (""),
	    // button label
	    `PushButton (`id(`expert), _("&Details"))
	);
    }

    list<term> primary_items	= [];
    list<term> secondary_items	= [];

    // if checkboxes for adapting keyboard and timezone should be shown
    boolean adapt_term = more_languages && !Mode::config ();
    if (more_languages)
    {
	term languages_term = `MultiSelectionBox (`id(`languages),
	    // multiselection box label
	    _("&Secondary Languages")
	);
	primary_items	= Language::GetLanguageItems (`primary);
	secondary_items	= Language::GetLanguageItems (`secondary);

	term primary_term = `HBox (
	    `Left (
		`ComboBox (`id(`language), `opt (`notify),
		// combo box label
		_("Primary &Language"), primary_items)
	    ),
	    `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");

	if (adapt_term)
	{
	    // help text for 'adapt keyboard checkbox'
	    help_text	= help_text + _("<p>
Check <b>Adapt Keyboard Layout</b> to change the keyboard layout to the primary language.
Check <b>Adapt Time Zone</b> to change the current time zone according to the primary language. If the keyboard layout or time zone is already adapted to the default language setting, the respective option is disabled.
</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");

    if (more_languages)
    {
	UI::ChangeWidget( `language, `Items, primary_items );
	UI::ChangeWidget( `languages, `Items, secondary_items );
	if (!Stage::initial () && !Stage::firstboot ())
	{
	    UI::ChangeWidget( `language, `IconPath, "/usr/share/locale/l10n/" );
	    UI::ChangeWidget( `languages, `IconPath, "/usr/share/locale/l10n/");
	}
    }

    // No .desktop files in inst-sys - use icon explicitly
    if (Stage::initial () || Stage::firstboot ())
	Wizard::SetTitleIcon ("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 = (set_default && !Mode::config ());
    // adapt timezone for language?
    boolean tmz_adapt = (set_default && !Mode::config ());


    repeat
    {
	ret = Wizard::UserInput();
	y2debug ("UserInput() returned %1", ret);

	if (ret == `ok)
	    ret = `next;

	if (ret == `abort && Popup::ConfirmAbort (`painless))
	{
	    Wizard::RestoreNextButton();
	    return `abort;
	}

	if (ret==`expert)
	{
	    ret	= LanguageExpertDialog();
	}

	if (ret == `help)
	{
	    Wizard::ShowHelp( help_text );
	}

	if (ret == `changed_locale)
	{
	    boolean primary_included	= false;
	    if (nil == find (term i, primary_items,``(i[0,0]:nil == language)))
	    {
		primary_items = add (primary_items,
		    `item (`id (language), language, true));
		UI::ChangeWidget (`id(`language), `Items, primary_items);
	    };
	    if (Mode::config ())
	    {
		Language::Set (language);
	    }
	}

	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::CheckIncompleteTranslation(language))
	    {
		ret = `not_next;
		continue;
	    }
	    if (ret == `next && Stage::initial ())
	    {
		Language::CheckLanguagesSupport (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 (set_default)
		{
		    Timezone::ResetZonemap ();
		}

		// Set it in the Language module.
		//
		Language::Set (language);
		if (adapt_term)
		    update_adapt_term ();
	    }

	    if (Stage::initial () || Stage::firstboot ())
	    {
		if ((set_default && ret == `language || (!set_default && ret == `next)) &&
		    Language::SwitchToEnglishIfNeeded (true))
		{
		    y2debug ("UI switched to en_US");
		}
		else if (ret == `next || (set_default && ret == `language))
		{
		    Console::SelectFont (language);
		    // no yast translation for nn_NO, use nb_NO as a backup
		    if (language == "nn_NO")
		    {
			y2milestone ("Nynorsk not translated, using Bokmål");
			Language::WfmSetGivenLanguage ("nb_NO");
		    }
		    else
			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 (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 ();
		    if (tmz_adapt)
			Timezone::Save ();
		}
		y2milestone ("Language: '%1', system encoding '%2'", language,
		             WFM::GetEncoding());

		if (more_languages || Stage::firstboot ())
		{
		    list<string> selected_languages =
			Stage::firstboot () ? [ language ] : (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;
			}
			if (Stage::firstboot ())// install language packages now
			{
			    Language::PackagesCommit ();
			}
		    }
		}
	    }
	}
    }
    until (ret == `next || ret == `back);

    return (symbol) ret;
}

ACC SHELL 2018