void StTranslations::setLanguage(const int32_t theNewLang) { if(size_t(theNewLang) >= params.language->getValues().size()) { return; } // save global setting const StString& aFolderName = myLangFolderList[theNewLang]; StSettings aGlobalSettings(myResMgr, ST_GLOBAL_SETTINGS_GROUP); aGlobalSettings.saveString(ST_SETTING_LANGUAGE, aFolderName); updateLangCode(theNewLang); // reload translation file StLangMap::clear(); const StString aResName = StString() + "lang" ST_FILE_SPLITTER + aFolderName + SYS_FS_SPLITTER + myModuleName + StTranslations::DEFAULT_SUFFIX; StHandle<StResource> aRes = myResMgr->getResource(aResName); if(!aRes.isNull() && aRes->read()) { const char* aSrc = (const char* )aRes->getData(); const int aLen = aRes->getSize(); read(aSrc, aLen); } myWasReloaded = true; }
void StApplication::stApplicationInit(const StHandle<StOpenInfo>& theOpenInfo) { if(myResMgr.isNull()) { myResMgr = new StResourceManager(); } #ifdef ST_DEBUG_GL myGlDebug = true; #endif StSettings aGlobalSettings(myResMgr, "sview"); params.ActiveDevice = new StEnumParam(0, "Change device"); params.ActiveDevice->signals.onChanged.connect(this, &StApplication::doChangeDevice); params.VSyncMode = new StEnumParam(0, "VSync mode"); params.VSyncMode->changeValues().add("Off"); params.VSyncMode->changeValues().add("On"); params.VSyncMode->changeValues().add("Mixed"); bool isOutModeAuto = true; // AUTO by default aGlobalSettings.loadBool(ST_SETTING_RENDERER_AUTO, isOutModeAuto); if(!isOutModeAuto) { aGlobalSettings.loadString(ST_SETTING_RENDERER, myRendId); } // add additional paths #ifdef _WIN32 // requires Windows XP with SP1 or higher StStringUtfWide aStCoreFolder = StProcess::getStCoreFolder().toUtfWide(); SetDllDirectoryW(aStCoreFolder.toCString()); #endif myOpenFileInfo = theOpenInfo; if(myOpenFileInfo.isNull()) { myOpenFileInfo = parseProcessArguments(); } if(myOpenFileInfo.isNull()) { myOpenFileInfo = new StOpenInfo(); } const StArgumentsMap anArgs = myOpenFileInfo->getArgumentsMap(); const StString ARGUMENT_PLUGIN_OUT = "out"; const StString ARGUMENT_PLUGIN_OUT_DEVICE = "outDevice"; const StString ARGUMENT_GLDEBUG = "gldebug"; StArgument anArgRenderer = anArgs[ARGUMENT_PLUGIN_OUT]; StArgument anArgDevice = anArgs[ARGUMENT_PLUGIN_OUT_DEVICE]; StArgument anArgGlDebug = anArgs[ARGUMENT_GLDEBUG]; if(anArgRenderer.isValid()) { myRendId = anArgRenderer.getValue(); } //if(anArgDevice.isValid()) { // aDevice = anArgDevice.getValue(); //} if(anArgGlDebug.isValid()) { myGlDebug = true; } }
bool StApplication::open() { if(!myWindow.isNull()) { return true; } StSettings aGlobalSettings(myResMgr, "sview"); if(!mySwitchTo.isNull()) { myRendId = mySwitchTo->getRendererId(); myWindow = mySwitchTo; mySwitchTo.nullify(); aGlobalSettings.saveString(ST_SETTING_RENDERER, myRendId); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, false); } else { if(myRenderers.isEmpty()) { myWindow = new StWindow(myResMgr, myWinParent); myWindow->setMessagesQueue(myMsgQueue); myWindow->params.VSyncMode = params.VSyncMode; } else { bool isAuto = myRendId.isEqualsIgnoreCase(ST_SETTING_AUTO_VALUE); if(!isAuto) { for(size_t anIter = 0; anIter < myRenderers.size(); ++anIter) { StHandle<StWindow> aWin = myRenderers[anIter]; if(myRendId == aWin->getRendererId()) { myWindow = aWin; aGlobalSettings.saveString(ST_SETTING_RENDERER, myRendId); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, isAuto); break; } } if(myWindow.isNull()) { stError(StString("Output with id '" + myRendId + "' is not found.")); isAuto = true; } } if(isAuto) { // autodetection aGlobalSettings.saveString(ST_SETTING_RENDERER, ST_SETTING_AUTO_VALUE); aGlobalSettings.saveBool (ST_SETTING_RENDERER_AUTO, isAuto); myWindow = myRenderers[0]; if(!myDevices.isEmpty()) { StHandle<StOutDevice> aBestDev = myDevices[0]; for(size_t aDevIter = 0; aDevIter < myDevices.size(); ++aDevIter) { const StHandle<StOutDevice>& aDev = myDevices[aDevIter]; if(aDev->Priority > aBestDev->Priority) { aBestDev = aDev; } } for(size_t anIter = 0; anIter < myRenderers.size(); ++anIter) { const StHandle<StWindow>& aWin = myRenderers[anIter]; if(aBestDev->PluginId == aWin->getRendererId()) { myWindow = aWin; myWindow->setDevice(aBestDev->DeviceId); break; } } } } } myWindow->setTitle(myTitle); } // synchronize devices enumeration const StString aPluginId = myWindow->getRendererId(); const StString aDeviceId = myWindow->getDeviceId(); for(size_t aDevIter = 0; aDevIter < myDevices.size(); ++aDevIter) { const StHandle<StOutDevice>& aDev = myDevices[aDevIter]; if(aPluginId == aDev->PluginId && aDeviceId == aDev->DeviceId) { params.ActiveDevice->setValue((int32_t )aDevIter); break; } } // setup GL options before window creation const StWinAttr anAttribs[] = { StWinAttr_GlDebug, (StWinAttr )myGlDebug, StWinAttr_NULL }; myWindow->setAttributes(anAttribs); myIsOpened = myWindow->create(); if(myIsOpened) { // connect slots myWindow->signals.onRedraw = stSlot(this, &StApplication::doDrawProxy); myWindow->signals.onClose = stSlot(this, &StApplication::doClose); myWindow->signals.onPause = stSlot(this, &StApplication::doPause); myWindow->signals.onResize = stSlot(this, &StApplication::doResize); myWindow->signals.onAction = stSlot(this, &StApplication::doAction); myWindow->signals.onKeyDown = stSlot(this, &StApplication::doKeyDown); myWindow->signals.onKeyUp = stSlot(this, &StApplication::doKeyUp); myWindow->signals.onKeyHold = stSlot(this, &StApplication::doKeyHold); myWindow->signals.onMouseDown = stSlot(this, &StApplication::doMouseDown); myWindow->signals.onMouseUp = stSlot(this, &StApplication::doMouseUp); myWindow->signals.onTouch = stSlot(this, &StApplication::doTouch); myWindow->signals.onGesture = stSlot(this, &StApplication::doGesture); myWindow->signals.onScroll = stSlot(this, &StApplication::doScroll); myWindow->signals.onFileDrop = stSlot(this, &StApplication::doFileDrop); myWindow->signals.onNavigate = stSlot(this, &StApplication::doNavigate); } return myIsOpened; }
void StTranslations::reload() { params.language->changeValues().clear(); // detect available translations StArrayList<StString> aFolders; myResMgr->listSubFolders("lang", aFolders); for(size_t aNodeId = 0; aNodeId < aFolders.size(); ++aNodeId) { myLangFolderList.add(aFolders[aNodeId]); const StString aNameFile = StString("lang" ST_FILE_SPLITTER) + aFolders[aNodeId] + ST_FILE_SPLITTER "language.lng"; StHandle<StResource> aRes = myResMgr->getResource(aNameFile); StString aName; if(!aRes.isNull() && aRes->read()) { const char* aSrc = (const char* )aRes->getData(); const size_t aLen = (size_t )aRes->getSize(); aName = StString(aSrc, aLen); } params.language->changeValues().add(aName.isEmpty() ? aFolders[aNodeId] : aName); } #if defined(__ANDROID__) if(params.language->getValues().isEmpty()) { // no way to list sub-folder on Android - check known translations if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "English" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("English"); myLangFolderList.add("English"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "Russian" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("русский"); myLangFolderList.add("Russian"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "French" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("français"); myLangFolderList.add("French"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "German" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("Deutsch"); myLangFolderList.add("German"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "Korean" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("한국어"); myLangFolderList.add("Korean"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "ChineseS" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("简体中文"); myLangFolderList.add("ChineseS"); } if(myResMgr->isResourceExist(StString("lang" ST_FILE_SPLITTER "Czech" ST_FILE_SPLITTER) + myModuleName + StTranslations::DEFAULT_SUFFIX)) { params.language->changeValues().add("Čeština"); myLangFolderList.add("Czech"); } } #endif if(params.language->getValues().isEmpty()) { // add built-in language params.language->changeValues().add("English"); myLangFolderList.add("English"); } size_t anIdInList = 0; StString aLangParam("English"); StSettings aGlobalSettings(myResMgr, ST_GLOBAL_SETTINGS_GROUP); bool isLangSet = false; if(!aGlobalSettings.loadString(ST_SETTING_LANGUAGE, aLangParam)) { // try to use system-wide language settings const StString& aLang = myResMgr->getSystemLanguage(); if(aLang.isEqualsIgnoreCase(stCString("ru"))) { if(myLangFolderList.contains(stCString("Russian"), anIdInList) || myLangFolderList.contains(stCString("русский"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } else if(aLang.isEqualsIgnoreCase(stCString("de"))) { if(myLangFolderList.contains(stCString("German"), anIdInList) || myLangFolderList.contains(stCString("Deutsch"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } else if(aLang.isEqualsIgnoreCase(stCString("fr"))) { if(myLangFolderList.contains(stCString("French"), anIdInList) || myLangFolderList.contains(stCString("français"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } else if(aLang.isEqualsIgnoreCase(stCString("ko"))) { if(myLangFolderList.contains(stCString("Korean"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } else if(aLang.isEqualsIgnoreCase(stCString("zh"))) { if(myLangFolderList.contains(stCString("ChineseS"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } else if(aLang.isEqualsIgnoreCase(stCString("cs"))) { if(myLangFolderList.contains(stCString("Čeština"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); isLangSet = true; } } } if(!isLangSet) { if(myLangFolderList.contains(aLangParam, anIdInList) || myLangFolderList.contains(stCString("English"), anIdInList)) { params.language->setValue(int32_t(anIdInList)); } } updateLangCode(int32_t(anIdInList)); const StString& aFolderName = myLangFolderList[anIdInList]; const StString aResName = StString() + "lang" + SYS_FS_SPLITTER + aFolderName + SYS_FS_SPLITTER + myModuleName + StTranslations::DEFAULT_SUFFIX; StHandle<StResource> aRes = myResMgr->getResource(aResName); if(!aRes.isNull() && aRes->read()) { const char* aSrc = (const char* )aRes->getData(); const int aLen = aRes->getSize(); read(aSrc, aLen); } // connect signal params.language->signals.onChanged.connect(this, &StTranslations::setLanguage); }