Une traduction amateur d'histoires courtes visuelles, par rapport aux traductions d'autres jeux, a un certain nombre de fonctionnalités et implique de travailler avec beaucoup de texte. Peut-être que la grande majorité de tous les romans visuels ont été publiés en japonais, seuls quelques-uns ont été traduits en anglais (officiellement ou par des amateurs), et encore moins ont été traduits dans d'autres langues.
Par conséquent, lorsque vous travaillez avec la traduction, vous devez traiter avec des moteurs japonais, dont beaucoup ne sont pas très conviviaux pour les localisateurs. Pour cette raison, on se rend rapidement compte que la présence de compétences en traduction, la connaissance de la langue, un grand enthousiasme et du temps libre ne signifie pas que la version traduite du jeu verra bientôt le jour.
En gros, le processus de traduction de n'importe quel jeu (et pas seulement des nouvelles visuelles) implique:
- Déballage des ressources du jeu (si elles ne sont pas dans le domaine public)
- Traduction des pièces nécessaires
- Transfert emballage inverse
Cependant, dans le cas des nouvelles visuelles japonaises, cela ressemble généralement à ceci:
- Déballage des ressources du jeu
- Traduction de la partie texte du jeu (script du jeu)
- Traduction de la partie graphique du jeu
- Transfert emballage inverse
- Modification du moteur pour le faire fonctionner avec du contenu traduit
J'espère que notre expérience sera utile à quelqu'un.
En 2013 (et peut-être plus tôt), j'ai décidé de traduire du japonais le roman visuel Bishoujo Mangekyou-Norowareshi Densetsu no Shoujo- (美 少女 万 華 鏡 - 呪 わ れ し 伝 説 の 少女 -). J'avais déjà de l'expérience dans la traduction de jeux, mais auparavant je ne devais traduire que des nouvelles sur des moteurs relativement simples et bien connus comme
Kirikiri .
Ici, notre équipe de traducteurs a dû ouvrir le moteur de cette nouvelle, avant même que nous arrivions au texte lui-même.
Commençons par une description du fichier .exe, où les mots QLIE et IMOSURUME sont mentionnés. Le fichier lui-même contient la ligne FastMM Borland Edition 2004, 2005 Pierre le Riche, ce qui signifie que le moteur est très probablement écrit en Delphi.
Une recherche rapide sur Google révèle que Qlie est le nom du moteur de roman visuel publié par Warmth Entertainment. Apparemment, IMOSURUME est le nom interne du moteur de script et Qlie est le nom commercial. Il existe un site
qlie.net , qui répertorie les jeux sortis sur ce moteur et le site officiel de Warmth Entertainment.
Mais nulle part dans le domaine public, il n'y a ni outils officiels pour travailler avec le moteur, ni documentation pour celui-ci, ce qui est attendu.
Par conséquent, vous devez gérer le jeu vous-même, en vous appuyant sur des utilitaires non officiels. Pour commencer, vous devriez trouver toutes les parties du jeu qui doivent être traduites.
Les archives de jeu se trouvent dans les fichiers data0.pack, data1.pack et data7.pack dans le sous-dossier \ GameData. Les économiseurs d'écran se trouvent dans le dossier \ GameData \ Movie, mais vous pouvez toujours les laisser seuls.
L'éditeur hexadécimal montre qu'il n'y a pas d'en-têtes reconnaissables pour les archives du jeu .pack, mais à la fin du fichier, il y a un morceau similaire à la table des matières et à l'étiquette FilePackVer3.0
Heureusement, pour ce format, il existe déjà un déballeur et même pas un. Nous avons utilisé la console exfp3_v3 de asmodean.
Le déballage n'est pas aussi simple qu'il y paraît. Étant donné que le moteur prend en charge plusieurs formats d'archive (FilePackVer1.0, FilePackVer1.0, FilePackVer3.0), et dans ce cas, FilePackVer3.0 est utilisé, pour le décompactage correct, vous aurez également besoin d'un fichier de clé spécial key.fkey, qui a chiffré l'archive. Il se trouve dans le sous-dossier \ Dll
De plus, exfp3_v3 devrait clarifier l'archive de quel jeu il est en train de déballer.
Par conséquent, vous devez également spécifier le numéro de jeu dans la liste proposée par le décompresseur (les jeux de la série Bishoujo Mangekyou sont là sous le numéro 15), ou spécifier le fichier exécutable du jeu comme troisième paramètre du décompresseur.
Déjà après avoir déballé les fichiers du jeu, une pensée logique est apparue: comment à l'avenir comment remballer le jeu avec une traduction prête? Après tout, le déballeur ne prend pas en charge l'opération inverse.
À notre demande, w8m (merci beaucoup pour cela) a ajouté la possibilité de compresser les archives du jeu dans son programme arc_conv.exe. Il suffit de regrouper tous les fichiers modifiés dans une nouvelle archive (par exemple, data8.pack), de le placer dans le dossier GameData, et ils se lanceront automatiquement dans le jeu.
Retour aux ressources décompressées. Les fichiers de script de jeu de l'archive data0.pack se trouvent dans le sous-dossier \ scenario \ ks_01 \
Tous les fichiers de script avec l'extension .s sont encodés loin de l'encodage Shift Jis le plus pratique, et le moteur ne prend en charge aucun encodage Unicode. Les lignes de la traduction ressemblent approximativement à celles-ci:
【キリエ】 %1_kiri1478% 「へえ……分かっているじゃない」 私が献上したロシアンティーを見て、キリエは嬉しそうに目を細める。 ^cface,,赤目微笑01 【キリエ】 %1_kiri1479% 「日本人は、ジャムを紅茶に入れて飲むのが、ロシアンティーだと勘違いしている人が多いのだけれど……」
Vous remarquerez peut-être que chaque phrase en japonais est précédée du nom du héros entre parenthèses japonaises. (【】), Qui prononce cette phrase (dans le jeu elle s'affiche en haut de la fenêtre avec du texte). Ou, si ce sont les mots de l'auteur, le nom n'est pas ajouté.
Mais il reste des équipes de service.
Les commandes du moteur dans le script rappellent quelque peu le langage de balisage TeX, mais sont beaucoup plus intuitives et peu pratiques par rapport aux
commandes Kirikiri ou
RenPy .
En voici quelques uns:
@@@
est un triple chien. Souvent, les fichiers de script commencent par cette commande. Apparemment, le chargement des définitions à partir de fichiers tiers.
Par exemple:
@@@Library\Avg\header.s
@@
est un chien double. L'étiquette dans le fichier de script. Vous pourrez y accéder ultérieurement.
%1_kiri1478%
- lire le fichier vocal. Ces commandes sont insérées entre le nom du héros et le texte qui s'affiche à l'écran. "1_kiri1478" - dans ce cas, le nom du fichier du dossier \ voice \ du fichier data1.pack Il est intéressant que l'équipe utilise le pourcentage japonais (%), plutôt que le pourcentage habituel.
^savedate, ^saveroute, ^savescene,
- trois équipes les plus susceptibles d'être utilisées dans le système de sauvegarde du jeu et qui doivent saisir des informations sur le lieu et l'heure à laquelle le joueur a été enregistré dans la sauvegarde.
Par exemple:
^savedate,"現在" ^saveroute,"美少女万華鏡-1-" ^savescene,"呪われし伝説の少女 オープニング"
C'est-à-dire, date: présent, branche: Bishoujo Mangekyou -1-, scène: Norowareshi Densetsu no Shoujo Opening. Ces données auraient dû être affichées dans la fente de sauvegarde, mais apparemment, les développeurs ont décidé de l'abandonner. Par conséquent,
^saveroute
dans toutes les parties du script,
^savedate
change du "moment présent" en "rêves" et dans
^savescene
jours de jeu (ou plutôt les nuits) changent.
^facewindow,
- état de la zone de texte avec le texte affiché à l'écran. (Montré - 1 ou pas - 0)
^sload,
- jouez les sons du jeu depuis le dossier \ sound \ sur le canal correspondant.
sload,Env1,◆セミ01アブラゼミ
Jouer des cigales sur Env1
L'équipe a deux paramètres facultatifs, le premier est responsable de la boucle du son, et le second reste un mystère, mais il est rarement utilisé dans le jeu.
^sload,SE1,■クチュ音01,1
Lecture du son de bouclage sur le canal SE1.
^eeffect
- affiche un effet spécial sur l'écran pendant un certain nombre de secondes. Apparemment, il prend en charge la sortie séquentielle de plusieurs effets.
^eeffect,WhiteFlash
L'effet d'un flash blanc.
^ffade
- effet de transition lors du changement d'écran.
Il a tout un tas de paramètres supplémentaires, mais seuls quelques-uns sont vraiment utiles: le nom de l'effet de transition, une image supplémentaire, si nécessaire, et le temps d'achèvement de la transition.
^ffade,Overlap,,1000
Dissoudre une image dans une autre, en 1 seconde.
^iload
- charge l'image d'arrière-plan sur l'écran. L'image peut se voir attribuer un identifiant auquel se référer à l'avenir.
^iload,BG1,0_black.png
Fichier de sortie 0_black.png en arrière-plan avec l'ID BG1
^we
et
^wd
- activer et désactiver l'image dans la fenêtre.
^facewindow,1
et
^facewindow,0
Active et désactive l'image du héros dans la boîte de dialogue.
^mload
- lire de la musique sur un canal spécifique.
^mload,BGM1,nbgm13
Lecture de la piste nbgm13 sur le canal BGM1
Quelques-unes des équipes les plus importantes:
\jmp
- saute à l'étiquette avec le nom spécifié.
^select
- affiche une fenêtre de sélection sur l'écran où le joueur doit sélectionner l'une des options.
Par exemple:
^select, , \jmp,"@@route01a"+ResultBtnInt[0] @@route01a0
Ici, la transition sera effectuée après la réponse à la question et le numéro de réponse (0 ou 1) est renvoyé par ResultBtnInt [0]. Par conséquent,
\jmp
déplacera l'histoire vers le libellé @@ route01a + numéro de réponse. Autrement dit, @@ route01a0 ou @@ route01a1
Une caractéristique désagréable est que la virgule habituelle dans ces commandes sert de séparateur et ne peut pas être utilisée dans les options de réponse elles-mêmes. Les Japonais n'ont pas un tel problème, ils utilisent la virgule japonaise (、). Dans ce cas, nous pouvons remplacer la virgule par ‚(U + 201A SINGLE LOW-9 QUOTATION MARK).
Par exemple:
^select, ‚ , ‚
Les équipes restantes ne sont pas si importantes en première approximation.
Bien sûr, avant de traduire le script, vous devez le transcoder en quelque chose de plus pratique, par exemple en UTF-8, afin de combiner des caractères cyrilliques et japonais.
Après avoir changé le moteur (à propos de cette partie suivante), le jeu perçoit à la fois le texte russe et le japonais. Mais pour l'instant, pour des raisons de compatibilité, vous devez coder les caractères japonais dans Shift Jis et les caractères cyrilliques dans le codage cp1251.
Nous avons rapidement esquissé un programme en Python pour le transcodage en tenant compte de l'alphabet cyrillique:
UTF8 à cp1251 et ShiftJIS Cependant, il y a eu quelques problèmes. Le programme, en essayant de recoder le symbole «tilde» U (U + FF5E FULLWIDTH TILDE), a généré une erreur «UnicodeEncodeError: le codec« Shift Jis »ne peut pas coder le caractère« \ uff5e »en position 0: séquence multi-octets illégale»
Au début, j'ai péché sur Python, mais à la fin j'ai découvert une nuance plutôt inhabituelle. Il existe une ambiguïté entre les méthodes de corrélation des codages japonais Unicode et non Unicode selon l'implémentation spécifique.
Par conséquent, Windows associe le caractère Shift Jis au code 0x8160 avec l'unicode ~ (U + FF5E FULLWIDTH TILDE), et d'autres transcodeurs (par exemple, l'utilitaire iconv) corrèlent le même caractère avec 〜 (U + 301C WAVE DASH), selon le tableau de rapport Unicode officiel -
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFT JIS.TXTPour déterminer la correspondance entre les personnages, Microsoft a apparemment décidé d'utiliser les schémas de leur encodage cp932, qui est une version étendue de Shift Jis.
La même situation se produit avec le code de caractère 0x817C, qui est codé en UTF8 en tant que - (U + FF0D FULLWIDTH HYPHEN-MOINS) sous Windows, ou en tant que - (U + 2212 SIGNE MOINS) dans iconv.
Étant donné que tous les fichiers de script ont été convertis pour la première fois de Shift Jis en UTF8 à l'aide de Notepad ++ (et il utilise la table de correspondance adoptée dans Windows), lors de la reconversion d'UTF8 en Shift Jis via notre programme Python, l'erreur de conversion notoire est apparue.
Par conséquent, il était nécessaire de prendre en compte la survenue de conditions ~ et - distinctes.
Il y avait d'autres défauts mineurs - par exemple, les ellipses ... (U + 2026 ELLIPSIS HORIZONTAL) a été remplacé par les ellipses cyrilliques de cp1251, et non les japonais de Shift Jis.
Après avoir traduit le texte, vous pouvez continuer à travailler avec les graphiques du jeu.
Les fichiers graphiques du jeu sont dans les mêmes archives de pack, mais après le déballage, ils doivent encore travailler dur. Par exemple, presque toutes les images png sont décompressées sous forme de fichiers du type sample + DPNG000 + x32y0.png En d'autres termes, les images png sont découpées en bandes horizontales de 88 cm d'épaisseur et chaque bande est écrite dans un fichier séparé. Le nom du fichier indique le numéro de série de la bande (DPNG000 ... 009) et les coordonnées x, y.
Je me demande toujours pourquoi c'était nécessaire. Si pour la difficulté d'extraire des ressources du jeu, ce n'est clairement pas la meilleure méthode.
Pour coller les fichiers png coupés, un petit script merge_dpng sur Pearl d'Asmodeus, qui utilise ImageMagick, a été créé à un moment donné. Malheureusement, il a eu des problèmes avec lui. Tout d'abord, j'avais besoin de Pearl, que je n'ai pas utilisé, et même après l'avoir installé, il s'est avéré que le script ne fonctionnait pas correctement.
Pour cette raison, nous avons écrit un programme similaire en python:
Fusion de fichiers dpng du moteur Qlie Il semblerait que nous ayons maintenant l'ensemble des images qui apparaissent dans le jeu? Pas du tout - si vous regardez toutes les images connectées de toutes les archives, vous constaterez toujours que certaines sont manquantes, bien qu'elles soient dans le jeu. Le fait est qu'il existe un autre type de fichier dans le moteur - avec l'extension .b. C'est un peu une animation avec des images et des sons enregistrés à l'intérieur.
Il est assez facile d'obtenir les ressources stockées à l'intérieur, mais, hélas, aucun des décompresseurs de fichiers .b prêts à l'emploi n'a fonctionné dans notre cas comme il se doit. Soit certains fichiers sont restés décompressés, soit il y a eu des erreurs dues à des noms japonais, et je ne voulais pas démarrer à partir des paramètres régionaux japonais.
Ici encore, notre script a été utile. Depuis lors, nous ne connaissions pas quelque chose comme
Kaitai Struct , nous avons dû agir presque à partir de zéro.
Le format des fichiers .b s'est avéré être simple et, de plus, notre décompresseur devait pouvoir décompresser les ressources uniquement de ce jeu. Dans d'autres jeux sur le moteur Qlie, des types de ressources supplémentaires sont apparus dans les fichiers .b, mais nous ne nous attarderons pas sur eux en détail.
Alors, ouvrez n'importe quel fichier .b dans un éditeur hexadécimal et regardez au début. Avant d'évaluer, notez que l'ordre des octets de toutes les valeurs numériques sera Little-endian.
- En-tête de fichier ABMP12
- Dix octets 0x00
- Le titre de la première section abdata12 avec des informations supplémentaires.
- Huit octets 0x00
- Taille de section abdata12, entier de quatre octets. Vous pouvez le sauter en toute sécurité.
- En-tête de section Abimage10
- Sept octets 0x00
- Nombre de fichiers dans une section, entier sur un octet. Dans ce cas, il y a un fichier dans la section.
- En-tête de section abgimgdat13
- Six octets 0x00
- La longueur du nom de fichier à l'intérieur de la section, un entier sur deux octets. Dans ce cas, la longueur est de 4 octets.
- Nom de fichier encodé Shift Jis
- Longueur d'enregistrement de la somme de contrôle du fichier, entier sur deux octets.
- Somme de contrôle du fichier lui-même.
- L'octet inconnu semble toujours être 0x03 ou 0x02
- Douze octets inconnus, probablement liés à l'animation
- La taille du fichier png à l'intérieur de la section est un entier de quatre octets.
Et enfin, le fichier png lui-même.
La section absound est de structure similaire à abimage.
Le script devrait décompresser automatiquement les fichiers png, jpg, bmp, ogg et wav trouvés. Mais en plus de cela, des fichiers imoavi inconnus se trouvent également à l'intérieur.
L'essentiel est que dans le jeu, toutes les animations sont faites soit sous forme de vidéo à part entière au format ogv, soit sous forme d'images animées par le moteur qui sont enregistrées dans des fichiers .b, ou sous forme de séquences animées de fichiers jpg au format imoavi.
Dans ce cas, nous étions également intéressés par les images jpg, nous avons donc dû les gérer également.
Il y a deux sections dans imoavi: SOUND et MOVIE. Dans la section MOVIE, 47 octets après l'en-tête, il y a quatre octets de la taille du fichier jpg. Les fichiers sont écrits les uns après les autres dans leur forme d'origine, séparés par une séquence de 19 octets, où la taille du fichier suivant est enregistrée.
L'imoavi exprimé dans le jeu n'a pas été rencontré, donc la section SON est toujours vide.
Eh bien, depuis que nous avons commencé à retirer toutes les ressources du jeu, en même temps, un petit script a été écrit pour retirer jpg d'imoavi.
Après le déballage, vous pouvez vous assurer que l'animation de l'écran de démarrage dans le menu est stockée uniquement dans le fichier 1_ タ イ ト ル 画面 ム ー ビ ー .b au format imoavi.C'est tout avec les ressources du jeu.Malheureusement, le processus de traduction a révélé plusieurs nuances plus désagréables qui n'ont pas pu être surmontées. Le jeu, comme je l'ai déjà écrit, ne prend pas en charge les encodages Unicode. Par conséquent, tout le texte traduit est affiché avec le mauvais espacement des lettres. Il y a eu quelques problèmes supplémentaires avec le backpacking des fichiers et le démarrage d'un jeu sans changer l'encodage système en japonais.À un moment donné, nous (ou plutôt, celui qui était responsable de la partie technique de la traduction dans notre équipe) avons pensé: peut-être ne devrions-nous pas rester avec l'ancien moteur, mais porter le roman sur le moteur Renpy, tout en obtenant une plateforme multiplateforme?Peut-être étions-nous pressés, mais à un moment donné, c'était dommage de quitter ce que nous avions commencé et il ne restait plus qu'à terminer la traduction.Qu'avons-nous rencontré lors du portage?À ce sujet dans la deuxième partie.Liens:Nos scripts bitbucketÀ propos de latable de codage Shift Jis du moteur Qlie japonais Ensavoir plus sur le problème du transcodage de Shift Jis vers UTF-8asmodean exfp3_v3