From 3ad8f5c448fe00cfcb79956da8da2dfc0f608615 Mon Sep 17 00:00:00 2001 From: Claudio Valerio Date: Sat, 31 Mar 2012 11:08:07 +0200 Subject: [PATCH] fixed issue SANKORE-574 and font manager is now translated depending on the system lanaguage (linux only but other will be fixed soon too) and some script build issues fixed on linux --- buildDebianPackage | 36 +++++++++++++---- release.linux.sh | 33 ++++++++++++---- src/core/UBApplication.cpp | 37 +++++++++++------- src/core/UBApplication.h | 2 + src/core/UBDisplayManager.cpp | 1 - src/desktop/UBDesktopAnnotationController.cpp | 18 --------- src/frameworks/UBPlatformUtils.h | 2 +- src/frameworks/UBPlatformUtils_linux.cpp | 4 +- src/frameworks/UBPlatformUtils_mac.mm | 4 +- src/frameworks/UBPlatformUtils_win.cpp | Bin 24838 -> 11887 bytes 10 files changed, 85 insertions(+), 52 deletions(-) diff --git a/buildDebianPackage b/buildDebianPackage index 95c6a243..98fb8c2c 100755 --- a/buildDebianPackage +++ b/buildDebianPackage @@ -26,6 +26,9 @@ rm -rf install QT_PATH="/usr/local/Trolltech/Qt-4.7.3" PLUGINS_PATH="$QT_PATH/plugins" QMAKE_PATH="$QT_PATH/bin/qmake" +LRELEASES="/usr/local/Trolltech/Qt-4.7.3/bin/lrelease" +GUI_TRANSLATIONS_DIRECTORY_PATH="../Qt-sankore3.1/translations" +ARCHITECTURE=`uname -m` if [ ! -e "$QMAKE_PATH" ]; then notifyError "qmake command not found at $QMAKE_PATH" @@ -36,10 +39,14 @@ if [ ! -e "$PLUGINS_PATH" ]; then fi notify-send "Open-Sankore" "Building Open-Sankore ..." -$QMAKE_PATH -spec linux-g++ -make -j 4 release-install +if [ "$ARCHITECTURE" == "x86_64" ]; then + $QMAKE_PATH -spec linux-g++-64 +else + $QMAKE_PATH -spec linux-g++ +fi +make -j 4 release-install notify-send "Git Hub" "Make a tag of the delivered version" VERSION=`cat build/linux/release/version` @@ -49,8 +56,8 @@ else LAST_COMMITED_VERSION="`git describe $(git rev-list --tags --max-count=1)`" if [ "v$VERSION" != "$LAST_COMMITED_VERSION" ]; then echo creating a tag with the version $VERSION -# git tag -a "v$VERSION" -m "Generating setup for v$VERSION" -# git push origin --tags + git tag -a "v$VERSION" -m "Generating setup for v$VERSION" + git push origin --tags fi fi @@ -92,15 +99,31 @@ else cp "$QT_LIBRARY_SOURCE_PATH/libphonon.so.4.4.0" "$QT_LIBRARY_DEST_PATH/" fi + +notify-send "QT" "Internalization ..." +if [ ! -e $GUI_TRANSLATIONS_DIRECTORY_PATH ]; then + notifyError "gui translations pro file not found at: $GUI_TRANSLATIONS_DIRECTORY_PATH" +else + cd $GUI_TRANSLATIONS_DIRECTORY_PATH + $LRELEASES translations.pro + cd - + if [ ! -e build/linux/release/product/i18n ]; then + mkdir build/linux/release/product/i18n + fi + #copying qt gui translation + cp $GUI_TRANSLATIONS_DIRECTORY_PATH/qt_??.qm build/linux/release/product/i18n/ +fi + +$LRELEASES Sankore_3.1.pro +cp resources/i18n/*.qm build/linux/release/product/i18n/ + rm -rf install/linux mkdir -p install/linux -#mv build/linux/release/product build/linux/release/Sankore.$VERSION cd build/linux/release/product #Removing .svn directories ... find . -name .svn -exec rm -rf {} \; 2> /dev/null -#tar cvzf ../../../install/linux/Sankore\ 3.1.tar.gz Sankore_3.1.$VERSION -C . cd - notify-send "Building Sankore" "Finished to build Sankore building the package" @@ -191,7 +214,6 @@ CHANGE_LOG_FILE="$BASE_WORKING_DIR/DEBIAN/changelog-sankore-$VERSION.txt" CONTROL_FILE="$BASE_WORKING_DIR/DEBIAN/control" CHANGE_LOG_TEXT="changelog.txt" -ARCHITECTURE=`uname -m` if [ "$ARCHITECTURE" == "x86_64" ]; then ARCHITECTURE="amd64" fi diff --git a/release.linux.sh b/release.linux.sh index fd9624a6..9601d06c 100755 --- a/release.linux.sh +++ b/release.linux.sh @@ -23,6 +23,7 @@ QT_PATH="/usr/local/Trolltech/Qt-4.7.3" PLUGINS_PATH="$QT_PATH/plugins" QMAKE_PATH="$QT_PATH/bin/qmake" LRELEASES="/usr/local/Trolltech/Qt-4.7.3/bin/lrelease" +GUI_TRANSLATIONS_DIRECTORY_PATH="../Qt-sankore3.1/translations" if [ ! -e "$QMAKE_PATH" ]; then echo "qmake command not found at $QMAKE_PATH" @@ -35,11 +36,15 @@ if [ ! -e "$PLUGINS_PATH" ]; then exit 1 fi -$QMAKE_PATH -spec linux-g++ +ARCHITECTURE=`uname -m` +if [ "$ARCHITECTURE" == "x86_64" ]; then + $QMAKE_PATH -spec linux-g++-64 +else + $QMAKE_PATH -spec linux-g++ +fi make -j 4 release-install -$LRELEASES "Sankore_3.1.pro" VERSION=`cat build/linux/release/version` if [ ! -f build/linux/release/version ]; then @@ -79,9 +84,6 @@ copyQtLibrary(){ } -cp "$QT_LIBRARY_SOURCE_PATH/libphonon.so.4" "$QT_LIBRARY_DEST_PATH/" -cp "$QT_LIBRARY_SOURCE_PATH/libphonon.so.4.4.0" "$QT_LIBRARY_DEST_PATH/" - copyQtLibrary libQtWebKit copyQtLibrary libQtDBus copyQtLibrary libQtScript @@ -92,8 +94,25 @@ copyQtLibrary libQtXml copyQtLibrary libQtGui copyQtLibrary libQtCore -cp "$QT_LIBRARY_SOURCE_PATH/phonon.so.4" "$QT_LIBRARY_DEST_PATH/" -cp "$QT_LIBRARY_SOURCE_PATH/phonon.so.4.4.0" "$QT_LIBRARY_DEST_PATH/" +cp "$QT_LIBRARY_SOURCE_PATH/libphonon.so.4" "$QT_LIBRARY_DEST_PATH/" +cp "$QT_LIBRARY_SOURCE_PATH/libphonon.so.4.4.0" "$QT_LIBRARY_DEST_PATH/" + +if [ ! -e $GUI_TRANSLATIONS_DIRECTORY_PATH ]; then + notifyError "gui translations pro file not found at: $GUI_TRANSLATIONS_DIRECTORY_PATH" +else + cd $GUI_TRANSLATIONS_DIRECTORY_PATH + $LRELEASES translations.pro + cd - + if [ ! -e build/linux/release/product/i18n ]; then + mkdir build/linux/release/product/i18n + fi + #copying qt gui translation + cp $GUI_TRANSLATIONS_DIRECTORY_PATH/qt_??.qm build/linux/release/product/i18n/ +fi + +$LRELEASES Sankore_3.1.pro +cp resources/i18n/*.qm build/linux/release/product/i18n/ + rm -rf install/linux mkdir -p install/linux diff --git a/src/core/UBApplication.cpp b/src/core/UBApplication.cpp index 7c78a086..de59f778 100644 --- a/src/core/UBApplication.cpp +++ b/src/core/UBApplication.cpp @@ -101,8 +101,10 @@ static OSStatus ub_appleEventProcessor(const AppleEvent *ae, AppleEvent *event, #endif -UBApplication::UBApplication(const QString &id, int &argc, char **argv) : QtSingleApplication(id, argc, argv), - mPreferencesController(NULL) +UBApplication::UBApplication(const QString &id, int &argc, char **argv) : QtSingleApplication(id, argc, argv) + , mPreferencesController(NULL) + , mApplicationTranslator(NULL) + , mQtGuiTranslator(NULL) { staticMemoryCleaner = new QObject(0); // deleted in UBApplication destructor @@ -136,22 +138,20 @@ UBApplication::UBApplication(const QString &id, int &argc, char **argv) : QtSing undoStack = new QUndoStack(staticMemoryCleaner); } - QTranslator *translator = new QTranslator(this); - - translator->load(UBPlatformUtils::preferredTranslation()); - - installTranslator(translator); + mApplicationTranslator = new QTranslator(this); + mApplicationTranslator->load(UBPlatformUtils::preferredTranslation(QString("sankore_"))); + installTranslator(mApplicationTranslator); QString localString; - - if (!translator->isEmpty()) - { + if (!mApplicationTranslator->isEmpty()) localString = UBPlatformUtils::preferredLanguage(); - } else - { localString = "en_US"; - } + + mQtGuiTranslator = new QTranslator(this); + mQtGuiTranslator->load(UBPlatformUtils::preferredTranslation(QString("qt_"))); + installTranslator(mQtGuiTranslator); + QLocale::setDefault(QLocale(localString)); qDebug() << "Running application in:" << localString; @@ -203,6 +203,15 @@ UBApplication::~UBApplication() UBToolsManager::destroy(); + if(mApplicationTranslator != NULL){ + delete mApplicationTranslator; + mApplicationTranslator = NULL; + } + if(mQtGuiTranslator!=NULL){ + delete mQtGuiTranslator; + mQtGuiTranslator = NULL; + } + delete staticMemoryCleaner; staticMemoryCleaner = 0; } @@ -252,7 +261,7 @@ int UBApplication::exec(const QString& pFileToImport) boardController->paletteManager()->connectToDocumentController(); - UBDrawingController::drawingController()->setStylusTool((int)UBStylusTool::Selector); + UBDrawingController::drawingController()->setStylusTool((int)UBStylusTool::Pen); applicationController = new UBApplicationController(boardController->controlView(), boardController->displayView(), mainWindow, staticMemoryCleaner); diff --git a/src/core/UBApplication.h b/src/core/UBApplication.h index 0ca7ac37..5e2743fb 100644 --- a/src/core/UBApplication.h +++ b/src/core/UBApplication.h @@ -132,6 +132,8 @@ class UBApplication : public QtSingleApplication #endif UBPreferencesController* mPreferencesController; + QTranslator* mApplicationTranslator; + QTranslator* mQtGuiTranslator; }; diff --git a/src/core/UBDisplayManager.cpp b/src/core/UBDisplayManager.cpp index 1bffbb26..339fd3cb 100644 --- a/src/core/UBDisplayManager.cpp +++ b/src/core/UBDisplayManager.cpp @@ -142,7 +142,6 @@ void UBDisplayManager::setAsDesktop(QWidget* pControlWidget ) mDesktopWidget = pControlWidget; mDesktopWidget->hide(); mDesktopWidget->setGeometry(mDesktop->screenGeometry(mControlScreenIndex)); -// mDisplayWidget->showFullScreen(); // !!!! Should be included into Windows after QT recompilation #ifdef Q_WS_MAC // mControlWidget->setAttribute(Qt::WA_MacNoShadow); diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp index 9cb92e4b..56540a46 100644 --- a/src/desktop/UBDesktopAnnotationController.cpp +++ b/src/desktop/UBDesktopAnnotationController.cpp @@ -52,11 +52,9 @@ UBDesktopAnnotationController::UBDesktopAnnotationController(QObject *parent) , mTransparentDrawingView(0) , mTransparentDrawingScene(0) , mDesktopPalette(NULL) -// , mKeyboardPalette(0) , mDesktopPenPalette(NULL) , mDesktopMarkerPalette(NULL) , mDesktopEraserPalette(NULL) -// , mRightPalette(NULL) , mWindowPositionInitialized(0) , mIsFullyTransparent(false) , mDesktopToolsPalettePositioned(false) @@ -89,27 +87,13 @@ UBDesktopAnnotationController::UBDesktopAnnotationController(QObject *parent) mTransparentDrawingScene = new UBGraphicsScene(0); mTransparentDrawingView->setScene(mTransparentDrawingScene); -// mRightPalette = UBApplication::boardController->paletteManager()->createDesktopRightPalette(mTransparentDrawingView); - //mRightPalette = new UBRightPalette(mTransparentDrawingView); - mDesktopPalette = new UBDesktopPalette(mTransparentDrawingView); if (UBPlatformUtils::hasVirtualKeyboard()) { -#ifdef Q_WS_X11 -// mKeyboardPalette = UBKeyboardPalette::create(0); -// connect(mTransparentDrawingView, SIGNAL(hidden()), mKeyboardPalette, SLOT(hide())); -// connect(mTransparentDrawingView, SIGNAL(shown()), this, SLOT(showKeyboard())); -#else -// mKeyboardPalette = UBKeyboardPalette::create(mTransparentDrawingView); -// mKeyboardPalette->setParent(mTransparentDrawingView); -#endif connect( UBApplication::boardController->paletteManager()->mKeyboardPalette, SIGNAL(keyboardActivated(bool)), mTransparentDrawingView, SLOT(virtualKeyboardActivated(bool))); -// connect(UBApplication::mainWindow->actionVirtualKeyboard, SIGNAL(triggered(bool)), -// mTransparentDrawingView, SLOT(virtualKeyboardActivated(bool))); - #ifdef Q_WS_X11 connect(UBApplication::boardController->paletteManager()->mKeyboardPalette, SIGNAL(moved(QPoint)), this, SLOT(refreshMask())); connect(UBApplication::mainWindow->actionVirtualKeyboard, SIGNAL(triggered(bool)), this, SLOT(refreshMask())); @@ -123,8 +107,6 @@ UBDesktopAnnotationController::UBDesktopAnnotationController(QObject *parent) connect(mDesktopPalette, SIGNAL(screenClick()), this, SLOT(screenCapture())); connect(mDesktopPalette, SIGNAL(maximized()), this, SLOT(onDesktopPaletteMaximized())); connect(mDesktopPalette, SIGNAL(minimizeStart(eMinimizedLocation)), this, SLOT(onDesktopPaletteMinimize())); -// connect(UBApplication::mainWindow->actionVirtualKeyboard, SIGNAL(triggered(bool)), this, SLOT(showKeyboard(bool))); - connect(mTransparentDrawingView, SIGNAL(resized(QResizeEvent*)), this, SLOT(onTransparentWidgetResized())); diff --git a/src/frameworks/UBPlatformUtils.h b/src/frameworks/UBPlatformUtils.h index 74d97dce..a4d6d886 100644 --- a/src/frameworks/UBPlatformUtils.h +++ b/src/frameworks/UBPlatformUtils.h @@ -103,7 +103,7 @@ class UBPlatformUtils static void setFileType(const QString &filePath, unsigned long fileType); static void fadeDisplayOut(); static void fadeDisplayIn(); - static QString preferredTranslation(); + static QString preferredTranslation(QString pFilePrefix); static QString preferredLanguage(); static bool hasVirtualKeyboard(); //static void showVirtualKeyboard(); diff --git a/src/frameworks/UBPlatformUtils_linux.cpp b/src/frameworks/UBPlatformUtils_linux.cpp index 3c18ce93..174e3694 100644 --- a/src/frameworks/UBPlatformUtils_linux.cpp +++ b/src/frameworks/UBPlatformUtils_linux.cpp @@ -55,9 +55,9 @@ void UBPlatformUtils::fadeDisplayIn() // NOOP } -QString UBPlatformUtils::preferredTranslation() +QString UBPlatformUtils::preferredTranslation(QString pFilePrefix) { - QString qmPath = applicationResourcesDirectory() + "/" + "i18n" + "/" + QString("sankore_") + preferredLanguage() + ".qm"; + QString qmPath = applicationResourcesDirectory() + "/" + "i18n" + "/" + pFilePrefix + preferredLanguage() + ".qm"; return qmPath; } diff --git a/src/frameworks/UBPlatformUtils_mac.mm b/src/frameworks/UBPlatformUtils_mac.mm index 5d935031..5e1933ed 100644 --- a/src/frameworks/UBPlatformUtils_mac.mm +++ b/src/frameworks/UBPlatformUtils_mac.mm @@ -182,7 +182,7 @@ void UBPlatformUtils::fadeDisplayIn() } } -QString UBPlatformUtils::preferredTranslation() +QString UBPlatformUtils::preferredTranslation(QString pFilePrefix) { QString qmPath; @@ -202,7 +202,7 @@ QString UBPlatformUtils::preferredTranslation() QString UBPlatformUtils::preferredLanguage() { - QFileInfo qmFileInfo = QFileInfo(preferredTranslation()); + QFileInfo qmFileInfo = QFileInfo(applicationPreferredTranslation()); QDir lprojPath = qmFileInfo.dir(); QFileInfo lprojFileInfo = QFileInfo(lprojPath.absolutePath()); return lprojFileInfo.baseName(); diff --git a/src/frameworks/UBPlatformUtils_win.cpp b/src/frameworks/UBPlatformUtils_win.cpp index c60f0fc731fe13af737d07f63d9c77526f0e92d8..04f094209c2dad704f033e4748e505dbc9a98080 100644 GIT binary patch literal 11887 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 Oh}vRx!B0rvpZOJ%x}gn10!e_eWB-{v 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 Mwx?gF^ku~V1rh}tSO5S3