feat(i18n): added localization to first run window

This commit is contained in:
Observer KRypt0n_ 2023-02-25 16:06:43 +02:00
parent cbd91c42aa
commit 681ad01835
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
16 changed files with 225 additions and 120 deletions

15
assets/locales/common.ftl Normal file
View file

@ -0,0 +1,15 @@
-company-name-1 = mi
-company-name-2 = Ho
-company-name-3 = Yo
company-name = {-company-name-1}{-company-name-2}{-company-name-3}
-company-alter-name-1 = CO
-company-alter-name-2 = GNOS
-company-alter-name-3 = PHERE
company-alter-name = {-company-alter-name-1}{-company-alter-name-2}{-company-alter-name-3}
-game-name-1 = Gens
-game-name-2 = hin
-game-name-3 = Imp
-game-name-4 = act
game-name = {-game-name-1}{-game-name-2} {-game-name-3}{-game-name-4}

View file

@ -9,3 +9,11 @@ background-downloading-failed = Failed to download background picture
config-update-error = Failed to save config
wine-prefix-update-failed = Failed to update wine prefix
dxvk-install-failed = Failed to install DXVK
package-not-available = Package is not available: {$package}
wine-download-error = Failed to download wine
wine-unpack-errror = Failed to unpack wine
wine-install-failed = Failed to install wine
dxvk-download-error = Failed to download dxvk
dxvk-unpack-error = Failed to unpack dxvk
dxvk-apply-error = Failed to apply DXVK

View file

@ -0,0 +1,55 @@
welcome = Welcome
welcome-page-message =
Hi there! Welcome to the An Anime Game Launcher
We need to prepare some stuff and download default components before you could run the game
tos-violation-warning = ToS violation warning
tos-violation-warning-message =
This launcher is an unofficial tool, in no way related to {company-name} nor {company-alter-name}.
This tool is designed to facilitate playing {game-name} on Linux, and was built with the sole purpose of installing and running the game with less hassle.
It does so by using existing components and making the experience simple for the user.
However, some components used here likely break the {company-name} Terms of Service for {game-name}.
If you are using this launcher, your player account could become identified as TOS-non-compliant by {company-name}/{company-alter-name}.
If this happens, as your account would be disobeying TOS, {company-name}/{company-alter-name} are free to do what they want. Including banning.
If you understand the risk of trying to play the game in an unofficial capacity, press OK and let's go researching the world of Teyvat!
dependencies = Dependencies
missing-dependencies-title = You're missing some dependencies!
missing-dependencies-message = You must install some packages to your system before continue installation process
default-paths = Default paths
choose-default-paths = Choose default paths
launcher-folder = Launcher folder
show-all-folders = I know what I'm doing
show-all-folders-subtitle = Show additional path selection settings. Do as I say...
runners-folder = Runners folder
dxvks-folder = DXVKs folder
wine-prefix-folder = Wine prefix folder
game-installation-folder = Game installation folder
patch-folder = Patch folder
temp-folder = Temp folder
select-voice-packages = Select voice packages
download-components = Download components
download-dxvk = Download DXVK
apply-dxvk = Apply DXVK
finish = Finish
finish-title = Everything's done!
finish-message = All the basic components were downloaded. Now you can restart the launcher and download the game. Welcome to our club!

View file

@ -2,8 +2,13 @@ custom = Custom
none = None
default = Default
details = Details
close = Close
save = Save
continue = Continue
exit = Exit
check = Check
restart = Restart
downloading-background-picture = Downloading background picture

View file

@ -9,3 +9,11 @@ background-downloading-failed = Не удалось загрузить фоно
config-update-error = Ошибка сохранения настроек
wine-prefix-update-failed = Ошибка обновления префикса Wine
dxvk-install-failed = Ошибка установки DXVK
package-not-available = Пакет недоступен: {$package}
wine-download-error = Ошибка скачивания Wine
wine-unpack-errror = Ошибка распаковки Wine
wine-install-failed = Ошибка установки Wine
dxvk-download-error = Ошибка скачивания DXVK
dxvk-unpack-error = Ошибка распаковки DXVK
dxvk-apply-error = Не удалось применить DXVK

View file

@ -0,0 +1,57 @@
welcome = Добро пожаловать
welcome-page-message =
Приветствую! Добро пожаловать в An Anime Game Launcher
Нам необходимо подготовить пару вещей и установить стандартные компоненты перед тем, как ты сможешь запустить игру
tos-violation-warning = Нарушение пользовательского соглашения
tos-violation-warning-message =
Этот лаунчер является неофициальным и ни в коем случае не относится к {company-name} или {company-alter-name}.
Он был разработан с целью предоставления возможности игры в {game-name} на Linux.
Его главная цель - помочь установить и запустить игру с меньшими хлопотами.
Это достигается за счет использования существующих компонентов и упрощения работы пользователя.
Однако, некоторые компоненты, используемые здесь, вероятно нарушают пользовательское соглашение {game-name}, принадлежащей {company-name}.
Если вы используете данный лаунчер - ваш игровой аккаунт может быть признан как нарушающий пользовательское соглашение {company-name}/{company-alter-name}.
Если это произойдёт - поскольку ваша учетная запись будет нарушать правила, {company-name}/{company-alter-name} будут свободы делать то, что захотят, включая блокировку вашего аккаунта.
Если вы осознаёте риск использования неофициальных средств игры - нажмите "Продолжить" и отправляйтесь исследовать мир Тейвата!
dependencies = Зависимости
missing-dependencies-title = У вас не установлены некоторые компоненты!
missing-dependencies-message = Вы должны установить некоторые системные пакеты чтобы продолжить процесс установки
default-paths = Пути по умолчанию
choose-default-paths = Выбрать пути по умолчанию
launcher-folder = Папка лаунчера
show-all-folders = Я знаю что я делаю
show-all-folders-subtitle = Отобразить дополнительные опции выбора путей
runners-folder = Папка версий Wine
dxvks-folder = Папка версий DXVK
wine-prefix-folder = Папка префикса Wine
game-installation-folder = Путь установки игры
patch-folder = Папка скачивания патча
temp-folder = Временная папка
select-voice-packages = Выбрать языковые пакеты
download-components = Скачать компоненты
download-dxvk = Скачать DXVK
apply-dxvk = Применить DXVK
finish = Завершение
finish-title = Работа завершена!
finish-message = Все базовые компоненты были установлены. Теперь вы можете перезапустить лаунчер и установить игру. Добро пожаловать в клуб!

View file

@ -2,8 +2,13 @@ custom = Свое значение
none = Нет
default = По умолчанию
details = Подробнее
close = Закрыть
save = Сохранить
continue = Продолжить
exit = Выйти
check = Проверить
restart = Перезапустить
downloading-background-picture = Загрузка фонового изображения

View file

@ -4,6 +4,7 @@ use unic_langid::{langid, LanguageIdentifier};
fluent_templates::static_loader! {
static LOCALES = {
locales: "./assets/locales",
core_locales: "./assets/locales/common.ftl",
fallback_language: "en"
};
}

View file

@ -57,7 +57,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
set_vexpand: true,
gtk::Label {
set_label: "Choose default paths",
set_label: &tr("choose-default-paths"),
add_css_class: "title-1"
}
},
@ -67,7 +67,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
set_vexpand: true,
adw::ActionRow {
set_title: "Launcher folder",
set_title: &tr("launcher-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -83,8 +83,8 @@ impl SimpleAsyncComponent for DefaultPathsApp {
set_vexpand: true,
adw::ActionRow {
set_title: "I know what I'm doing",
set_subtitle: "Show additional path selection settings. Do as I say...",
set_title: &tr("show-all-folders"),
set_subtitle: &tr("show-all-folders-subtitle"),
add_suffix = &gtk::Switch {
set_valign: gtk::Align::Center,
@ -102,7 +102,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
set_visible: model.show_additional,
adw::ActionRow {
set_title: "Runners folder",
set_title: &tr("runners-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -113,7 +113,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
},
adw::ActionRow {
set_title: "DXVKs folder",
set_title: &tr("dxvks-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -124,7 +124,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
},
adw::ActionRow {
set_title: "Wine prefix folder",
set_title: &tr("wine-prefix-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -135,7 +135,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
},
adw::ActionRow {
set_title: "Game installation folder",
set_title: &tr("game-installation-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -146,7 +146,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
},
adw::ActionRow {
set_title: "Patch folder",
set_title: &tr("patch-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -157,7 +157,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
},
adw::ActionRow {
set_title: "Temp folder",
set_title: &tr("temp-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
@ -178,14 +178,14 @@ impl SimpleAsyncComponent for DefaultPathsApp {
set_spacing: 8,
gtk::Button {
set_label: "Continue",
set_label: &tr("continue"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => DefaultPathsAppMsg::Continue
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => DefaultPathsAppMsg::Exit

View file

@ -7,6 +7,7 @@ use anime_launcher_sdk::is_available;
use std::process::{Command, Stdio};
use crate::i18n::*;
use super::main::FirstRunAppMsg;
pub struct DependenciesApp {
@ -36,12 +37,12 @@ impl SimpleAsyncComponent for DependenciesApp {
set_vexpand: true,
gtk::Label {
set_label: "You're missing some dependencies!",
set_label: &tr("missing-dependencies-title"),
add_css_class: "title-1"
},
gtk::Label {
set_label: "You must install some packages to your system before continue installation process",
set_label: &tr("missing-dependencies-message"),
set_justify: gtk::Justification::Center,
set_wrap: true,
@ -120,14 +121,14 @@ impl SimpleAsyncComponent for DependenciesApp {
set_spacing: 8,
gtk::Button {
set_label: "Check",
set_label: &tr("check"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => DependenciesAppMsg::Continue
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => DependenciesAppMsg::Exit
@ -149,13 +150,13 @@ impl SimpleAsyncComponent for DependenciesApp {
};
// Decide which packaging format used in system
match Command::new("pacman").stdout(Stdio::null()).spawn() {
match Command::new("pacman").stdout(Stdio::null()).stderr(Stdio::null()).spawn() {
Ok(_) => model.show_arch = true,
Err(_) => match Command::new("apt").stdout(Stdio::null()).spawn() {
Err(_) => match Command::new("apt").stdout(Stdio::null()).stderr(Stdio::null()).spawn() {
Ok(_) => model.show_debian = true,
Err(_) => match Command::new("dnf").stdout(Stdio::null()).spawn() {
Err(_) => match Command::new("dnf").stdout(Stdio::null()).stderr(Stdio::null()).spawn() {
Ok(_) => model.show_fedora = true,
Err(_) => {
@ -181,7 +182,7 @@ impl SimpleAsyncComponent for DependenciesApp {
for package in packages {
if !is_available(package) {
sender.output(Self::Output::Toast {
title: format!("Package is not available: {package}"),
title: tr_args("package-not-available", [("package", package.into())]),
description: None
});

View file

@ -84,7 +84,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
set_vexpand: true,
gtk::Label {
set_label: "Download components",
set_label: &tr("download-components"),
add_css_class: "title-1"
}
},
@ -98,7 +98,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
#[local_ref]
wine_combo -> adw::ComboRow {
set_title: "Wine version",
set_title: &tr("wine-version"),
#[watch]
set_model: Some(&gtk::StringList::new(model.wine_versions.iter()
@ -109,7 +109,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
#[local_ref]
dxvk_combo -> adw::ComboRow {
set_title: "DXVK version",
set_title: &tr("dxvk-version"),
#[watch]
set_model: Some(&gtk::StringList::new(model.dxvk_versions.iter()
@ -132,14 +132,14 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
set_spacing: 8,
gtk::Button {
set_label: "Download",
set_label: &tr("download"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => DownloadComponentsAppMsg::DownloadWine
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => DownloadComponentsAppMsg::Exit
@ -155,7 +155,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
set_visible: model.downloading,
adw::ActionRow {
set_title: "Download wine",
set_title: &tr("download-wine"),
#[watch]
set_icon_name: match model.downloading_wine {
@ -173,7 +173,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
},
adw::ActionRow {
set_title: "Create prefix",
set_title: &tr("create-prefix"),
#[watch]
set_icon_name: match model.creating_prefix {
@ -191,7 +191,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
},
adw::ActionRow {
set_title: "Download DXVK",
set_title: &tr("download-dxvk"),
#[watch]
set_icon_name: match model.downloading_dxvk {
@ -209,7 +209,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
},
adw::ActionRow {
set_title: "Apply DXVK",
set_title: &tr("apply-dxvk"),
#[watch]
set_icon_name: match model.applying_dxvk {
@ -317,7 +317,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to download wine: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to download wine"),
title: tr("wine-download-error"),
description: Some(err.to_string())
});
}
@ -326,7 +326,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to unpack wine: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to unpack wine"),
title: tr("wine-unpack-errror"),
description: Some(err.clone())
});
}
@ -358,7 +358,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to initialize wine installer: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to initialize wine installer"),
title: tr("wine-install-failed"),
description: Some(err.to_string())
});
}
@ -391,7 +391,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to create prefix: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to create prefix"),
title: tr("wine-prefix-update-failed"),
description: Some(err.to_string())
});
}
@ -410,8 +410,6 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
let progress_bar_input = self.progress_bar.sender().clone();
std::thread::spawn(move || {
tracing::info!("Installing wine");
// Install DXVK
tracing::info!("Installing DXVK");
@ -434,7 +432,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to download dxvk: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to download dxvk"),
title: tr("dxvk-download-error"),
description: Some(err.to_string())
});
}
@ -443,7 +441,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to unpack dxvk: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to unpack dxvk"),
title: tr("dxvk-unpack-error"),
description: Some(err.clone())
});
}
@ -464,7 +462,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to initialize dxvk installer: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to initialize dxvk installer"),
title: tr("dxvk-install-failed"),
description: Some(err.to_string())
});
}
@ -499,7 +497,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
tracing::error!("Failed to apply DXVK: {err}");
sender.output(Self::Output::Toast {
title: String::from("Failed to apply DXVK"),
title: tr("dxvk-apply-error"),
description: Some(err.to_string())
});
}

View file

@ -29,12 +29,12 @@ impl SimpleAsyncComponent for FinishApp {
set_vexpand: true,
gtk::Label {
set_label: "Everything's done!",
set_label: &tr("finish-title"),
add_css_class: "title-1"
},
gtk::Label {
set_label: "All the basic components were downloaded. Now you can restart the launcher and download the game. Welcome to our club!",
set_label: &tr("finish-message"),
set_justify: gtk::Justification::Center,
set_wrap: true,
@ -52,14 +52,14 @@ impl SimpleAsyncComponent for FinishApp {
set_spacing: 8,
gtk::Button {
set_label: "Restart",
set_label: &tr("restart"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => FinishAppMsg::Restart
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => FinishAppMsg::Exit

View file

@ -134,7 +134,7 @@ impl SimpleComponent for FirstRunApp {
toast_overlay,
carousel,
title: String::from("Welcome")
title: tr("welcome")
};
let toast_overlay = &model.toast_overlay;
@ -156,37 +156,37 @@ impl SimpleComponent for FirstRunApp {
match msg {
FirstRunAppMsg::ScrollToTosWarning => {
self.title = String::from("ToS Warning");
self.title = tr("tos-violation-warning");
self.carousel.scroll_to(self.tos_warning.widget(), true);
}
FirstRunAppMsg::ScrollToDependencies => {
self.title = String::from("Dependencies");
self.title = tr("dependencies");
self.carousel.scroll_to(self.dependencies.widget(), true);
}
FirstRunAppMsg::ScrollToDefaultPaths => {
self.title = String::from("Default paths");
self.title = tr("default-paths");
self.carousel.scroll_to(self.default_paths.widget(), true);
}
FirstRunAppMsg::ScrollToSelectVoiceovers => {
self.title = String::from("Select voiceovers");
self.title = tr("select-voice-packages");
self.carousel.scroll_to(self.select_voiceovers.widget(), true);
}
FirstRunAppMsg::ScrollToDownloadComponents => {
self.title = String::from("Download components");
self.title = tr("download-components");
self.carousel.scroll_to(self.download_components.widget(), true);
}
FirstRunAppMsg::ScrollToFinish => {
self.title = String::from("Finish");
self.title = tr("finish");
self.carousel.scroll_to(self.finish.widget(), true);
}

View file

@ -36,7 +36,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
set_vexpand: true,
gtk::Label {
set_label: "Select voice packages",
set_label: &tr("select-voice-packages"),
add_css_class: "title-1"
}
},
@ -46,7 +46,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
set_vexpand: true,
adw::ActionRow {
set_title: "English",
set_title: &tr("english"),
#[local_ref]
add_suffix = english -> gtk::Switch {
@ -56,7 +56,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
},
adw::ActionRow {
set_title: "Japanese",
set_title: &tr("japanese"),
#[local_ref]
add_suffix = japanese -> gtk::Switch {
@ -65,7 +65,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
},
adw::ActionRow {
set_title: "Korean",
set_title: &tr("korean"),
#[local_ref]
add_suffix = korean -> gtk::Switch {
@ -74,7 +74,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
},
adw::ActionRow {
set_title: "Chinese",
set_title: &tr("chinese"),
#[local_ref]
add_suffix = chinese -> gtk::Switch {
@ -93,14 +93,14 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
set_spacing: 8,
gtk::Button {
set_label: "Continue",
set_label: &tr("continue"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => SelectVoiceoversAppMsg::Continue
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => SelectVoiceoversAppMsg::Exit

View file

@ -5,6 +5,7 @@ use adw::prelude::*;
use anime_launcher_sdk::is_available;
use crate::i18n::*;
use super::main::FirstRunAppMsg;
pub struct TosWarningApp;
@ -30,66 +31,16 @@ impl SimpleAsyncComponent for TosWarningApp {
set_vexpand: true,
gtk::Label {
set_label: "ToS violation warning",
set_label: &tr("tos-violation-warning"),
add_css_class: "title-1"
},
gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_margin_top: 32,
set_spacing: 12,
set_hexpand: true,
// TODO: use some kind of multiline text field
gtk::Label {
set_label: "This launcher is an unofficial tool, in no way related to miHoYo nor COGNOSPHERE.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "This tool is designed to facilitate playing Genshin Impact on Linux, and was built with the sole purpose of installing and running the game with less hassle.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "It does so by using existing components and making the experience simple for the user.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "However, some components used here likely break the miHoYo Terms of Service for Genshin Impact.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "If you are using this launcher, your player account could become identified as TOS-non-compliant by miHoYo/COGNOSPHERE.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "If this happens, as your account would be disobeying TOS, miHoYo/COGNOSPHERE are free to do what they want. Including banning.",
set_wrap: true,
set_halign: gtk::Align::Center
},
gtk::Label {
set_label: "If you understand the risk of trying to play the game in an unofficial capacity, press OK and let's go researching the world of Teyvat!",
set_wrap: true,
set_halign: gtk::Align::Center
}
},
add = &adw::PreferencesGroup {
gtk::Label {
set_label: &tr("tos-violation-warning-message"),
set_wrap: true,
set_selectable: true
}
},
@ -103,14 +54,14 @@ impl SimpleAsyncComponent for TosWarningApp {
set_spacing: 8,
gtk::Button {
set_label: "Continue",
set_label: &tr("continue"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => TosWarningAppMsg::Continue
},
gtk::Button {
set_label: "Exit",
set_label: &tr("exit"),
add_css_class: "pill",
connect_clicked => TosWarningAppMsg::Exit

View file

@ -3,6 +3,7 @@ use relm4::component::*;
use adw::prelude::*;
use crate::i18n::*;
use super::main::FirstRunAppMsg;
pub struct WelcomeApp;
@ -38,7 +39,7 @@ impl SimpleAsyncComponent for WelcomeApp {
},
gtk::Label {
set_label: "Hi there! Welcome to the An Anime Game Launcher. We need to prepare some stuff and download default components before you could run the game",
set_label: &tr("welcome-page-message"),
set_justify: gtk::Justification::Center,
set_wrap: true,
@ -56,7 +57,7 @@ impl SimpleAsyncComponent for WelcomeApp {
set_spacing: 8,
gtk::Button {
set_label: "Continue",
set_label: &tr("continue"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => WelcomeAppMsg::Continue