forked from mia/Aegisub
Clean up AegisubLocale a bit
Don't let the user cancel the language selection dialog on first startup, and don't bother with the dialog at all if there's only one language available. Originally committed to SVN as r6602.
This commit is contained in:
parent
0b9a21bf82
commit
e120bec4f0
3 changed files with 36 additions and 72 deletions
|
@ -34,9 +34,6 @@
|
|||
/// @ingroup utility
|
||||
///
|
||||
|
||||
|
||||
///////////
|
||||
// Headers
|
||||
#include "config.h"
|
||||
|
||||
#ifndef AGI_PRE
|
||||
|
@ -52,34 +49,17 @@
|
|||
#include "aegisublocale.h"
|
||||
#include "standard_paths.h"
|
||||
|
||||
/// @brief Constructor
|
||||
///
|
||||
AegisubLocale::AegisubLocale () {
|
||||
locale = NULL;
|
||||
curCode = -1;
|
||||
}
|
||||
|
||||
|
||||
/// @brief DOCME
|
||||
///
|
||||
AegisubLocale::~AegisubLocale() {
|
||||
delete locale;
|
||||
}
|
||||
|
||||
|
||||
/// @brief Initialize
|
||||
/// @param language
|
||||
///
|
||||
void AegisubLocale::Init(int language) {
|
||||
if (language == -1) language = wxLANGUAGE_ENGLISH;
|
||||
if (locale) delete locale;
|
||||
if (language == -1)
|
||||
language = wxLANGUAGE_ENGLISH;
|
||||
|
||||
if (!wxLocale::IsAvailable(language)) {
|
||||
if (!wxLocale::IsAvailable(language))
|
||||
language = wxLANGUAGE_UNKNOWN;
|
||||
}
|
||||
|
||||
curCode = language;
|
||||
locale = new wxLocale(language);
|
||||
locale.reset(new wxLocale(language));
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
locale->AddCatalogLookupPathPrefix(StandardPaths::DecodePath("?data/locale/"));
|
||||
|
@ -93,13 +73,7 @@ void AegisubLocale::Init(int language) {
|
|||
setlocale(LC_CTYPE, "C");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// @brief Pick a language
|
||||
/// @return
|
||||
///
|
||||
int AegisubLocale::PickLanguage() {
|
||||
// Get list
|
||||
wxArrayInt langs = GetAvailableLanguages();
|
||||
|
||||
// Check if english is in it, else add it
|
||||
|
@ -114,31 +88,37 @@ int AegisubLocale::PickLanguage() {
|
|||
langs.Insert(user, 0);
|
||||
}
|
||||
|
||||
// Nothing to pick
|
||||
if (langs.empty()) return -1;
|
||||
|
||||
// Only one language, so don't bother asking the user
|
||||
if (langs.size() == 1 && !locale)
|
||||
return langs[0];
|
||||
|
||||
// Generate names
|
||||
wxArrayString langNames;
|
||||
for (size_t i=0;i<langs.Count();i++) {
|
||||
for (size_t i = 0; i < langs.size(); ++i)
|
||||
langNames.Add(wxLocale::GetLanguageName(langs[i]));
|
||||
}
|
||||
|
||||
// Nothing to pick
|
||||
if (langs.Count() == 0) return -1;
|
||||
long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCENTRE;
|
||||
if (locale)
|
||||
style |= wxCANCEL;
|
||||
|
||||
// Popup
|
||||
int picked = wxGetSingleChoiceIndex("Please choose a language:","Language",langNames,NULL,-1,-1,true,300,400);
|
||||
if (picked == -1) return -1;
|
||||
wxSingleChoiceDialog dialog(NULL, "Please choose a language:", "Language", langNames, 0, style);
|
||||
if (dialog.ShowModal() == wxID_OK) {
|
||||
int picked = dialog.GetSelection();
|
||||
if (locale && langs[picked] == locale->GetLanguage())
|
||||
return -1;
|
||||
return langs[picked];
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/// @brief Get list of available languages
|
||||
///
|
||||
wxArrayInt AegisubLocale::GetAvailableLanguages() {
|
||||
wxArrayInt final;
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
wxString temp1;
|
||||
|
||||
// Open directory
|
||||
wxString folder = StandardPaths::DecodePath("?data/locale/");
|
||||
wxDir dir;
|
||||
|
@ -146,19 +126,17 @@ wxArrayInt AegisubLocale::GetAvailableLanguages() {
|
|||
if (!dir.Open(folder)) return final;
|
||||
|
||||
// Enumerate folders
|
||||
wxString temp1;
|
||||
for (bool cont = dir.GetFirst(&temp1, "", wxDIR_DIRS); cont; cont = dir.GetNext(&temp1)) {
|
||||
// Check if .so exists inside folder
|
||||
wxFileName file(folder + temp1 + "/aegisub.mo");
|
||||
if (file.FileExists()) {
|
||||
if (wxFileName::FileExists(folder + temp1 + "/aegisub.mo")) {
|
||||
const wxLanguageInfo *lang = wxLocale::FindLanguageInfo(temp1);
|
||||
if (lang) {
|
||||
final.Add(lang->Language);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
const char* langs[] = {
|
||||
"ca",
|
||||
"cs",
|
||||
|
|
|
@ -34,33 +34,20 @@
|
|||
/// @ingroup utility
|
||||
///
|
||||
|
||||
#include <libaegisub/scoped_ptr.h>
|
||||
|
||||
|
||||
|
||||
//////////////
|
||||
// Prototypes
|
||||
class wxLocale;
|
||||
|
||||
|
||||
|
||||
/// DOCME
|
||||
/// @class AegisubLocale
|
||||
/// @brief DOCME
|
||||
///
|
||||
/// DOCME
|
||||
class AegisubLocale {
|
||||
private:
|
||||
|
||||
/// DOCME
|
||||
wxLocale *locale;
|
||||
agi::scoped_ptr<wxLocale> locale;
|
||||
wxArrayInt GetAvailableLanguages();
|
||||
|
||||
public:
|
||||
|
||||
/// DOCME
|
||||
int curCode;
|
||||
|
||||
AegisubLocale();
|
||||
~AegisubLocale();
|
||||
void Init(int language);
|
||||
int PickLanguage();
|
||||
|
|
|
@ -185,10 +185,9 @@ struct app_language : public Command {
|
|||
|
||||
void operator()(agi::Context *c) {
|
||||
// Get language
|
||||
int old = wxGetApp().locale.curCode;
|
||||
int newCode = wxGetApp().locale.PickLanguage();
|
||||
// Is OK?
|
||||
if (newCode != -1 && newCode != old) {
|
||||
if (newCode != -1) {
|
||||
// Set code
|
||||
OPT_SET("App/Locale")->SetInt(newCode);
|
||||
|
||||
|
|
Loading…
Reference in a new issue