Advertisement
Guest User

CPP File

a guest
Aug 24th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. LanguageHandler::LanguageHandler(std::wstring languageFile)
  2. {
  3.     m_LanguageFile = languageFile;
  4.  
  5.     std::wstring parse = ParseLanguageFile();
  6.  
  7.     if (parse != L"ParseOK")
  8.     {
  9.         wxMessageBox(parse, L"Parse error", wxICON_ERROR);
  10.  
  11.         throw L"Parse error";
  12.     }
  13. }
  14.  
  15. // Simple parser for a *.lang file
  16. std::wstring LanguageHandler::ParseLanguageFile()
  17. {
  18.     bool inLanguage = false;
  19.     bool inSection = false;
  20.     int currentLine = 0;
  21.     std::wstring currentLanguage = L"";
  22.     std::wstring currentSection = L"";
  23.  
  24.     std::map<std::wstring, // Section
  25.         std::map<std::wstring, // Key
  26.         std::wstring>> oneLanguage;
  27.  
  28.     // Open file
  29.     std::wifstream langFile(m_LanguageFile);
  30.     if (!langFile.is_open())
  31.         return L"Can not open file";
  32.  
  33.     for (std::wstring line; getline(langFile, line); currentLine++)
  34.     {
  35.         if (line.size() < 1)
  36.             continue;
  37.  
  38.         // Remove all spaces
  39.         line.erase(std::remove_if(line.begin(), line.end(), isspace), line.end());
  40.  
  41.         if (line[0] == L';') // Comment (ignore)
  42.         {
  43.             continue;
  44.         }
  45.         else if (line[0] == L'{') // Language name
  46.         {
  47.             inSection = false;
  48.  
  49.             if (inLanguage) // Syntax error (missing closing })
  50.                 return std::to_wstring(currentLine + 1) + L": Syntax error: missing closing }";
  51.  
  52.             inLanguage = true;
  53.             currentLanguage = std::wstring(line.begin() + 1, line.end());
  54.             continue;
  55.         }
  56.         else if (line[0] == L'}') // Language end
  57.         {
  58.             inSection = false;
  59.             inLanguage = false;
  60.  
  61.             m_KnownLanguages.push_back(currentLanguage);
  62.  
  63.             m_Languages[currentLanguage] = oneLanguage;
  64.             oneLanguage.clear();
  65.         }
  66.         else if (line[0] == L'[') // Section
  67.         {
  68.             if (!inLanguage)
  69.                 return std::to_wstring(currentLine + 1) + L": Syntax error: unexpected token \"[\"";
  70.  
  71.             inSection = true;
  72.             currentSection = std::wstring(line.begin() + 1, line.end() - 1);
  73.  
  74.             if (*(line.end() - 1) != L']') // Syntax error (missing closing ])
  75.                 return std::to_wstring(currentLine + 1) + L": Syntax error: missing closing ]";
  76.         }
  77.         else
  78.         {
  79.             if (!inLanguage || !inSection || line.find('=', 0) == std::wstring::npos) // Unknown expression
  80.                 return std::to_wstring(currentLine + 1) + L": Unknown expression";
  81.  
  82.             // Key/value pair
  83.             std::wstring key_value[2] = { L"", L"" };
  84.             bool value = false;
  85.  
  86.             for (auto i : line)
  87.             {
  88.                 if (i == '=')
  89.                 {
  90.                     value = true;
  91.                     continue;
  92.                 }
  93.  
  94.                 key_value[static_cast<int>(value)] += i;
  95.             }
  96.  
  97.             key_value[1] = AddSpacesToValue(key_value[1]);
  98.             oneLanguage[currentSection][key_value[0]] = key_value[1];
  99.         }
  100.     }
  101.  
  102.     langFile.close();
  103.  
  104.     return L"ParseOK";
  105. }
  106.  
  107. bool LanguageHandler::SetLanguage(std::wstring language)
  108. {
  109.     if (m_Languages.find(language) == m_Languages.end())
  110.         return false;
  111.  
  112.     m_Language = language;
  113.  
  114.     return true;
  115. }
  116.  
  117. std::wstring LanguageHandler::Translate(std::wstring frame, std::wstring element)
  118. {
  119.     if (m_Language == L"")
  120.         return L"ERR_NO_LANG";
  121.  
  122.     if (m_Languages[m_Language].find(frame) == m_Languages[m_Language].end() ||
  123.         m_Languages[m_Language][frame].find(element) == m_Languages[m_Language][frame].end())
  124.     {
  125.         return L"REPLACE ME";
  126.     }
  127.  
  128.     return m_Languages[m_Language][frame][element];
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement