diff --git a/junowen/locales/de.toml b/junowen/locales/de.toml new file mode 100644 index 0000000..cf81cd8 --- /dev/null +++ b/junowen/locales/de.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Tritt gegen Nutzer mit übereinstimmendem Raumnamen an. +Während du auf eine Verbindung wartest, +kannst du andere Funktionen wie Mensch gegen CPU nutzen. +Verwende diese Option für das Standarderlebnis.''' +reserved_room = ''' +Tritt gegen Nutzer mit übereinstimmendem Raumnamen an. +Die Zuschauerfunktion ist verfügbar.''' +tcp_signaling = ''' +Verbinde dich direkt über TCP, ohne einen Verbindungsserver zu nutzen. +Eine Seite wartet auf dem konfigurierten Port, +die andere verbindet sich mit dieser Adresse.''' +pure_p2p = ''' +Verbinde dich über einen externen Chat, +ohne einen Verbindungsserver zu nutzen.''' +shared_room_waiting = ''' +Bestätigen-Taste: Match abbrechen +Abbrechen-Taste: Zum Titelbildschirm zurückkehren, + während auf ein Match gewartet wird''' +tcp_signaling_waiting = ''' +Bestätigen-Taste: Match abbrechen +Abbrechen-Taste: Zum Titelbildschirm zurückkehren, + während auf ein Match gewartet wird''' +tcp_signaling_offline_mode = ''' +Wird dies aktiviert, wird die Verbindung zum STUN-Server übersprungen, +was die Verbindung in Offline-Umgebungen +beschleunigen kann.''' + +[pure_p2p] +copied_to_clipboard = 'In die Zwischenablage kopiert.' +guest_opponent_code = 'Signalisierungscode des Hosts:' +guest_share = 'Teile deinen Signalisierungscode mit dem Host.' +guest_waiting = 'Warte auf Verbindung des Hosts...' +host_opponent_code = 'Signalisierungscode des Gasts:' +host_share = 'Teile deinen Signalisierungscode mit dem Gast.' +host_waiting = 'Warte auf Verbindung des Gasts...' +preparing = 'Wird vorbereitet...' +spectator_opponent_code = 'Signalisierungscode des Spielers:' +spectator_share = 'Teile deinen Signalisierungscode mit dem Spieler.' +spectator_waiting = 'Warte auf Verbindung des Spielers...' +your_code = 'Dein Signalisierungscode:' +your_code_already_created = 'Dein Signalisierungscode wurde bereits erstellt:' diff --git a/junowen/locales/es-ES.toml b/junowen/locales/es-ES.toml new file mode 100644 index 0000000..dd56c49 --- /dev/null +++ b/junowen/locales/es-ES.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Compite contra usuarios con el mismo nombre de sala. +Mientras esperas una conexión, +puedes usar otras funciones como Humano contra CPU. +Usa esta opción para la experiencia estándar.''' +reserved_room = ''' +Compite contra usuarios con el mismo nombre de sala. +La función de espectador está disponible.''' +tcp_signaling = ''' +Conéctate directamente por TCP, sin usar un servidor de conexión. +Un lado espera en el puerto configurado +y el otro se conecta a esa dirección.''' +pure_p2p = ''' +Conéctate mediante un chat externo, +sin usar un servidor de conexión.''' +shared_room_waiting = ''' +Botón de confirmar: Cancelar la partida +Botón de cancelar: Volver a la pantalla de título + mientras se espera una partida''' +tcp_signaling_waiting = ''' +Botón de confirmar: Cancelar la partida +Botón de cancelar: Volver a la pantalla de título + mientras se espera una partida''' +tcp_signaling_offline_mode = ''' +Activar esto omite la conexión al servidor STUN, +lo que puede acelerar la conexión +en entornos sin conexión a internet.''' + +[pure_p2p] +copied_to_clipboard = 'Se copió al portapapeles.' +guest_opponent_code = 'Código de señalización del anfitrión:' +guest_share = 'Comparte tu código de señalización con el anfitrión.' +guest_waiting = 'Esperando a que se conecte el anfitrión...' +host_opponent_code = 'Código de señalización del invitado:' +host_share = 'Comparte tu código de señalización con el invitado.' +host_waiting = 'Esperando a que se conecte el invitado...' +preparing = 'Preparando...' +spectator_opponent_code = 'Código de señalización del jugador:' +spectator_share = 'Comparte tu código de señalización con el jugador.' +spectator_waiting = 'Esperando a que se conecte el jugador...' +your_code = 'Tu código de señalización:' +your_code_already_created = 'Tu código de señalización ya está creado:' diff --git a/junowen/locales/es.toml b/junowen/locales/es.toml new file mode 100644 index 0000000..1297fbc --- /dev/null +++ b/junowen/locales/es.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Compite contra usuarios con el mismo nombre de sala. +Mientras esperas una conexión, +puedes usar otras funciones como Humano contra CPU. +Usa esta opción para la experiencia estándar.''' +reserved_room = ''' +Compite contra usuarios con el mismo nombre de sala. +La función de espectador está disponible.''' +tcp_signaling = ''' +Conéctate directamente por TCP, sin usar un servidor de conexión. +Un lado espera en el puerto configurado +y el otro se conecta a esa dirección.''' +pure_p2p = ''' +Conéctate a través de un chat externo, +sin usar un servidor de conexión.''' +shared_room_waiting = ''' +Botón de confirmar: Cancelar la partida +Botón de cancelar: Volver a la pantalla de título + mientras se espera una partida''' +tcp_signaling_waiting = ''' +Botón de confirmar: Cancelar la partida +Botón de cancelar: Volver a la pantalla de título + mientras se espera una partida''' +tcp_signaling_offline_mode = ''' +Al activar esto se omite la conexión al servidor STUN, +lo que puede hacer más rápida la conexión +en entornos sin internet.''' + +[pure_p2p] +copied_to_clipboard = 'Se copió al portapapeles.' +guest_opponent_code = 'Código de señalización del anfitrión:' +guest_share = 'Comparte tu código de señalización con el anfitrión.' +guest_waiting = 'Esperando a que se conecte el anfitrión...' +host_opponent_code = 'Código de señalización del invitado:' +host_share = 'Comparte tu código de señalización con el invitado.' +host_waiting = 'Esperando a que se conecte el invitado...' +preparing = 'Preparando...' +spectator_opponent_code = 'Código de señalización del jugador:' +spectator_share = 'Comparte tu código de señalización con el jugador.' +spectator_waiting = 'Esperando a que se conecte el jugador...' +your_code = 'Tu código de señalización:' +your_code_already_created = 'Tu código de señalización ya fue creado:' diff --git a/junowen/locales/fr.toml b/junowen/locales/fr.toml new file mode 100644 index 0000000..9478c12 --- /dev/null +++ b/junowen/locales/fr.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Affrontez les utilisateurs ayant un nom de salle identique. +En attendant une connexion, +vous pouvez utiliser d'autres fonctions comme Humain contre CPU. +Utilisez cette option pour l'expérience standard.''' +reserved_room = ''' +Affrontez les utilisateurs ayant un nom de salle identique. +La fonction spectateur est disponible.''' +tcp_signaling = ''' +Connectez-vous directement en TCP, sans passer par un serveur de connexion. +Un côté attend sur le port configuré, +et l'autre se connecte à cette adresse.''' +pure_p2p = ''' +Connectez-vous via un chat externe, +sans passer par un serveur de connexion.''' +shared_room_waiting = ''' +Bouton de confirmation : Annuler le match +Bouton d'annulation : Retourner à l'écran titre + en attendant un match''' +tcp_signaling_waiting = ''' +Bouton de confirmation : Annuler le match +Bouton d'annulation : Retourner à l'écran titre + en attendant un match''' +tcp_signaling_offline_mode = ''' +Activer cette option ignore la connexion au serveur STUN, +ce qui peut accélérer la connexion +dans les environnements hors ligne.''' + +[pure_p2p] +copied_to_clipboard = 'Copié dans le presse-papiers.' +guest_opponent_code = "Code de signalisation de l'hôte :" +guest_share = "Partagez votre code de signalisation avec l'hôte." +guest_waiting = "En attente de connexion de l'hôte..." +host_opponent_code = "Code de signalisation de l'invité :" +host_share = "Partagez votre code de signalisation avec l'invité." +host_waiting = "En attente de connexion de l'invité..." +preparing = 'Préparation...' +spectator_opponent_code = 'Code de signalisation du joueur :' +spectator_share = 'Partagez votre code de signalisation avec le joueur.' +spectator_waiting = 'En attente de connexion du joueur...' +your_code = 'Votre code de signalisation :' +your_code_already_created = 'Votre code de signalisation est déjà créé :' diff --git a/junowen/locales/it.toml b/junowen/locales/it.toml new file mode 100644 index 0000000..e978b49 --- /dev/null +++ b/junowen/locales/it.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Sfida gli utenti con lo stesso nome di stanza. +Mentre attendi una connessione, +puoi usare altre funzioni come Umano contro CPU. +Usa questa opzione per l'esperienza standard.''' +reserved_room = ''' +Sfida gli utenti con lo stesso nome di stanza. +La funzione spettatore è disponibile.''' +tcp_signaling = ''' +Connettiti direttamente via TCP, senza usare un server di connessione. +Un lato attende sulla porta configurata, +e l'altro si connette a quell'indirizzo.''' +pure_p2p = ''' +Connettiti tramite chat esterna, +senza usare un server di connessione.''' +shared_room_waiting = ''' +Pulsante di conferma: Annulla la partita +Pulsante di annullamento: Torna alla schermata del titolo + in attesa di una partita''' +tcp_signaling_waiting = ''' +Pulsante di conferma: Annulla la partita +Pulsante di annullamento: Torna alla schermata del titolo + in attesa di una partita''' +tcp_signaling_offline_mode = ''' +Attivando questa opzione si salta la connessione al server STUN, +il che può rendere la connessione più veloce +in ambienti offline.''' + +[pure_p2p] +copied_to_clipboard = 'Copiato negli appunti.' +guest_opponent_code = "Codice di segnalazione dell'host:" +guest_share = "Condividi il tuo codice di segnalazione con l'host." +guest_waiting = "In attesa che l'host si connetta..." +host_opponent_code = "Codice di segnalazione dell'ospite:" +host_share = "Condividi il tuo codice di segnalazione con l'ospite." +host_waiting = "In attesa che l'ospite si connetta..." +preparing = 'Preparazione...' +spectator_opponent_code = 'Codice di segnalazione del giocatore:' +spectator_share = 'Condividi il tuo codice di segnalazione con il giocatore.' +spectator_waiting = 'In attesa che il giocatore si connetta...' +your_code = 'Il tuo codice di segnalazione:' +your_code_already_created = 'Il tuo codice di segnalazione è già stato creato:' diff --git a/junowen/locales/ko.toml b/junowen/locales/ko.toml new file mode 100644 index 0000000..dc81768 --- /dev/null +++ b/junowen/locales/ko.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +방 이름이 일치하는 사용자와 대전합니다. +연결을 기다리는 동안 +CPU전 등 다른 기능도 사용할 수 있습니다. +평소에는 이 옵션을 사용해 주세요.''' +reserved_room = ''' +방 이름이 일치하는 사용자와 대전합니다. +관전 기능을 사용할 수 있습니다.''' +tcp_signaling = ''' +연결 서버를 사용하지 않고 TCP로 직접 연결합니다. +한쪽이 설정한 포트에서 대기하고, +다른 한쪽이 그 주소로 접속합니다.''' +pure_p2p = ''' +연결 서버를 사용하지 않고, +외부 채팅 등을 통해 상대와 연결합니다.''' +shared_room_waiting = ''' +확인 버튼: 대전 취소 +취소 버튼: 대전 대기 중에 + 타이틀 화면으로 돌아가기''' +tcp_signaling_waiting = ''' +확인 버튼: 대전 취소 +취소 버튼: 대전 대기 중에 + 타이틀 화면으로 돌아가기''' +tcp_signaling_offline_mode = ''' +ON으로 하면 STUN 서버 연결을 생략합니다. +오프라인 환경에서 +연결 속도가 빨라질 수 있습니다.''' + +[pure_p2p] +copied_to_clipboard = '클립보드에 복사했습니다.' +guest_opponent_code = '호스트의 시그널링 코드:' +guest_share = '호스트에게 시그널링 코드를 전달해 주세요.' +guest_waiting = '호스트의 연결을 기다리는 중...' +host_opponent_code = '게스트의 시그널링 코드:' +host_share = '게스트에게 시그널링 코드를 전달해 주세요.' +host_waiting = '게스트의 연결을 기다리는 중...' +preparing = '준비 중...' +spectator_opponent_code = '플레이어의 시그널링 코드:' +spectator_share = '플레이어에게 시그널링 코드를 전달해 주세요.' +spectator_waiting = '플레이어의 연결을 기다리는 중...' +your_code = '내 시그널링 코드:' +your_code_already_created = '시그널링 코드가 이미 생성되었습니다:' diff --git a/junowen/locales/pt-BR.toml b/junowen/locales/pt-BR.toml new file mode 100644 index 0000000..5c14767 --- /dev/null +++ b/junowen/locales/pt-BR.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Enfrente usuários com o mesmo nome de sala. +Enquanto espera por uma conexão, +você pode usar outras funções como Humano contra CPU. +Use esta opção para a experiência padrão.''' +reserved_room = ''' +Enfrente usuários com o mesmo nome de sala. +A função de espectador está disponível.''' +tcp_signaling = ''' +Conecte-se diretamente via TCP, sem usar um servidor de conexão. +Um lado aguarda na porta configurada, +e o outro se conecta a esse endereço.''' +pure_p2p = ''' +Conecte-se por meio de um chat externo, +sem usar um servidor de conexão.''' +shared_room_waiting = ''' +Botão de confirmar: Cancelar a partida +Botão de cancelar: Voltar à tela de título + enquanto aguarda uma partida''' +tcp_signaling_waiting = ''' +Botão de confirmar: Cancelar a partida +Botão de cancelar: Voltar à tela de título + enquanto aguarda uma partida''' +tcp_signaling_offline_mode = ''' +Ativar esta opção ignora a conexão com o servidor STUN, +o que pode tornar a conexão mais rápida +em ambientes offline.''' + +[pure_p2p] +copied_to_clipboard = 'Copiado para a área de transferência.' +guest_opponent_code = 'Código de sinalização do anfitrião:' +guest_share = 'Compartilhe seu código de sinalização com o anfitrião.' +guest_waiting = 'Aguardando a conexão do anfitrião...' +host_opponent_code = 'Código de sinalização do convidado:' +host_share = 'Compartilhe seu código de sinalização com o convidado.' +host_waiting = 'Aguardando a conexão do convidado...' +preparing = 'Preparando...' +spectator_opponent_code = 'Código de sinalização do jogador:' +spectator_share = 'Compartilhe seu código de sinalização com o jogador.' +spectator_waiting = 'Aguardando a conexão do jogador...' +your_code = 'Seu código de sinalização:' +your_code_already_created = 'Seu código de sinalização já foi criado:' diff --git a/junowen/locales/ru.toml b/junowen/locales/ru.toml new file mode 100644 index 0000000..4fb8f6c --- /dev/null +++ b/junowen/locales/ru.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +Сражайтесь с пользователями, у которых совпадает название комнаты. +Пока вы ждёте подключения, +вы можете использовать другие функции, например «Человек против CPU». +Используйте этот вариант для стандартного игрового процесса.''' +reserved_room = ''' +Сражайтесь с пользователями, у которых совпадает название комнаты. +Доступна функция наблюдения.''' +tcp_signaling = ''' +Подключайтесь напрямую по TCP, не используя сервер подключения. +Одна сторона ожидает на указанном порту, +а другая подключается по этому адресу.''' +pure_p2p = ''' +Подключайтесь через внешний чат, +не используя сервер подключения.''' +shared_room_waiting = ''' +Кнопка подтверждения: отменить матч +Кнопка отмены: вернуться на титульный экран, + ожидая начала матча''' +tcp_signaling_waiting = ''' +Кнопка подтверждения: отменить матч +Кнопка отмены: вернуться на титульный экран, + ожидая начала матча''' +tcp_signaling_offline_mode = ''' +Если включить эту опцию, подключение к STUN-серверу пропускается, +что может ускорить подключение +в оффлайн-среде.''' + +[pure_p2p] +copied_to_clipboard = 'Скопировано в буфер обмена.' +guest_opponent_code = 'Код сигнализации хоста:' +guest_share = 'Поделитесь своим кодом сигнализации с хостом.' +guest_waiting = 'Ожидание подключения хоста...' +host_opponent_code = 'Код сигнализации гостя:' +host_share = 'Поделитесь своим кодом сигнализации с гостем.' +host_waiting = 'Ожидание подключения гостя...' +preparing = 'Подготовка...' +spectator_opponent_code = 'Код сигнализации игрока:' +spectator_share = 'Поделитесь своим кодом сигнализации с игроком.' +spectator_waiting = 'Ожидание подключения игрока...' +your_code = 'Ваш код сигнализации:' +your_code_already_created = 'Ваш код сигнализации уже создан:' diff --git a/junowen/locales/zh-CN.toml b/junowen/locales/zh-CN.toml new file mode 100644 index 0000000..8695585 --- /dev/null +++ b/junowen/locales/zh-CN.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +与房间名称一致的用户对战。 +在等待连接期间, +您也可以使用人机对战等其他功能。 +通常情况下请使用此选项。''' +reserved_room = ''' +与房间名称一致的用户对战。 +可以使用观战功能。''' +tcp_signaling = ''' +不经过连接服务器,直接通过 TCP 连接。 +一方在设置好的端口上等待, +另一方连接到该地址。''' +pure_p2p = ''' +不经过连接服务器, +通过外部聊天工具与对手连接。''' +shared_room_waiting = ''' +确定按钮:取消对战 +取消按钮:在等待对战期间 + 返回标题画面''' +tcp_signaling_waiting = ''' +确定按钮:取消对战 +取消按钮:在等待对战期间 + 返回标题画面''' +tcp_signaling_offline_mode = ''' +开启后将跳过与 STUN 服务器的连接, +在离线环境下 +可以加快连接速度。''' + +[pure_p2p] +copied_to_clipboard = '已复制到剪贴板。' +guest_opponent_code = '主持人的信令代码:' +guest_share = '请将您的信令代码发送给主持人。' +guest_waiting = '正在等待主持人连接…' +host_opponent_code = '来宾的信令代码:' +host_share = '请将您的信令代码发送给来宾。' +host_waiting = '正在等待来宾连接…' +preparing = '准备中…' +spectator_opponent_code = '玩家的信令代码:' +spectator_share = '请将您的信令代码发送给玩家。' +spectator_waiting = '正在等待玩家连接…' +your_code = '您的信令代码:' +your_code_already_created = '您的信令代码已创建:' diff --git a/junowen/locales/zh-TW.toml b/junowen/locales/zh-TW.toml new file mode 100644 index 0000000..fa31373 --- /dev/null +++ b/junowen/locales/zh-TW.toml @@ -0,0 +1,43 @@ +[lobby] +shared_room = ''' +與房間名稱一致的使用者對戰。 +在等待連線期間, +您也可以使用人機對戰等其他功能。 +一般情況下請使用此選項。''' +reserved_room = ''' +與房間名稱一致的使用者對戰。 +可以使用觀戰功能。''' +tcp_signaling = ''' +不透過連線伺服器,直接以 TCP 連線。 +一方在設定好的連接埠等待, +另一方連線至該位址。''' +pure_p2p = ''' +不透過連線伺服器, +透過外部聊天工具與對手連線。''' +shared_room_waiting = ''' +確定鍵:取消對戰 +取消鍵:在等待對戰期間 + 返回標題畫面''' +tcp_signaling_waiting = ''' +確定鍵:取消對戰 +取消鍵:在等待對戰期間 + 返回標題畫面''' +tcp_signaling_offline_mode = ''' +開啟後將略過與 STUN 伺服器的連線, +在離線環境下 +可加快連線速度。''' + +[pure_p2p] +copied_to_clipboard = '已複製到剪貼簿。' +guest_opponent_code = '主持人的信令碼:' +guest_share = '請將您的信令碼傳送給主持人。' +guest_waiting = '正在等待主持人連線…' +host_opponent_code = '來賓的信令碼:' +host_share = '請將您的信令碼傳送給來賓。' +host_waiting = '正在等待來賓連線…' +preparing = '準備中…' +spectator_opponent_code = '玩家的信令碼:' +spectator_share = '請將您的信令碼傳送給玩家。' +spectator_waiting = '正在等待玩家連線…' +your_code = '您的信令碼:' +your_code_already_created = '您的信令碼已建立:' diff --git a/junowen/src/lib.rs b/junowen/src/lib.rs index 2e30804..996bc61 100644 --- a/junowen/src/lib.rs +++ b/junowen/src/lib.rs @@ -40,6 +40,18 @@ static mut MODULE: HMODULE = HMODULE(null_mut()); static mut TH19: OnceCell = OnceCell::new(); static mut JUNOWEN: OnceCell = OnceCell::new(); +/// 中国語ロケールを locales/ に存在する zh-CN (簡体字) / zh-TW (繁体字) のいずれかへ丸める。 +/// 香港・マカオは繁体字圏のため zh-TW を割り当て、それ以外 (シンガポール等) は zh-CN を割り当てる。 +fn normalize_locale(locale: &str) -> String { + if !locale.eq_ignore_ascii_case("zh") && !locale.to_ascii_lowercase().starts_with("zh-") { + return locale.to_owned(); + } + match locale.to_ascii_lowercase().as_str() { + "zh-tw" | "zh-hk" | "zh-mo" => "zh-TW".to_owned(), + _ => "zh-CN".to_owned(), + } +} + fn check_version(hash: &[u8]) -> bool { WELL_KNOWN_VERSION_HASHES .all_v110c() @@ -61,7 +73,7 @@ async fn init(dll_path: &Path, direct_3d: Option) -> Option bool { *direct_3d_ref = Some(direct_3d); true } + +#[cfg(test)] +mod tests { + use super::normalize_locale; + + #[test] + fn test_normalize_locale() { + assert_eq!(normalize_locale("zh-CN"), "zh-CN"); + assert_eq!(normalize_locale("zh-SG"), "zh-CN"); + assert_eq!(normalize_locale("zh-MY"), "zh-CN"); + assert_eq!(normalize_locale("zh"), "zh-CN"); + assert_eq!(normalize_locale("zh-TW"), "zh-TW"); + assert_eq!(normalize_locale("zh-HK"), "zh-TW"); + assert_eq!(normalize_locale("zh-MO"), "zh-TW"); + assert_eq!(normalize_locale("en-US"), "en-US"); + assert_eq!(normalize_locale("ja-JP"), "ja-JP"); + } +}