2017-09-06 3 views
1

Bei Verwendung des Tools xgettext ist es möglich, Kommentaren automatisch hinzuzufügen, um den Übersetzern bei der Suche nach Eigennamen zu helfen (z. B. documented).Wie bestimmten Kontext zuweisen - Schlüsselwort für Eigenname?

Die Dokumentation schlägt vor, die folgenden in der Befehlszeile hinzuzufügen:

--keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."' 

, die in Eigennamen führt zu der .pot Datei wie folgt extrahiert werden:

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgid "Bob" 
msgstr "" 

Das Problem dabei; ist, dass kein bestimmter Kontext für diese Zeichenfolge definiert wurde. Hier ist ideal, wie der richtige Name würde extrahiert:

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgctxt "Proper Name" 
msgid "Bob" 
msgstr "" 

Ich habe versucht, die folgenden aber ohne Erfolg:

# Hoping that 0 would be the function name 'proper_name'. 
--keyword='proper_name:0c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that -1 would be the function name 'proper_name'. 
--keyword='proper_name:-1c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that the string would be used as the context. 
--keyword='proper_name:"Proper Name"c,1,"This is a proper name. See the gettext manual, section Names."' 

# Hoping that the string would be used as the context. 
--keyword='proper_name:c"Proper Name",1,"This is a proper name. See the gettext manual, section Names."' 

Gibt es eine Möglichkeit, eine bestimmte msgctxt zu zwingen, für alle zu verwende Zeichenketten extrahiert mit einem Schlüsselwort (wie proper_name aus dem obigen Beispiel)?

Wenn es keine Möglichkeit dies mit xgettext zu erreichen, wie sie ist dann dachte ich vielleicht mit dem folgenden:

--keyword='proper_name:1,"<PROPERNAME>"' 

mit Resultierende:

#. <PROPERNAME> 
#: ../Foo.cpp:18 
msgid "Bob" 
msgstr "" 

Das Problem dann wird; wie man automatisch alle Vorkommen dieser in der resultierenden .pot-Datei in das folgende übersetzen:

#. This is a proper name. See the gettext manual, section Names. 
#: ../Foo.cpp:18 
msgctxt "Proper Name" 
msgid "Bob" 
msgstr "" 

Antwort

1

Wenn Sie eine Nachricht Kontext extrahieren möchten, muss es Teil der Argumentliste sein. Und der numerische Teil in "Nc" muss eine positive ganze Zahl sein. Alle deine Versuche mit 0, -1 sind fruchtlos, sorry.

Die Signatur Ihrer Funktion muss wie folgt aussehen:

#define PROPER_NAME "Proper Name" 
const char *proper_name(const char *ctx, const char *name); 

Und es dann so nennen:

proper_name(PROPER_NAME, "Bob"); 

Die PROPER_NAME ganzen Code wiederholt, aber es ist der einzige Weg, um es in den Nachrichtenkontext.

Vielleicht Datei eine Feature-Anfrage?

Es gibt auch einen Hack, der dasselbe erreicht, ohne den Quellcode zu ändern. Ich gehe davon aus, dass Sie C und das Standard-Makefile verwenden (aber Sie können auch in anderen Sprachen das gleiche tun):

Kopieren Sie die Datei POTFILES-POTFILES-proper-names und eine Linie ./proper_names.pot zu POTFILES.in hinzuzufügen.

Dann müssen Sie proper_names.pot erstellen:

xgettext --files-from=POTFILES-proper-names \ 
     --keyword='' \ 
     --keyword='proper_names:1:"Your comment ..."' \ 
     --output=proper_names.pox 

Dies wird nun nur die Einträge enthalten, die mit "proper_names()" maked wurden. Fügen Sie jetzt den Kontext hinzu:

msg-add-content proper_names.pox "Proper Name" >proper_names.pot 
rm proper_names.pot 

Leider gibt es kein Programm namens "msg-add-content". Greifen Sie einen der Zillion Po-Parser heraus, und schreiben Sie einen selbst (oder nehmen Sie meinen am Ende dieses Beitrags).

Jetzt aktualisieren Sie Ihre PACKAGE.pot wie üblich. Da "proper_names.pox" eine Eingabedatei für den Haupt-xgettext-Lauf ist, werden alle Ihre extrahierten Eigennamen mit dem hinzugefügten Kontext zu Ihrer Pot-Datei hinzugefügt (und ihr Kontext wird verwendet).

Short von einem anderen Skript einen Nachrichtenkontext auf alle Ihre Einträge in einer POT-Datei, diese verwenden Sie eine für das Hinzufügen von:

#! /usr/bin/env perl 

use strict; 

use Locale::PO; 

die "usage: $0 POFILE CONTEXT" unless @ARGV == 2; 

my ($input, $context) = @ARGV; 

my $entries = Locale::PO->load_file_asarray($input) or die "$input: failure"; 
foreach my $entry (@$entries) { 
    $entry->msgctxt($context) unless '""' eq $entry->msgid; 
    print $entry->dump; 
} 

Sie müssen installieren Sie die Perl-Bibliothek „Locale :: PO“ für sie, Entweder mit "sudo cpan installiere Locale :: PO" oder benutze die vorgefertigte Version, die dein Vendor vielleicht hat.

Verwandte Themen