source: filezilla/trunk/fuentes/src/interface/settings/optionspage_language.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 3.0 KB
Line 
1#include <filezilla.h>
2#include "../Options.h"
3#include "settingsdialog.h"
4#include "optionspage.h"
5#include "optionspage_language.h"
6#include "../filezillaapp.h"
7#include <algorithm>
8
9BEGIN_EVENT_TABLE(COptionsPageLanguage, COptionsPage)
10END_EVENT_TABLE()
11
12bool COptionsPageLanguage::LoadPage()
13{
14        return true;
15}
16
17bool COptionsPageLanguage::SavePage()
18{
19        if (!m_was_selected)
20                return true;
21
22        wxListBox* pListBox = XRCCTRL(*this, "ID_LANGUAGES", wxListBox);
23
24        if (pListBox->GetSelection() == wxNOT_FOUND)
25                return true;
26
27        const int selection = pListBox->GetSelection();
28        wxString code;
29        if (selection > 0)
30                code = m_locale[selection - 1].code;
31
32#ifdef __WXGTK__
33        m_pOptions->SetOption(OPTION_LANGUAGE, code);
34#else
35        bool successful = false;
36        if (code.empty()) {
37                wxGetApp().SetLocale(wxLANGUAGE_DEFAULT);
38
39                // Default language cannot fail, has to silently fall back to English
40                successful = true;
41        }
42        else {
43                const wxLanguageInfo* pInfo = wxLocale::FindLanguageInfo(code);
44                if (pInfo)
45                        successful = wxGetApp().SetLocale(pInfo->Language);
46        }
47
48        if (successful)
49                m_pOptions->SetOption(OPTION_LANGUAGE, code);
50        else
51                wxMessageBoxEx(wxString::Format(_("Failed to set language to %s, using default system language"), pListBox->GetStringSelection()), _("Failed to change language"), wxICON_EXCLAMATION, this);
52#endif
53        return true;
54}
55
56bool COptionsPageLanguage::Validate()
57{
58        return true;
59}
60
61bool COptionsPageLanguage::OnDisplayedFirstTime()
62{
63        wxListBox* pListBox = XRCCTRL(*this, "ID_LANGUAGES", wxListBox);
64        if (!pListBox)
65                return false;
66
67        wxString currentLanguage = m_pOptions->GetOption(OPTION_LANGUAGE);
68
69        pListBox->Clear();
70
71        const wxString defaultName = _("Default system language");
72        int n = pListBox->Append(defaultName);
73        if (currentLanguage.empty())
74                pListBox->SetSelection(n);
75
76        GetLocales();
77
78        for (auto const& locale : m_locale) {
79                n = pListBox->Append(locale.name + _T(" (") + locale.code + _T(")"));
80                if (locale.code == currentLanguage)
81                        pListBox->SetSelection(n);
82        }
83        pListBox->GetContainingSizer()->Layout();
84
85        return true;
86}
87
88void COptionsPageLanguage::GetLocales()
89{
90        m_locale.push_back(_locale_info());
91        m_locale.back().code = _T("en_US");
92        m_locale.back().name = _T("English");
93
94        CLocalPath localesDir = wxGetApp().GetLocalesDir();
95        if (localesDir.empty() || !localesDir.Exists()) {
96                return ;
97        }
98
99        wxDir dir(localesDir.GetPath());
100        wxString locale;
101        for (bool found = dir.GetFirst(&locale); found; found = dir.GetNext(&locale)) {
102                if (!wxFileName::FileExists(localesDir.GetPath() + locale + _T("/filezilla.mo"))) {
103                        if (!wxFileName::FileExists(localesDir.GetPath() + locale + _T("/LC_MESSAGES/filezilla.mo")))
104                                continue;
105                }
106
107                wxString name;
108                const wxLanguageInfo* pInfo = wxLocale::FindLanguageInfo(locale);
109                if (!pInfo)
110                        continue;
111                if (!pInfo->Description.empty())
112                        name = pInfo->Description;
113                else
114                        name = locale;
115
116                m_locale.push_back({ name, locale });
117        }
118
119        std::sort(m_locale.begin(), m_locale.end(), [](_locale_info const& l, _locale_info const& r) { return l.name < r.name; });
120}
Note: See TracBrowser for help on using the repository browser.