Swift Tourを各種ツールで翻訳してみた

技術,プログラミング言語

TL;DR

  • プログラミング関係では英語を避けるのは難しい
  • 英語ができる人ならよいが、日本語しかできない人はツールに頼ってみるべき
  • DeepLとChatGPTを試してみたが、全体的にはChatGPTの訳の方がこなれている印象
  • ただし、一文一文細かくみていくと、一長一短ある。わかりにくい部分では併用も必要かも

なぜ自分で日本語化したか

昔ちょっとだけSwiftを触りましたが、その後Go言語に惹かれ、最近はRustを齧ってる浮気性です。

Swiftをやるにあたり、まずはSwift Tourを見てみました。これ自体は日本語版があります。ですので、読むだけならば自分で翻訳する必要はありません。ただ、SwiftにはSwift Playgroundsというものがあります。その場で動かして挙動を確認できるのは便利です。せっかくなのでPlaygrounds版のTourをやってみようと思ったのですが、これには英語版しかないよう。

そこで、翻訳しながら進めようと思いましたが、そこに時間をかけるのもなんです。せっかくだからツールを使いましょうというのが本稿の主旨です。ツールには翻訳といえばDeepLと、最近話題のChatGPTを使ってみました。どちらも無料版を使っています。

日本語化のやり方

動かす環境であるSwift Playgroundsが必要なのは当然。日本語に翻訳した.playgroundファイルを作るためにXcodeが必要です。VSCodeなどでもSwiftコードを書けますが、やはりXcodeも必要でしょう。Xcodeのインストール自体はあちこちに情報があるので割愛。インストールしたら、GuidedTour.playgroundファイルを念のためコピーし、それをXcodeで開くだけです。

開くと、章ごとにSwiftのソースコードがあります。そこにコメントで文章があるので、それを翻訳して日本語に置き換えていきます。

Xcodeで開いたGuidedTour.playgroundファイル

ChatGPTでの翻訳のやり方

まあ、普通にこれを翻訳して、と指示して文章を投げれば翻訳はしてくれます。ただ、いちいち、「翻訳して」と書くのも面倒なので、こんなプロンプトを与えました。

これ以降、英文を入力するので、それを日本語に翻訳してください。口調は〜ます、〜ですのようなですます調に統一してください。

これで、いちいち「翻訳して」と書く必要はありません。ただ、課題問題などで命令形の文章を翻訳すると、翻訳したのち、その指示に従った回答をしてしまうのはご愛嬌。

命令文を翻訳させると、翻訳後にその指示に従ってしまう

これを避けるためにプロンプトを以下のようにしてみたのですが、うまくいきませんでした。Systemのロールで指示すればもしかすると意図通りになるかもしれません。

これ以降、英文を入力するので、それを日本語に翻訳してください。口調は〜ます、〜ですのようなですます調に統一してください。文章が命令調になっているものは課題の文章ですので、翻訳だけしてください。指示に従った回答は不要です。

実際の翻訳を比べてみる

一段落目

とりあえず、最初の章を翻訳していきます。一文一文は大した長さではないので、自分で訳しても構わないのですが、ここは楽します。

原文DeepLChatGPT
Tradition suggests that the first program in a new language should print the words “Hello, world!” on the screen. In Swift, this can be done in a single line:伝統では、新しい言語の最初のプログラムは、画面に “Hello, world!"という言葉を印刷するべきだとされています。Swiftでは、これを1行で済ませることができる。伝統的に、新しいプログラミング言語で最初のプログラムは、画面に「Hello, world!」と表示することが推奨されています。Swiftでは、これを1行で実行することができます。

まずは最初の章の冒頭部分です。
DeepLはちょっと硬いですね。また、最初の文は「〜されています」なのに、次は「ことができる」と口調が変わっています。気にしなければよいと言えばそれまでですが、何で語調がぶれるのでしょう?

一方、ChatGPTの方はこなれた感じがします。なお、ChatGPTの場合は、再実行すると翻訳が変わるので常に上記の結果が出るとは限りません。ただ、正直、一長一短な部分もあります。個人的にはこんな感じにしたいです。

伝統的に、新しいプログラミング言語で最初のプログラムは、画面に「Hello, world!」と表示するものです。Swiftでは、これを1行で済ますことができます。

もうちょっと、様子を見てみます。

二段落目

原文DeepLChatGPT
If you have written code in C or Objective-C, this syntax looks familiar to you — in Swift, this line of code is a complete program. CやObjective-Cでコードを書いたことがある人なら、この構文に見覚えがあると思います。
Swiftでは、このコード行が完全なプログラムです。
もし、CやObjective-Cでコードを書いたことがある場合、この構文は馴染みがあるでしょう。
Swiftでは、この1行のコードが完全なプログラムになります。
You don’t need to import a separate library for functionality like input/output or string handling.入出力や文字列処理のような機能のために、別のライブラリをインポートする必要はありません。入出力や文字列の処理などの機能のために別のライブラリをインポートする必要はありません。
Code written at global scope is used as the entry point for the program, so you don’t need a main() function.グローバルスコープで書かれたコードは、プログラムのエントリポイントとして使用されるので、main()関数は必要ありません。
グローバルスコープで書かれたコードは、プログラムのエントリーポイントとして使用されるため、main()関数を必要としません。
You also don’t need to write semicolons at the end of every statement.また、すべての文の末尾にセミコロンを書く必要もありません。また、文の末尾にセミコロンを書く必要もありません。

やはり全体的にChatGPTの方がこなれてる感じがします。ただ、部分的にはDeepLの方がよいかなという部分も。

原文DeepLChatGPT
This tour gives you enough information to start writing code in Swift by showing you how to accomplish a variety of programming tasks.このツアーでは、さまざまなプログラミングタスクを達成する方法を紹介することで、Swiftでコードを書き始めるのに十分な情報を提供します。このツアーでは、プログラミングのさまざまなタスクを達成する方法を示すことで、Swiftでコードを書き始めるための十分な情報を提供します。
Don’t worry if you don’t understand something — everything introduced in this tour is explained in detail in the rest of this book.このツアーで紹介したことは、本書の他の部分で詳しく説明していますので、わからないことがあっても心配ありません。何か分からないことがあっても心配しないでください。
このツアーで紹介された内容は、この書籍の残りの部分で詳しく説明されています。

この部分はあまり差はないです。語順がちょっと違う程度ですが、ChatGPTは生成し直すと変わってくる可能性もあります。僅差でChatGPTの方がよい感じはします。

三段楽目

原文DeepLChatGPT
Use let to make a constant and var to make a variable.
定数を作るにはlet、変数を作るにはvarを使用します。定数を作成するにはletを使用し、変数を作成するにはvarを使用します。
The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once.定数の値はコンパイル時に知っている必要はありませんが、正確に一度だけ値を代入する必要があります。定数の値はコンパイル時には必ずしも知る必要はありませんが、一度だけ値を割り当てる必要があります。
This means you can use constants to name a value that you determine once but use in many places.つまり、定数を使って、一度は決めたが、いろいろなところで使う値の名前をつけることができるのです。これは、1度だけ決定して多くの場所で使用する値に名前を付けるために定数を使用できることを意味します。

この文章はChatGPTよりもDeepLの方が良さそうです。ただ2番目の文の「正確に一度だけ」は変ですね。ChatGPTの翻訳はちょっと回りくどい感じです。あと、プログラミングの文脈ではassignは代入と訳すDeepLの方がよい感じです。最後の文章もChatGPTの翻訳はちょっと意味が分かりにくいですね。

原文DeepLChatGPT
A constant or variable must have the same type as the value you want to assign to it. 定数や変数は、代入したい値と同じ型でなければなりません。定数または変数は、割り当てる値と同じ型でなければなりません。
However, you don’t always have to write the type explicitly.
しかし、必ずしも明示的に型を記述する必要はありません。ただし、常に明示的に型を書く必要はありません。
Providing a value when you create a constant or variable lets the compiler infer its type.定数や変数を作成する際に値を指定することで、コンパイラがその型を推測することができます。定数または変数を作成するときに値を提供すると、コンパイラがその型を推論できます。
In the example above, the compiler infers that myVariable is an integer because its initial value is an integer.上の例では、初期値が整数であるため、コンパイラーはmyVariableが整数であると推論しています。上記の例では、初期値が整数であるため、コンパイラはmyVariableが整数であると推論します。
If the initial value doesn’t provide enough information (or if there isn’t an initial value), specify the type by writing it after the variable, separated by a colon.初期値で十分な情報が得られない場合(または初期値がない場合)は、変数の後にコロンで区切って型を記述します。初期値が十分な情報を提供しない場合(または初期値がない場合)、変数の後にコロンで区切られた型を書くことで型を指定します。

全体の印象はChatGPTに軍配を上げたくなりますが、assignの代入、「〜 or 〜」を「〜や〜」と訳すセンスはDeepLの方がよい感じ。

四段落目

原文DeepLChatGPT
Values are never implicitly converted to another type. 値が暗黙のうちに別の型に変換されることはありません。値は暗黙的に他の型に変換されることはありません。
If you need to convert a value to a different type, explicitly make an instance of the desired type.値を別の型に変換する必要がある場合は、明示的に目的の型のインスタンスを作成します。異なる型に変換する必要がある場合は、明示的に変換先の型のインスタンスを作成します。

あまり差はないですが、ChatGPTの方が簡潔でしょうか。

五段落目

原文DeepLChatGPT
There’s an even simpler way to include values in strings: 文字列の中に値を入れるには、もっと簡単な方法があります。文字列に値を含めるさらに簡単な方法があります。
Write the value in parentheses, and write a backslash (\) before the parentheses.値を括弧で囲み、括弧の前にバックスラッシュ(◆)を書きます。括弧に値を書き、括弧の前にバックスラッシュ(\)を書きます。
For example:例えば、以下のようになります。例えば、以下のようになります。

DeepLはバックスラッシュが◆になってしまっています。ChatGPTの「括弧に値を書き」はわかるけどちょっと端折りすぎです。まあ、すぐ後ろのソースを見ればわかるので、全体で捉えれば問題はありません。

六段落目

原文DeepLChatGPT
Use three double quotation marks (""") for strings that take up multiple lines.複数行にまたがる文字列には、3つのダブルクォーテーション("")を使用します。複数行にわたる文字列には、三重引用符(“"")を使用します。
Indentation at the start of each quoted line is removed, as long as it matches the indentation of the closing quotation marks.各引用符の行頭のインデントは、閉じる引用符のインデントと同じであれば、削除されます。引用された各行の先頭のインデントは、閉じる引用符のインデントに合わせて一致する限り、削除されます。
For example:例えば、以下のようになります。例えば、以下のようになります。

ChatGPTが"three double quotation"を「三重引用符」と訳しているのはいただけませんね。ここはDeepLの方がちゃんと訳しています。ただ、2つ目の文はChatGPTの方がわかりやすいです。常にChatGPTの方が優れているわけでもないのが悩ましいところです。

七段落目

原文DeepLChatGPT
Create arrays and dictionaries using brackets ([]), and access their elements by writing the index or key in brackets. ブラケット([])を使って配列や辞書を作成し、ブラケット内にインデックスやキーを記述することでその要素にアクセスします。角括弧([])を使用して配列や辞書を作成し、インデックスやキーを角括弧に書いて要素にアクセスします。
A comma is allowed after the last element.最後の要素の後にカンマを置くことができる。最後の要素の後にはカンマを置くことができます。

DeepLはちょっと回りくどいのに対して、ChatGPTはすっきりとした訳です。あと、DeepLはまた語調が乱れてます。

八段落目

原文DeepLChatGPT
Arrays automatically grow as you add elements.配列は、要素を追加すると自動的に大きくなります。要素を追加すると、配列は自動的に拡大します。

短い一文ですが、ここもChatGPTがよい感じ。原文を直訳したような感じのDeepLに対し、語順を入れ替えることでChatGPTは日本語の文章として読みやすい文章にしてくれています。

九段落目

原文DeepLChatGPT
You also use brackets to write an empty array or dictionary. また、空の配列や辞書を書くときにも、ブラケットを使います。空の配列や辞書を書くためにも、角括弧を使います。
For an array, write [], and for a dictionary, write [:].配列の場合は[]、辞書の場合は[:]と書きます。配列の場合は[]、辞書の場合は[:]を書きます。

ここもChatGPTの方がよい感じです。DeepLの文頭の「また」はalsoを受けてのものでしょうが、流れとしては不要かと思います。

十段落目

原文DeepLChatGPT
If you’re assigning an empty array or dictionary to a new variable, or another place where there isn’t any type information, you need to specify the type.空の配列や辞書を新しい変数に代入する場合など、型情報がないところでは、型を指定する必要があります。新しい変数や、型情報がない別の場所に空の配列や辞書を割り当てる場合は、型を指定する必要があります。

最後の文はそもそもの原文がややこしいですね。最初に示した日本語版ではChatGPTの訳文に近い訳でした。ただ、カンマの位置からしても、ChatGPTの訳の方がよさそうです。

まとめ

細かい点ではDeepLの方が良さそうな部分もありますが、全体的にはChatGPTの方がこなれた読みやすい文章に訳していると感じます。

あくまで個人の感想ですが、DeepLでもまあ意味は大体わかるので、プログラミング言語を個人で学習する分には大きな問題はなさそうなのは確かです。ただ、ところどころ気になる翻訳があったりします。

一方、ChatGPTも、やはりところどころで変な部分はあるものの、全体的にはそのまま使えそうです。そういう意味ではどちらも実用レベルと言ってもよいのかもしれません。セカンドオピニオンではないですが、見比べながらやってみるのもよいかもしれません。

おまけ:指示を変えてみた

ちなみに、ChatGPTはプロンプトをいじれば、こんな感じの文章にもできるのは面白いところです。実用的かどうかは別として。

伝統的に、新しい言語で最初のプログラムは画面に「Hello, world!」という言葉を表示するべきだとされているんだ。Swiftであれば、1行で実現できるぜ。
もしCやObjective-Cでコードを書いたことがあるなら、この構文はおなじみかもしれない。Swiftでは、この1行が完全なプログラムとなる。入出力や文字列処理などの機能については、別途ライブラリをインポートする必要はない。グローバルスコープで書かれたコードは、プログラムのエントリーポイントとして使用されるため、main()関数を書く必要はない。また、文の最後にセミコロンを書く必要もない。
このツアーでは、さまざまなプログラミングタスクを達成する方法を示すことで、Swiftでコードを書き始めるための十分な情報を提供する。何か分からないことがあっても心配しないでほしい。このツアーで紹介されたすべての内容は、この本の残りの部分で詳しく説明されているからだ。

なんか、語調がごちゃごちゃですね。ちょっと多重人格的な気も。与えた指示は以下です。

これ以降、英文を入力するので、それを日本語に翻訳してください。砕けた口調にしてください。語尾はできる限り統一してください。

また違う例。

言い伝えによると、新しいプログラミング言語で最初のプログラムは画面に「Hello, world!」と表示するらしいんだよ。Swiftでやるなら、1行でできちゃうんだぜ。

C言語やObjective-Cでコードを書いたことがあるなら、この構文は馴染みがあると思うぜ。Swiftでは、この1行のコードが完全なプログラムになってるんだ。入出力や文字列の処理などの機能のために別のライブラリをインポートする必要はない。グローバルスコープに書かれたコードがプログラムのエントリーポイントとして使用されるため、main()関数は不要だ。また、文末にセミコロンを書く必要もない。

このツアーでは、さまざまなプログラミングタスクを達成する方法を示すことで、Swiftでのコードの書き方に十分な情報を提供するぜ。何かが分からなくても心配しなくていいぜ。このツアーで紹介されたすべての内容は、この本の残りの部分で詳しく説明されているからな。

「言い伝え」って何でしょ。ヤンキー言葉ではないと思いますが。こちらはこんなプロンプト。

これ以降、英文を入力するので、それを日本語に翻訳してください。翻訳した日本語文はヤンキー口調にしてください。語尾はできる限り統一してください。

蛇足

アップルストアでダウンロードしたSwift Playgroundについていたツアーと、Webサイトで公開されているツアーが、微妙に内容が違うようです。

技術swift,プログラミング言語

Posted by woinary