Εξαγωγή mo και qm από το Lokalize

Μετάφραση της Mageia, του γραφικού περιβάλλοντος, των εφαρμογών και όχι μόνο
Απάντηση
Άβαταρ μέλους
dglent
Δημοσιεύσεις: 1069
Εγγραφή: Τετ Ιουν 01, 2011 05:42 am
Τοποθεσία: Γαλλία
Has thanked: 6 φορές

Εξαγωγή mo και qm από το Lokalize

Δημοσίευση από dglent » Κυρ Ιαν 26, 2014 09:10 am

Το Lokalize δεν διαθέτει ενσωματωμένη λειτουργία εξαγωγής mo αρχείων από το po που μεταφράζουμε.
Υποστήρίζει όμως kross scripting (χρειάζεται το kross-interpreters-python να είναι εγκατεστημένο)

Με το kross scripting μπορεί ένας κοινός θνητός να γράψει πρόσθετα για την εφαρμογή

Για την εξαγωγή των mo υπάρχει αυτό:
msgfmt.py από εδώ:
http://websvn.kde.org/trunk/l10n-kde4/scripts/lokalize/

Βήματα:
Θα πρέπει στον φάκελο με το έργο που μεταφράζουμε πχ για το KDE έχω αυτό:
/home/dglent/kde-l10n

Εικόνα

να δημιουργήσουμε έναν φάκελο με το όνομα lokalize-scripts

Κώδικας: Επιλογή όλων

[dglent@localhost kde-l10n]$ ls
kde.lokalize  lokalize-scripts/  main.lqa  stable/  terms.tbx  trunk/
Στη συνέχεια αντιγράφουμε το msgfmt.py και το msgfmt.rc από εδώ:
http://websvn.kde.org/trunk/l10n-kde4/scripts/lokalize/
στον φάκελο lokalize-scripts

Εκκινούμε το Lokalize και όταν φορτώνουμε ένα έργο (στη δική μου περίπτωση έχω το έργο KDE πάντα εξ ορισμού) το lokalize κοιτάζει στον φάκελο lokalize-scripts για scripts.
Θα βρεί λοιπόν το msgfmt.py και θα προσθέσει ένα μενού στο «Εργαλεία»: Compile Po

Εικόνα

Το συγκεκριμένο σκριπτ εξάγει το mo απευθείας στο ~/.kde4/share/locale/$lang/LC_MESSAGES/
Θέλωντας να έχω την ικανότητα να επιλέγω που θα γίνεται η εξαγωγή και να μπορώ να το κάνω και για ts αρχεία (αρχεία μεταφράσεων εφαρμογών qt)
τροποποίησα το script ως εξής:

Κώδικας: Επιλογή όλων

# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import Editor
import Project



def _init():
    global lang
    global package
    global currentFile
    global fileType
    currentFile = Editor.currentFile()
    fileType = currentFile[-2:]
    if not Editor.isValid() or currentFile == '': return
    lang = Project.targetLangCode()
    (path, pofilename) = os.path.split(Editor.currentFile())
    (package, ext) = os.path.splitext(pofilename)
    currentFile = Editor.currentFile()
    if fileType == 'po':
        complilerPresent = cmd_exists('msgfmt')
        if complilerPresent:
            actions()
        else:
            os.system('kdialog --sorry \
                "The command <msgfmt> is not available.\nYou need to install the gettext package"')
            return
    if fileType == 'ts':
        complilerPresent = cmd_exists('lrelease')
        if complilerPresent:
            saveAs()
        else:
            os.system('kdialog --sorry \
                "The command <lrelease> is not available.\nYou need to install the Qt4 development package"')
            return

def cmd_exists(cmd):
    return subprocess.call("type " + cmd, shell=True, \
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0

def doCompile():
    flag = False
    targetPath = variables()
    totalPath = targetPath+package+'.mo'
    if os.path.exists(totalPath):
        flag = True
        os.system('kdialog --title "The file exists!" --warningcontinuecancel "Do you want to overwrite the file?"; \
            ans=$`echo $?`; if [ "${ans:1}" -eq "0" ]; then msgfmt -o %s %s;fi' %(totalPath, currentFile))
    if not os.path.exists(targetPath):
        os.system('mkdir -p {0}'.format(targetPath))
    if not flag:
        os.system('msgfmt -o %s %s' %(totalPath, currentFile))

def saveAs():
    if fileType == 'po':
        ext = '.mo'
        compiler = 'msgfmt -o'
    if fileType == 'ts':
        ext = '.qm'
        compiler = 'lrelease -qm'
    home = os.getenv('HOME')
    output_path = home + '/' + package + ext
    cmd = ['kdialog', '--getsavefilename', output_path]
    binPath = subprocess.Popen( cmd, stdout=subprocess.PIPE ).communicate()[0]
    if binPath != '':
        binPath = binPath.rstrip()
        if os.path.exists(binPath):
            os.system('kdialog --title "The file exists!" --warningcontinuecancel "Do you want to overwrite the file?"; \
                ans=$`echo $?`; if [ "${ans:1}" -eq "0" ]; then %s %s %s;fi' %(compiler, binPath, currentFile))
        else:
            os.system('{0} {1} {2}'.format(compiler, binPath, currentFile))

def variables():
    cmd = ['kde4-config', '--localprefix']
    output = subprocess.Popen( cmd, stdout=subprocess.PIPE ).communicate()[0]
    output = output.rstrip()
    kde4path = output + 'share/locale/{0}/LC_MESSAGES/'.format(lang)
    return kde4path

def kdialogmenu():
    choice = ''
    kde4path = variables()
    string = 'Export {0}.mo to default path:\n{1}\nor choose a custom path:'.format(package,kde4path)
    try:
        choice = subprocess.check_output(['kdialog', '--combobox', string, '--default', \
            'Default path', 'Default path', 'Custom path'])
    except:
        pass
    if choice != '':
        choice = str(choice)
        choice = choice.rstrip()
    else:
        print('Canceled')
    return choice

def actions():
    choice = kdialogmenu()
    if choice == '': return
    if choice == 'Default path':
        doCompile()
    if choice == 'Custom path':
        saveAs()

_init()
Το οποίο εμφανίζει που θέλουμε να εξάγουμε το mo/qm αρχείο:
Εικόνα

Για τα qm αρχεία εμφανίζει απευθείας τον διάλογο «Αποθήκευση σε»

Άβαταρ μέλους
dglent
Δημοσιεύσεις: 1069
Εγγραφή: Τετ Ιουν 01, 2011 05:42 am
Τοποθεσία: Γαλλία
Has thanked: 6 φορές

Re: Εξαγωγή mo και qm από το Lokalize

Δημοσίευση από dglent » Τετ Ιαν 29, 2014 07:29 am

Τα δυο αυτά αρχεία, δεν χρειάζεται να τα βάλουμε στον φάκελο lokalize-scripts αν τα θέλουμε για όλα τα έργα.
Μπορούμε τα να αντιγράψουμε στον φάκελο :
/home/ΧΡΗΣΤΗΣ/.kde4/share/apps/lokalize/scripts
για τον εκάστοτε χρήστη, ή στο /usr/share/apps/lokalize/scripts για να είναι διαθέσιμα σε όλους τους χρήστες

Άβαταρ μέλους
nikos_k
Δημοσιεύσεις: 299
Εγγραφή: Τετ Ιουν 01, 2011 06:05 am
Been thanked: 2 φορές

Re: Εξαγωγή mo και qm από το Lokalize

Δημοσίευση από nikos_k » Σάβ Νοέμ 25, 2017 11:01 am

Εναλλακτικά, κάποιος μπορείς να δημιουργήσει σενάρια εντολών, τα οποία θα λειτουργούν ανεξάρτητα από το Λοκαλάιζ.
Αυτά θα μετατρέπουν τα αρχεία, που δημιουργεί το Λοκαλάιζ, στην επιθυμητή μορφή.

Έχω δημιουργήσεις δύο.
Το « lrelease » για αρχεία .ts και .qm · για μεταφράσεις Qt, δηλαδή.
Και το « msgfmt », για αρχεία .po και .mo. Δηλαδή, για μεταφράσεις gettext (gtk, κλπ).

Το lrelease :

Κώδικας: Επιλογή όλων

#!/bin/bash

xterm -sb -geometry 188x36 -fg white -bg black -hold -e  lrelease  *.ts
Το msgfmt :

Κώδικας: Επιλογή όλων

#!/bin/bash

xterm -sb -geometry 188x36 -fg white -bg black -hold -e  msgfmt el.po -v -o el.mo
Επεξήγηση:
  • Κώδικας: Επιλογή όλων

    xterm
    Θα ανοίξει μία κονσόλα του xterm.
  • Κώδικας: Επιλογή όλων

    -sb -geometry 188x36 -fg white -bg black
    Οι επιλογές εμφάνισης της κονσόλας.
  • Κώδικας: Επιλογή όλων

    -hold
    Η κονσόλα δεν θα κλείσει, μετά το τέλος της εκτέλεσης του σενάριου.
  • Κώδικας: Επιλογή όλων

    -e
    Θα εκτελεστούν τα ακόλουθα.
  • Κώδικας: Επιλογή όλων

    lrelease  *.ts
    Από τα αρχεία .ts, που θα βρει στο φάκελο, θα δημιουργήσει τα αρχεία .qm,
    κρατώντας το ίδιο όνομα.
  • Κώδικας: Επιλογή όλων

    msgfmt el.po -v -o el.mo
    Από το αρχείο el.po, θα δημιουργήσει το el.mo .
    Ααα, και το msgfmt θα είναι φλύαρο για ό,τι κάνει.
-

Αυτά τα σενάρια είναι απλά αρχεία κειμένου, τα οποία τα κάνεις εκτελέσιμα,
και τα αντιγράφεις στον ίδιο κατάλογο με τα αρχεία της μετάφρασης.

Παράδειγμα κατάλογου με το lrelease :

Κώδικας: Επιλογή όλων

├── [drwxr-xr-x]  avidemux_qt
│   ├── [-rw-r--r--]  avidemux_el.qm
│   ├── [-rwxr--r--]  avidemux_el.ts
│   ├── [-rwxr-xr-x]  lrelease
Παράδειγμα κατάλογου με το msgfmt :

Κώδικας: Επιλογή όλων

├── [drwxr-xr-x]  warzone2100
│   ├── [-rw-r--r--]  el.mo
│   ├── [-rw-r--r--]  el.po
│   ├── [-rwxr-xr-x]  msgfmt
-

Αφού τελειώνω και αποθηκεύω την εργασία με το Λοκαλάιζ,
κλικάρω στο αρχείο.
Ο διαχειριστής αρχείων με ρωτάει αν θέλω να το εκτελέσω.
Τα εκτελώ, φυσικά.
Και, τέλος, το xterm μου εκτυπώνει την αναφορά της μετατροπής.

Παράδειγμα για το lrelease :

Κώδικας: Επιλογή όλων

Updating 'avidemux_el.qm'...
    Generated 2037 translation(s) (2037 finished and 0 unfinished)
    Ignored 1 untranslated source text(s)
Παράδειγμα για το msgfmt :

Κώδικας: Επιλογή όλων

2820 translated messages, 3 fuzzy translations, 38 untranslated messages.
-

Γιατί, αν περηφανεύονται για κάτι τα Λίνουξ,
είναι ότι μπορείς να κάνεις :geek: το ίδιο πράμα, με χίλιους διαφορετικούς τρόπους.

^

Απάντηση