Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Dynamische Sprachumschaltung bei QDockWidgets

Dynamische Sprachumschaltung bei QDockWidgets

Scheduled Pinned Locked Moved Unsolved German
2 Posts 2 Posters 1.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • KampiK Offline
    KampiK Offline
    Kampi
    wrote on last edited by Kampi
    #1

    Hallo zusammen,

    ich habe eine dynamische Sprachumschaltung in mein Programm integriert und die scheint auch soweit korrekt zu funktionieren. Allerdings werden die Texte von dynamisch erzeugten QDockWidgets nicht geändert.
    Mein Programm erzeugt drei Tabs und füllt diese mit drei Widgets, welche hauptsächlich aus Labeln bestehen:

    QDockWidget* item = addTab( widget1, tr("Tab 1") );
    QDockWidget* item2 = addTab( widget2, tr("Tab 2") );
    QDockWidget* item3 = addTab( widget3, tr("Tab 3") );
    
    this->tabifyDockWidget(item, item2);
    this->tabifyDockWidget(item2, item3);
    
    QDockWidget* MainWindow::addTab( QWidget* widget, QString s_title )
    {
        QDockWidget *item = new QDockWidget( s_title, this );
        item->setWidget( widget );
        addDockWidget( Qt::LeftDockWidgetArea, item );
    
        return item;
    }
    

    Nun habe ich nach dem Beispiel (Link) eine dynamische Sprachumschaltung eingebaut.

    void MainWindow::createLanguageMenu( void )
    {
        QComboBox* languageComboBox = new QComboBox();
    
        QString defaultLocale = QLocale::system().name().replace( "_", "-" );
    
        _m_langPath = QApplication::applicationDirPath();
        _m_langPath.append( _languageDir );
        QDir dir( _m_langPath );
        QStringList fileNames = dir.entryList( QStringList( "translation_*.qm" ) );
    
        for ( int i = 0; i < fileNames.size(); ++i )
        {
            QString locale;
            locale = fileNames[ i ];
            locale.truncate( locale.lastIndexOf( '.' ) );
            locale.remove( 0, locale.indexOf('_') + 1 );
    
            QString lang = QLocale::languageToString( QLocale( locale ).language() );
    
            languageComboBox->insertItem ( i, lang, locale );
            languageComboBox->setItemIcon( i, QPixmap(":/ressources/icons" + _languageDir + lang + ".png") );
        }
    
        languageComboBox->setCurrentIndex( languageComboBox->findData( defaultLocale ) );
    
        connect(languageComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( languageComboBoxSelectionChange( int ) ) );
    
        this->ui->statusBar->addPermanentWidget( languageComboBox );
    }
    
    
    void MainWindow::changeTranslator( QTranslator& translator, const QString& filename )
    {
        qApp->removeTranslator( &translator );
    
        if( translator.load( QCoreApplication::applicationDirPath() + _languageDir + filename ) )
        {
            qApp->installTranslator( &translator );
        }
    }
    
    void MainWindow::loadLanguage( const QString& s_locale )
    {
        if( _m_currLang != s_locale )
        {
            _m_currLang = s_locale;
    
            // Change the current locale
            QLocale locale = QLocale( _m_currLang );
            QLocale::setDefault( s_locale );
    
            QString languageName = QLocale::languageToString( locale.language() );
            changeTranslator( _m_translator, QString( "translation_%1.qm" ).arg( s_locale ) );
            ui->statusBar->showMessage( tr( "Sprache geändert zu: %1" ).arg( languageName) );
        }
    }
    
    void MainWindow::languageComboBoxSelectionChange( int index )
    {
        QComboBox* p_ComboBox = qobject_cast< QComboBox* >( sender() );
    
        // Get the locale from combobox and call translation
        loadLanguage( p_ComboBox->itemData( index ).toString() );
    }
    
    void MainWindow::changeEvent( QEvent* event )
    {
        if( 0 != event  )
        {
            // Switch all Events
            switch( event->type() )
            {
                // This event is triggered if a translator is loaded
                case QEvent::LanguageChange:
                {
                    ui->retranslateUi( this );
                    break;
                }
    
                 // This event is triggered if the system, language changes
                case QEvent::LocaleChange:
                {
                    QString locale = QLocale::system().name();
                    locale.truncate( locale.lastIndexOf( '_' ) );
                    loadLanguage( locale );
                    break;
                }
            }
        }
    
        QMainWindow::changeEvent( event );
    }
    

    Wenn ich die Sprache nun ändere, erhalte ich eine sprachabhängige Nachricht in meiner Statusbar, aber in meinen Tabs wird die Sprache nicht geändert.
    Wo steckt der Fehler, bzw. was habe ich falsch gemacht?

    Danke für die Hilfe!

    K 1 Reply Last reply
    0
    • KampiK Kampi

      Hallo zusammen,

      ich habe eine dynamische Sprachumschaltung in mein Programm integriert und die scheint auch soweit korrekt zu funktionieren. Allerdings werden die Texte von dynamisch erzeugten QDockWidgets nicht geändert.
      Mein Programm erzeugt drei Tabs und füllt diese mit drei Widgets, welche hauptsächlich aus Labeln bestehen:

      QDockWidget* item = addTab( widget1, tr("Tab 1") );
      QDockWidget* item2 = addTab( widget2, tr("Tab 2") );
      QDockWidget* item3 = addTab( widget3, tr("Tab 3") );
      
      this->tabifyDockWidget(item, item2);
      this->tabifyDockWidget(item2, item3);
      
      QDockWidget* MainWindow::addTab( QWidget* widget, QString s_title )
      {
          QDockWidget *item = new QDockWidget( s_title, this );
          item->setWidget( widget );
          addDockWidget( Qt::LeftDockWidgetArea, item );
      
          return item;
      }
      

      Nun habe ich nach dem Beispiel (Link) eine dynamische Sprachumschaltung eingebaut.

      void MainWindow::createLanguageMenu( void )
      {
          QComboBox* languageComboBox = new QComboBox();
      
          QString defaultLocale = QLocale::system().name().replace( "_", "-" );
      
          _m_langPath = QApplication::applicationDirPath();
          _m_langPath.append( _languageDir );
          QDir dir( _m_langPath );
          QStringList fileNames = dir.entryList( QStringList( "translation_*.qm" ) );
      
          for ( int i = 0; i < fileNames.size(); ++i )
          {
              QString locale;
              locale = fileNames[ i ];
              locale.truncate( locale.lastIndexOf( '.' ) );
              locale.remove( 0, locale.indexOf('_') + 1 );
      
              QString lang = QLocale::languageToString( QLocale( locale ).language() );
      
              languageComboBox->insertItem ( i, lang, locale );
              languageComboBox->setItemIcon( i, QPixmap(":/ressources/icons" + _languageDir + lang + ".png") );
          }
      
          languageComboBox->setCurrentIndex( languageComboBox->findData( defaultLocale ) );
      
          connect(languageComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( languageComboBoxSelectionChange( int ) ) );
      
          this->ui->statusBar->addPermanentWidget( languageComboBox );
      }
      
      
      void MainWindow::changeTranslator( QTranslator& translator, const QString& filename )
      {
          qApp->removeTranslator( &translator );
      
          if( translator.load( QCoreApplication::applicationDirPath() + _languageDir + filename ) )
          {
              qApp->installTranslator( &translator );
          }
      }
      
      void MainWindow::loadLanguage( const QString& s_locale )
      {
          if( _m_currLang != s_locale )
          {
              _m_currLang = s_locale;
      
              // Change the current locale
              QLocale locale = QLocale( _m_currLang );
              QLocale::setDefault( s_locale );
      
              QString languageName = QLocale::languageToString( locale.language() );
              changeTranslator( _m_translator, QString( "translation_%1.qm" ).arg( s_locale ) );
              ui->statusBar->showMessage( tr( "Sprache geändert zu: %1" ).arg( languageName) );
          }
      }
      
      void MainWindow::languageComboBoxSelectionChange( int index )
      {
          QComboBox* p_ComboBox = qobject_cast< QComboBox* >( sender() );
      
          // Get the locale from combobox and call translation
          loadLanguage( p_ComboBox->itemData( index ).toString() );
      }
      
      void MainWindow::changeEvent( QEvent* event )
      {
          if( 0 != event  )
          {
              // Switch all Events
              switch( event->type() )
              {
                  // This event is triggered if a translator is loaded
                  case QEvent::LanguageChange:
                  {
                      ui->retranslateUi( this );
                      break;
                  }
      
                   // This event is triggered if the system, language changes
                  case QEvent::LocaleChange:
                  {
                      QString locale = QLocale::system().name();
                      locale.truncate( locale.lastIndexOf( '_' ) );
                      loadLanguage( locale );
                      break;
                  }
              }
          }
      
          QMainWindow::changeEvent( event );
      }
      

      Wenn ich die Sprache nun ändere, erhalte ich eine sprachabhängige Nachricht in meiner Statusbar, aber in meinen Tabs wird die Sprache nicht geändert.
      Wo steckt der Fehler, bzw. was habe ich falsch gemacht?

      Danke für die Hilfe!

      K Offline
      K Offline
      Kamajii
      wrote on last edited by
      #2

      Die Widgets widget1 .. widget3, die du in die Tabs setzt - haben die einen parent?
      QDockWidget::setWidget() setzt den parent m.W.n. nicht automatisch, und ohne Parent erhalten die Widgets auch keine Events.
      Außerdem musst du in den Widgets selbst natürlich auch eine Art retranslateUi() implementieren und die dort aus dem event()-Handler heraus aufrufen, wenn das LocaleChange-Event eintrifft.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved