88471


現在、[こちらの質問](https://stackoverflow.com/questions/44190906/translate-country-
name-into-other-
language)を参考にし、以下のようなコードのString型の変数sentenceを日本語に翻訳してコンソール上に出力するプログラムを作成しようとしています。  
しかし、実行した際に、`cannot find symbol`、`package Locale does not
exist`などのエラーが出てきてしまいます。この、`symbol`と言うのが、本来どの部分を指しているべきなのかわからず、行き詰まっている状態です。  
**現状でのコード：**

[code]

    public class Main
    {
        public static void main(String[] args) {
        String locale = "en_GB";
        String sentence = "Hello,how are you?";
            Locale sentenceJapan = new Locale.Builder().setRegion("JP"/*Japan*/).build();
            Locale langEnglish  = new Locale.Builder().setLanguage("en"/*English*/).build();
            Locale langJapanese = new Locale.Builder().setLanguage("ja"/*Japanese*/).build();
        System.out.println(countryJapan.getDisplayCountry(langEnglish));
        System.out.println(countryJapan.getDisplayCountry(langJapanese));
    
        }
    }
    
[/code]

**出てきたエラーメッセージ：**

[code]

    Main.java:6: error: cannot find symbol
            Locale sentenceJapan = new Locale.Builder().setRegion("JP"/*Japan*/).build();
            ^
      symbol:   class Locale
      location: class Main
    Main.java:6: error: package Locale does not exist
            Locale sentenceJapan = new Locale.Builder().setRegion("JP"/*Japan*/).build();
                                             ^
    Main.java:7: error: cannot find symbol
            Locale langEnglish  = new Locale.Builder().setLanguage("en"/*English*/).build();
            ^
      symbol:   class Locale
      location: class Main
    Main.java:7: error: package Locale does not exist
            Locale langEnglish  = new Locale.Builder().setLanguage("en"/*English*/).build();
                                            ^
    Main.java:8: error: cannot find symbol
            Locale langJapanese = new Locale.Builder().setLanguage("ja"/*Japanese*/).build();
            ^
      symbol:   class Locale
      location: class Main
    Main.java:8: error: package Locale does not exist
            Locale langJapanese = new Locale.Builder().setLanguage("ja"/*Japanese*/).build();
                                            ^
    Main.java:9: error: cannot find symbol
        System.out.println(countryJapan.getDisplayCountry(langEnglish));
                           ^
      symbol:   variable countryJapan
      location: class Main
    Main.java:10: error: cannot find symbol
        System.out.println(countryJapan.getDisplayCountry(langJapanese));
                           ^
      symbol:   variable countryJapan
      location: class Main
    
[/code]

私が参考にした[質問](https://stackoverflow.com/questions/44190906/translate-country-
name-into-other-language)では、1番上の行に`String locale =
"en_GB";`と書いてあったので、そちらを真似させていただいたのですが、こちらのコードは一体何のために使われるコードなのでしょうか？localeと言う変数名なので、場所などを指定しているのは想像がつくのですが、曖昧な理解しかできません。

ですので、以上の質問内容をまとめると、  
・`cannot find symbol`での本来の`symbol`が指すべき物が何なのか、  
・`package Locale does not exist`の意味や解決方法、  
・1番上の`String locale = "en_GB"`の意味  
・これらを踏まえた上で、正しいコードを書くにはどのようなコードを書けば良いのか

などを、ご教授していただきたいです。よろしくお願いいたします。


CC BY-SA 4.0
2022-04-22T20:28:27.383
88457
2022-04-24T00:26:23.090
2022-04-23T04:24:40.797
51596
51596
question
java
Javaで変数sentenceを他の言語に翻訳してコンソール上に出力する


ロケール (locale) はざっくり言うとプログラム内でどの言語に対応するかを指定する変数であり、en_GB は 英語(イギリス)
を指しますが、これを指定したからといって Java が勝手に翻訳してくれるわけではありません。

対応する文字列 (リソース) を自分で予め用意するか、翻訳 API などを利用する必要があるはずです。

参考:  
[ロケール -
IT用語辞典](https://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.html)


CC BY-SA 4.0
2022-04-23T08:21:11.003
88465
2022-04-23T08:21:11.003
3060
88457
answer


> ・cannot find symbolでの本来のsymbolが指すべき物が何なのか、  
>  ・package Locale does not existの意味や解決方法、

Javaのサンプルコードは往々にしてファイル冒頭に書かれるべき `package` や `import` が省略されます。

今回の場合は
[`java.util.Locale`](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Locale.html)を利用しているので、実際には次のようにファイルに書く必要があります:

[code]

    import java.util.Locale;
    
    public class Main
    {
        public static void main(String[] args) {
            // ...
            Locale sentenceJapan = new Locale.Builder().setRegion("JP"/*Japan*/).build();
            // ...
        }
    }
    
    
[/code]

> ・1番上のString locale = "en_GB"の意味

質問者が質問の具体例を示すための擬似的なコードなので意味はありません。  
"en_GB" は `Locale`
の[文字列表現](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/Locale.html#toString\(\))的なニュアンスで書いているのでしょう。

> ・これらを踏まえた上で、正しいコードを書くにはどのようなコードを書けば良いのか

リンク先の回答

> The Java Runtime Library doesn't have a translation API

にもある通り、JDKは翻訳する機能を有していません。  
つまり、「正しいコード」というのがそもそも存在しません。

* * *

現代ではWebサービスとして翻訳サービスを提供しているところが複数あります。  
例えば次のblogでまとめられているようなものがありますので、これらを利用することで想定している機能を実現することができるでしょう。

  * [GoogleのCloud Translation API v3を触ってみる](https://blog.katsubemakito.net/nodejs/google-translation-api-v3) \- ねこの足跡R

(2019年の記事であることに注意。 2022年現在では [DeepL](https://www.deepl.com/pro-api?cta=header-
pro-api) も有力な選択肢になるかと思います)

例えば、

  * [Google翻訳APIを無料で作る方法](https://qiita.com/satto_sann/items/be4177360a0bc3691fdf) \- Qiita

で作成されている Web API を利用すると次のように書けます(Java11 以降)。

[code]

    import java.io.IOException;
    import java.net.URI;
    import java.net.URLEncoder;
    import java.net.http.HttpClient;
    import java.net.http.HttpClient.Redirect;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.net.http.HttpResponse.BodyHandlers;
    import java.nio.charset.StandardCharsets;
    
    public class Main {
    
        // https://qiita.com/satto_sann/items/be4177360a0bc3691fdf
        private static final String BASE_URL = "https://script.google.com/macros/s/AKfycbzZtvOvf14TaMdRIYzocRcf3mktzGgXvlFvyczo/exec?source=en&target=ja&text=";
    
        public static void main(final String[] args) throws IOException, InterruptedException {
    
            final String sentence = "Hello,how are you?";
    
            final HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(BASE_URL + URLEncoder.encode(sentence, StandardCharsets.UTF_8)))
                .build();
    
            final HttpClient client = HttpClient.newBuilder()
                .followRedirects(Redirect.NORMAL).build();
            final HttpResponse<String> response = client.send(request, BodyHandlers.ofString(StandardCharsets.UTF_8));
    
            System.out.println(response.body()); // {"code":200,"text":"こんにちは元気ですか？"}
        }
    }
    
[/code]


CC BY-SA 4.0
2022-04-24T00:26:23.090
88471
2022-04-24T00:26:23.090
2808
88457
answer