[vlc-commits] [Git][videolan/vlc][master] 2 commits: qt: add plural support for QML qsTr

Steve Lhomme (@robUx4) gitlab at videolan.org
Sun Mar 15 05:40:53 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
7b50365f by Leon Vitanos at 2026-03-15T04:32:48+00:00
qt: add plural support for QML qsTr

- - - - -
1ea9975c by Leon Vitanos at 2026-03-15T04:32:48+00:00
qml: use plural qsTr for track and playlist labels

- - - - -


10 changed files:

- modules/gui/qt/medialibrary/qml/ArtistTopBanner.qml
- modules/gui/qt/medialibrary/qml/MusicAlbumSectionDelegate.qml
- modules/gui/qt/medialibrary/qml/MusicAlbumsGridExpandDelegate.qml
- modules/gui/qt/medialibrary/qml/MusicAllArtists.qml
- modules/gui/qt/medialibrary/qml/MusicGenres.qml
- modules/gui/qt/medialibrary/qml/PlaylistMediaList.qml
- modules/gui/qt/qt.cpp
- modules/gui/qt/widgets/qml/DragItem.qml
- modules/gui/qt/widgets/qml/TableColumns.qml
- po/Makevars


Changes:

=====================================
modules/gui/qt/medialibrary/qml/ArtistTopBanner.qml
=====================================
@@ -212,7 +212,7 @@ FocusScope {
 
                 Layout.topMargin: VLCStyle.margin_xxxsmall
 
-                text: qsTr("%1 Songs").arg(artist.nb_tracks)
+                text: qsTr("%1 Song", "%1 Songs", Number(artist.nb_tracks)).arg(artist.nb_tracks)
                 color: theme.fg.secondary
             }
 


=====================================
modules/gui/qt/medialibrary/qml/MusicAlbumSectionDelegate.qml
=====================================
@@ -189,7 +189,7 @@ T.Pane {
                 parts.push(year)
 
             const count = _albumData.nb_tracks ?? 0
-            parts.push(qsTr("%1 track(s)").arg(count))
+            parts.push(qsTr("%1 track", "%1 tracks", count).arg(count))
 
             const duration = _albumData.duration?.formatHMS()
             if (duration)


=====================================
modules/gui/qt/medialibrary/qml/MusicAlbumsGridExpandDelegate.qml
=====================================
@@ -68,10 +68,7 @@ FocusScope {
     function _getStringTrack() {
         const count = model?.nb_tracks ?? 0;
 
-        if (count < 2)
-            return qsTr("%1 track").arg(count);
-        else
-            return qsTr("%1 tracks").arg(count);
+        return qsTr("%1 track", "%1 tracks", count).arg(count);
     }
 
     readonly property ColorContext colorContext: ColorContext {


=====================================
modules/gui/qt/medialibrary/qml/MusicAllArtists.qml
=====================================
@@ -141,7 +141,7 @@ MainViewLoader {
                 fallbackImage: VLCStyle.noArtArtistSmall
 
                 title: model.name || qsTr("Unknown artist")
-                subtitle: model.nb_tracks > 1 ? qsTr("%1 songs").arg(model.nb_tracks) : qsTr("%1 song").arg(model.nb_tracks)
+                subtitle: qsTr("%1 song", "%1 songs", model.nb_tracks).arg(model.nb_tracks)
                 titleTopMargin: artistGrid.titleTopMargin
                 playIconSize: VLCStyle.play_cover_small
                 textAlignHCenter: true


=====================================
modules/gui/qt/medialibrary/qml/MusicGenres.qml
=====================================
@@ -201,7 +201,7 @@ MainViewLoader {
 
                         Widgets.CaptionLabel {
                             width: overlay.width
-                            text: model.nb_tracks > 1 ? qsTr("%1 Tracks").arg(model.nb_tracks) : qsTr("%1 Track").arg(model.nb_tracks)
+                            text: qsTr("%1 Track", "%1 Tracks", model.nb_tracks).arg(model.nb_tracks)
                             opacity: .7
                             color: "white"
                             horizontalAlignment: Text.AlignHCenter


=====================================
modules/gui/qt/medialibrary/qml/PlaylistMediaList.qml
=====================================
@@ -202,8 +202,10 @@ MainViewLoader {
                 items.push(root.model.data(i, MLPlaylistListModel.PLAYLIST_ID))
             }
             console.assert(items.length > 0)
-            if (DialogsProvider.questionDialog(qsTr("Do you really want to delete the selected playlist(s)?"),
-                                               qsTr("Delete playlist(s)")))
+            if (DialogsProvider.questionDialog(qsTr("Do you really want to delete the selected playlist?",
+                                                    "Do you really want to delete the selected playlists?",
+                                                    items.length),
+                                               qsTr("Delete playlist", "Delete playlists", items.length)))
                 root.model.deletePlaylists(items)
         } else {
             console.warn(root, ": Nothing to delete")
@@ -325,8 +327,7 @@ MainViewLoader {
                 title: (model.name) ? model.name
                                     : qsTr("Unknown title")
 
-                labels: (model.count > 1) ? [ qsTr("%1 Tracks").arg(_getCount(model)) ]
-                                          : [ qsTr("%1 Track") .arg(_getCount(model)) ]
+                labels: [ qsTr("%1 Track", "%1 Tracks", _getCount(model)).arg(_getCount(model)) ]
 
                 dragItem: dragItemPlaylist
 


=====================================
modules/gui/qt/qt.cpp
=====================================
@@ -533,9 +533,10 @@ public:
                       int n = -1) const override
     {
         Q_UNUSED(context);
-        Q_UNUSED(disambiguation);
-        Q_UNUSED(n);
-        const char* const text = vlc_gettext(sourceText);
+
+        const char* text = (n >= 0 && disambiguation != nullptr) ? vlc_ngettext(sourceText, disambiguation, n)
+                                                                 : vlc_gettext(sourceText);
+
         assert(text);
         return QString::fromUtf8(text);
     }


=====================================
modules/gui/qt/widgets/qml/DragItem.qml
=====================================
@@ -625,9 +625,10 @@ Item {
             const data = dragItem._data[0]
             const title = data?.title
             if (dragItem._indexesSize === 1) {
-                const extra = (data?.nb_tracks > 0) ? qsTr("\n%1 track(s)").arg(data.nb_tracks)
-                                                    : ((data?.count > 0) ? qsTr("\n%1 item(s)").arg(data.count)
-                                                                         : "")
+                const extra = data?.nb_tracks > 0 ? "\n" + qsTr("%1 track", "%1 tracks", data?.nb_tracks).arg(data?.nb_tracks) :
+                                                    data?.count > 0 ? "\n" + qsTr("%1 item", "%1 items", data?.count).arg(data?.count) :
+                                                                      ""
+
                 if (title && title.length > 0) {
                     return title + extra
                 } else {


=====================================
modules/gui/qt/widgets/qml/TableColumns.qml
=====================================
@@ -81,7 +81,7 @@ Item {
                 string += value.formatShort()
             } else if (criteria === "nb_tracks") {
 
-                string += qsTr("%1 tracks").arg(value)
+                string += qsTr("%1 track", "%1 tracks", value).arg(value)
             } else {
                 string += value
             }


=====================================
po/Makevars
=====================================
@@ -10,7 +10,7 @@ subdir = po
 top_builddir = ..
 
 # These options get passed to xgettext.
-XGETTEXT_OPTIONS = --directory=.. --keyword=_ --keyword=N_ --keyword=_NS --keyword=qtr --keyword=qsTr --keyword=Q_ --language=C++ --keyword=vlc_ngettext:1,2 --keyword=vlc_pgettext:1c,2 --keyword=_PNS:1c,2 --add-comments=xgettext: --from-code=UTF-8
+XGETTEXT_OPTIONS = --directory=.. --keyword=_ --keyword=N_ --keyword=_NS --keyword=qtr --keyword=qsTr:1,1t --keyword=qsTr:1,2,3t --keyword=Q_ --language=C++ --keyword=vlc_ngettext:1,2 --keyword=vlc_pgettext:1c,2 --keyword=_PNS:1c,2 --add-comments=xgettext: --from-code=UTF-8
 
 # This is the copyright holder that gets inserted into the header of the
 # $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c78ab119ae03152cf43b5a512f7076a566f98fa0...1ea9975ccca1f7872aac40d2b1cd1ca00ce6cd94

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/c78ab119ae03152cf43b5a512f7076a566f98fa0...1ea9975ccca1f7872aac40d2b1cd1ca00ce6cd94
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list