File: clLocaleManager.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (75 lines) | stat: -rw-r--r-- 2,550 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "clLocaleManager.hpp"

#include <thread>
#include <unordered_set>
#include <wx/fontmap.h>
#include <wx/intl.h>
#include <wx/wxprec.h>

using namespace std;
clLocaleManager::clLocaleManager() {}

clLocaleManager::~clLocaleManager() {}

void clLocaleManager::load()
{
    auto entry_point = [](clLocaleManager* manager) {
        wxArrayString cached_locales;
        wxArrayString cached_locales_CanonicalName;
        int system_default_locale = wxNOT_FOUND;

        unordered_set<wxString> visited;

        int system_lang = wxLocale::GetSystemLanguage();
        if(system_lang == wxLANGUAGE_UNKNOWN) {
            // Least-stupid fallback value
            system_lang = wxLANGUAGE_ENGLISH_US;
        }

        // this operation takes time to perform, cache the locales
        for(int n = 0, lang = wxLANGUAGE_UNKNOWN + 1; lang < wxLANGUAGE_USER_DEFINED; ++lang) {
            const wxLanguageInfo* info = wxLocale::GetLanguageInfo(lang);
            // Check there *is* a Canonical name, as empty strings return a valid locale :/
            if((info && !info->CanonicalName.IsEmpty()) && wxLocale::IsAvailable(lang)) {

                // Check we haven't already seen this item: we may find the system default twice
                if(visited.insert(info->CanonicalName).second) {
                    // Display the name as e.g. "en_GB: English (U.K.)"
                    cached_locales.Add(info->CanonicalName + ": " + info->Description);
                    cached_locales_CanonicalName.Add(info->CanonicalName);

                    if(lang == system_lang) {
                        // Use this as the selection if preffered_locale isn't found
                        system_default_locale = n;
                    }
                    ++n;
                }
            }
        }
        LocaleParams d;
        d.cached_locales.swap(cached_locales);
        d.cached_locales_CanonicalName.swap(cached_locales_CanonicalName);
        d.system_default_locale = system_default_locale;
        manager->CallAfter(&clLocaleManager::OnScanCompleted, d);
    };

#ifdef __WXGTK__
    thread thr(entry_point, this);
    thr.detach();
#else
    entry_point(this);
#endif
}

void clLocaleManager::OnScanCompleted(const LocaleParams& params)
{
    m_cached_locales = params.cached_locales;
    m_cached_locales_CanonicalName = params.cached_locales_CanonicalName;
    m_system_default_locale = params.system_default_locale;
}

clLocaleManager& clLocaleManager::get()
{
    static clLocaleManager locale_mgr;
    return locale_mgr;
}