Σελίδα 1 από 1

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

Δημοσιεύτηκε: Κυρ Ιαν 26, 2014 09:10 am
από dglent
Το 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 αρχεία εμφανίζει απευθείας τον διάλογο «Αποθήκευση σε»

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

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

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

Δημοσιεύτηκε: Σάβ Νοέμ 25, 2017 11:01 am
από nikos_k
Εναλλακτικά, κάποιος μπορείς να δημιουργήσει σενάρια εντολών, τα οποία θα λειτουργούν ανεξάρτητα από το Λοκαλάιζ.
Αυτά θα μετατρέπουν τα αρχεία, που δημιουργεί το Λοκαλάιζ, στην επιθυμητή μορφή.

Έχω δημιουργήσεις δύο.
Το « 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: το ίδιο πράμα, με χίλιους διαφορετικούς τρόπους.

^