|
|
@@ -5,6 +5,7 @@ use cursive::views::{
|
|
|
use cursive::{event, Cursive};
|
|
|
use utils::hash::Hashable as _;
|
|
|
|
|
|
+use crate::actions::NetworkError;
|
|
|
use crate::message::MessageSanitized;
|
|
|
use crate::{get_appdata, message, Appdata, MAX_MESSAGE_LENGTH, MAX_USERNAME_LENGTH};
|
|
|
|
|
|
@@ -20,11 +21,13 @@ pub const USERNAME_FIELD_ID: &str = "username_field_id";
|
|
|
pub const USERNAME_BUTTON_ID: &str = "username_button_id";
|
|
|
pub const REFRESH_BUTTON_ID: &str = "refresh_button_id";
|
|
|
pub const BLOCKED_WORDS_BUTTON_ID: &str = "blocked_words_view_id";
|
|
|
+pub const SERVER_SETTINGS_FIELD_ID: &str = "server_settings_field_id";
|
|
|
+pub const SERVER_SETTINGS_BUTTON_ID: &str = "server_settings_button_id";
|
|
|
|
|
|
pub const DIALOGUE_MIN_SIZE: (u16, u16) = (20, 5);
|
|
|
+pub const SERVER_SETTINGS_FIELD_SIZE: (usize, usize) = (60, 1);
|
|
|
pub const USER_PANEL_SIZE: usize = crate::MAX_USERNAME_LENGTH + 2;
|
|
|
|
|
|
-#[derive(Clone, Copy)]
|
|
|
pub enum Labels {
|
|
|
Ok,
|
|
|
Cancel,
|
|
|
@@ -44,9 +47,12 @@ pub enum Labels {
|
|
|
Username,
|
|
|
InvalidMessage,
|
|
|
FailedToSendMessage,
|
|
|
- FailedToLoadMessages,
|
|
|
+ FailedToLoadMessages(NetworkError),
|
|
|
RefreshButton,
|
|
|
BlockedWords,
|
|
|
+ ServerSettings,
|
|
|
+ ServerAddress,
|
|
|
+ ServerRefreshRate,
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
|
@@ -58,9 +64,11 @@ pub enum Language {
|
|
|
|
|
|
impl Labels {
|
|
|
// TODO: Double check the translations
|
|
|
- pub fn localize(&self, language: Language) -> String {
|
|
|
- let set = match self {
|
|
|
- Labels::Ok => ["Ok", "OK", "OK"],
|
|
|
+ pub fn localize<'a>(&self, language: Language) -> String {
|
|
|
+ let buf: [String; 3];
|
|
|
+
|
|
|
+ let set: [&str; 3] = match self {
|
|
|
+ Labels::Ok => ["OK", "OK", "OK"],
|
|
|
Labels::Cancel => ["Cancel", "Annuleren", "キャンセル"],
|
|
|
Labels::Close => ["Close", "Sluiten", "閉じる"],
|
|
|
Labels::Error => ["Error", "Fout", "エラー"],
|
|
|
@@ -87,28 +95,79 @@ impl Labels {
|
|
|
"メッセージの送信に失敗しました",
|
|
|
],
|
|
|
Labels::SetLanguage => ["Set language", "Stel taal in", "言語を設定する"],
|
|
|
- Labels::FailedToLoadMessages => [
|
|
|
- "Failed to load messages",
|
|
|
- "Berichten laden mislukt",
|
|
|
- "メッセージの読み込みに失敗しました",
|
|
|
- ],
|
|
|
+ Labels::FailedToLoadMessages(error) => {
|
|
|
+ let reason_buf: [String; 3];
|
|
|
+
|
|
|
+ match error {
|
|
|
+ NetworkError::ReqwestError(_) => {
|
|
|
+ reason_buf = [
|
|
|
+ "Connection error.".to_string(),
|
|
|
+ "Verbindingsfout.".to_string(),
|
|
|
+ "接続エラー。".to_string(),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ NetworkError::StatusCodeError(code) => {
|
|
|
+ reason_buf = [
|
|
|
+ format!("Status code: {code}"),
|
|
|
+ format!("Statuscode: {code}"),
|
|
|
+ format!("ステータスコード: {code}"),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ NetworkError::InvalidUrl => {
|
|
|
+ reason_buf = [
|
|
|
+ "Invalid URL.".to_string(),
|
|
|
+ "Ongeldig URL.".to_string(),
|
|
|
+ "無効なURL。".to_string(),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ buf = [
|
|
|
+ format!("Failed to load messages. {}", reason_buf[0]),
|
|
|
+ format!("Berichten laden mislukt. {}", reason_buf[1]),
|
|
|
+ format!("メッセージの読み込みに失敗しました。 {}", reason_buf[2]),
|
|
|
+ ];
|
|
|
+
|
|
|
+ [buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
|
|
|
+ }
|
|
|
Labels::RefreshButton => ["Refresh", "Vernieuwen", "更新する"],
|
|
|
- Labels::InvalidUsernameExplination => [
|
|
|
- r"Invalid username. Must match ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$",
|
|
|
- r"Ongeldige gebruikersnaam. Moet overeenkomen met ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$",
|
|
|
- r"無効なユーザー名。 ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$ に一致する必要があります",
|
|
|
- ],
|
|
|
- Labels::InvalidMessage => [
|
|
|
- "Invalid message. Must contain fewer than ${MAX_MESSAGE_LENGTH} characters",
|
|
|
- "Ongeldig bericht. Moet minder dan ${MAX_MESSAGE_LENGTH} tekens bevatten",
|
|
|
- "無効なメッセージ。 ${MAX_MESSAGE_LENGTH}文字未満である必要があります",
|
|
|
- ],
|
|
|
+ Labels::InvalidUsernameExplination => {
|
|
|
+ buf = [
|
|
|
+ r"Invalid username. Must match ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ r"Ongeldige gebruikersnaam. Moet overeenkomen met ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ r"無効なユーザー名。 ^[a-zA-Z0-9#_\-\.]{2,${MAX_USERNAME_LENGTH}}$ に一致する必要があります"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_USERNAME_LENGTH.to_string()),
|
|
|
+ ];
|
|
|
+
|
|
|
+ [buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
|
|
|
+ }
|
|
|
+ Labels::InvalidMessage => {
|
|
|
+ buf = [
|
|
|
+ "Invalid message. Must contain fewer than ${MAX_MESSAGE_LENGTH} characters"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_MESSAGE_LENGTH.to_string()),
|
|
|
+ "Ongeldig bericht. Moet minder dan ${MAX_MESSAGE_LENGTH} tekens bevatten"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_MESSAGE_LENGTH.to_string()),
|
|
|
+ "無効なメッセージ。 ${MAX_MESSAGE_LENGTH}文字未満である必要があります"
|
|
|
+ .replace("${MAX_MESSAGE_LENGTH}", &MAX_MESSAGE_LENGTH.to_string()),
|
|
|
+ ];
|
|
|
+
|
|
|
+ [buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
|
|
|
+ }
|
|
|
Labels::BlockedWords => [
|
|
|
"Blocked words",
|
|
|
"Geblokkeerde woorden",
|
|
|
"ブロックされた単語",
|
|
|
],
|
|
|
Labels::Submit => ["Submit", "Indienen", "提出する"],
|
|
|
+ Labels::ServerSettings => ["Server settings", "Serverinstellingen", "サーバー設定"],
|
|
|
+ Labels::ServerAddress => ["Server address", "Serveradres", "サーバーアドレス"],
|
|
|
+ Labels::ServerRefreshRate => [
|
|
|
+ "Update rate (seconds)",
|
|
|
+ "Updatefrequentie (seconden)",
|
|
|
+ "更新率 (秒)",
|
|
|
+ ],
|
|
|
};
|
|
|
|
|
|
let idx = match language {
|
|
|
@@ -117,9 +176,7 @@ impl Labels {
|
|
|
Language::Japanese => 2,
|
|
|
};
|
|
|
|
|
|
- set[idx]
|
|
|
- .replace("${MAX_MESSAGE_LENGTH}", &MAX_MESSAGE_LENGTH.to_string())
|
|
|
- .replace("${MAX_USERNAME_LENGTH}", &MAX_USERNAME_LENGTH.to_string())
|
|
|
+ set[idx].to_string()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -129,7 +186,7 @@ where
|
|
|
{
|
|
|
let language = get_appdata(siv).language;
|
|
|
|
|
|
- keybind_close_once(siv);
|
|
|
+ keybind_setup_close_once(siv);
|
|
|
|
|
|
siv.add_layer(
|
|
|
Dialog::text(text)
|
|
|
@@ -150,7 +207,7 @@ where
|
|
|
}
|
|
|
|
|
|
/// Sets up hotkey to close the most recent view
|
|
|
-pub fn keybind_close_once(siv: &mut Cursive) {
|
|
|
+pub fn keybind_setup_close_once(siv: &mut Cursive) {
|
|
|
siv.with_user_data(|appdata: &mut Appdata| {
|
|
|
appdata.quick_close_window_count += 1;
|
|
|
});
|
|
|
@@ -308,6 +365,11 @@ pub fn visual_update(siv: &mut Cursive) {
|
|
|
.set_title(Labels::Username.localize(language));
|
|
|
},
|
|
|
);
|
|
|
+
|
|
|
+ siv.call_on_name(SERVER_SETTINGS_BUTTON_ID, |view: &mut NamedView<Button>| {
|
|
|
+ view.get_mut()
|
|
|
+ .set_label(Labels::ServerSettings.localize(language));
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
pub fn change_language(siv: &mut Cursive, language: Language) {
|