std::string AegisubLocale::PickLanguage() { if (active_language.empty()) { wxString os_ui_language = GetTranslations()->GetBestTranslation(AEGISUB_CATALOG); if (!os_ui_language.empty()) return from_wx(os_ui_language); } wxArrayString langs = GetTranslations()->GetAvailableTranslations(AEGISUB_CATALOG); // No translations available, so don't bother asking the user if (langs.empty() && active_language.empty()) return "en_US"; langs.insert(langs.begin(), "en_US"); // Check if user local language is available, if so, make it first const wxLanguageInfo *info = wxLocale::GetLanguageInfo(wxLocale::GetSystemLanguage()); if (info) { auto it = std::find(langs.begin(), langs.end(), info->CanonicalName); if (it != langs.end()) std::rotate(langs.begin(), it, it + 1); } // Generate names wxArrayString langNames; for (auto const& lang : langs) langNames.push_back(LocalizedLanguageName(lang)); long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCENTRE; if (!active_language.empty()) style |= wxCANCEL; wxSingleChoiceDialog dialog(nullptr, "Please choose a language:", "Language", langNames, (void **)nullptr, style); if (dialog.ShowModal() == wxID_OK) { int picked = dialog.GetSelection(); if (langs[picked] != active_language) return from_wx(langs[picked]); } return ""; }
void AegisubLocale::Init(std::string const& language) { wxTranslations *translations = GetTranslations(); translations->SetLanguage(to_wx(language)); translations->AddCatalog(AEGISUB_CATALOG); translations->AddStdCatalog(); setlocale(LC_NUMERIC, "C"); setlocale(LC_CTYPE, "C"); active_language = language; }
wxString AegisubLocale::PickLanguage() { wxArrayString langs = GetTranslations()->GetAvailableTranslations(AEGISUB_CATALOG); langs.insert(langs.begin(), "en_US"); // Check if user local language is available, if so, make it first const wxLanguageInfo *info = wxLocale::GetLanguageInfo(wxLocale::GetSystemLanguage()); if (info) { auto it = std::find(langs.begin(), langs.end(), info->CanonicalName); if (it != langs.end()) std::rotate(langs.begin(), it, it + 1); } // Nothing to pick if (langs.empty()) return ""; // Only one language, so don't bother asking the user if (langs.size() == 1 && !active_language) return langs[0]; // Generate names wxArrayString langNames; for (size_t i = 0; i < langs.size(); ++i) { const wxLanguageInfo *info = wxLocale::FindLanguageInfo(langs[i]); if (info) langNames.push_back(wxLocale::GetLanguageName(info->Language)); else langNames.push_back(langs[i]); } long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCENTRE; if (!active_language.empty()) style |= wxCANCEL; wxSingleChoiceDialog dialog(nullptr, "Please choose a language:", "Language", langNames, #if wxCHECK_VERSION(2, 9, 4) (void **)0, #else 0, #endif style); if (dialog.ShowModal() == wxID_OK) { int picked = dialog.GetSelection(); if (langs[picked] != active_language) return langs[picked]; } return ""; }
bool AegisubLocale::HasLanguage(std::string const& language) { auto langs = GetTranslations()->GetAvailableTranslations(AEGISUB_CATALOG); return std::find(langs.begin(), langs.end(), to_wx(language)) != langs.end(); }