Why java faker generating sentence in Latin language. I need in English language

508 Views Asked by At

Here is my code.

Faker faker = new Faker(new Locale("en-GB"));
String title = faker.lorem().sentence(3);
System.out.println("title = " + title);

The output is as below.

title = Ut at quis corrupti explicabo.

I checked in google translate. It is in the Latin language. How can I get the sentence in the English language?

1

There are 1 best solutions below

0
DevilsHnd - 退した On

To translate Latin (or any other language) to English you would obviously need a translator as Java-Faker doesn't do this. The easiest (I should think) would be to snag the translation from the internet.

I had the following method in my archives but I have no idea who wrote it. It does work but utilizes the WhatsApp's WhatsMate WA Gateway so, internet access is a requirement. I'm not really sure this is necessarily a good thing or not but here is a runnable demo in any case:

import com.github.javafaker.Faker;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;


public class FakerDemo {

    public static void main(String[] args) {
        new FakerDemo().startApp(args);
    }
    
    private void startApp(String[] args) {
        Faker faker = new Faker(); 
        String title = faker.lorem().sentence(3);
        try {
            System.out.println("Title: -> " + translate(title, "Latin", "English"));
        }
        catch (Exception ex) {
            System.err.println(ex);
        }
    }
    
    /**
     * Sends out a WhatsApp message via WhatsMate WA Gateway. Can translate any
     * language to any other language. Below is a list of 91 Languages and their
     * respective abbreviation that this method can Translate to and from:
     * <pre>
     *
     * Abbreviation, Language Name
     *  <table align="center" cellpadding="1" cellspacing="1" border="1">
     *      <tr><td>af, Afrikaans</td><td>gl, Galician</td><td>lt, Lithuanian</td><td>so, Somali</td></tr>
     *      <tr><td>ar, Arabic</td><td>gu, Gujarati</td><td>lv, Latvian</td><td>sq, Albanian</td></tr>
     *      <tr><td>az, Azerbaijani</td><td>ha, Hausa</td><td>ma, Punjabi</td><td>sr, Serbian</td></tr>
     *      <tr><td>be, Belarusian</td><td>hi, Hindi</td><td>mg, Malagasy</td><td>st, Sesotho</td></tr>
     *      <tr><td>bg, Bulgarian</td><td>hmn, Hmong</td><td>mi, Maori</td><td>su, Sudanese</td></tr>
     *      <tr><td>bn, Bengali</td><td>hr, Croatian</td><td>mk, Macedonian</td><td>sv, Swedish</td></tr>
     *      <tr><td>bs, Bosnian</td><td>ht, Haitian Creole</td><td>ml, Malayalam</td><td>sw, Swahili</td></tr>
     *      <tr><td>ca, Catalan</td><td>hu, Hungarian</td><td>mn, Mongolian</td><td>ta, Tamil</td></tr>
     *      <tr><td>ceb, Cebuano</td><td>hy, Armenian</td><td>mr, Marathi</td><td>te, Telugu</td></tr>
     *      <tr><td>cs, Czech</td><td>id, Indonesian</td><td>ms, Malay</td><td>tg, Tajik</td></tr>
     *      <tr><td>cy, Welsh</td><td>ig, Igbo</td><td>mt, Maltese</td><td>th, Thai</td></tr>
     *      <tr><td>da, Danish</td><td>is, Icelandic</td><td>my, Myanmar (Burmese)</td><td>tl, Filipino</td></tr>
     *      <tr><td>de, German</td><td>it, Italian</td><td>ne, Nepali</td><td>tr, Turkish</td></tr>
     *      <tr><td>el, Greek</td><td>iw, Hebrew</td><td>nl, Dutch</td><td>uk, Ukrainian</td></tr>
     *      <tr><td>en, English</td><td>ja, Japanese</td><td>no, Norwegian</td><td>ur, Urdu</td></tr>
     *      <tr><td>eo, Esperanto</td><td>jw, Javanese</td><td>ny, Chichewa</td><td>uz, Uzbek</td></tr>
     *      <tr><td>es, Spanish</td><td>ka, Georgian</td><td>pl, Polish</td><td>vi, Vietnamese</td></tr>
     *      <tr><td>et, Estonian</td><td>kk, Kazakh</td><td>pt, Portuguese</td><td>yi, Yiddish</td></tr>
     *      <tr><td>eu, Basque</td><td>km, Khmer</td><td>ro, Romanian</td><td>yo, Yoruba</td></tr>
     *      <tr><td>fa, Persian</td><td>kn, Kannada</td><td>ru, Russian</td><td>zcn, Chinese Simplified</td></tr>
     *      <tr><td>fi, Finnish</td><td>ko, Korean</td><td>si, Sinhala</td><td>ztw, Chinese Traditional</td></tr>
     *      <tr><td>fr, French</td><td>la, Latin</td><td>sk, Slovak</td><td>zu, Zulu</td></tr>
     *      <tr><td>ga, Irish</td><td>lo, Lao</td><td>sl, Slovenian</td><td></td></tr>
     *  </table>
     * </pre><br>
     * <p>
     * This method also ensures that an Internet connection exists. General
     * (simple) errors are returned as text string from this method.
     *
     * @param textToTranslate (String) The text to translate.<br>
     * 
     * @param fromLang (String) The language Name or Abbreviation (as describe
     *                 within the information above) to convert FROM.<br>
     *
     * @param toLang   (String) The language Name or Abbreviation (as describe
     *                 within the information above) to convert TO.<br>
     *
     * @return (String) The language translation.<br>
     *
     * @throws java.lang.Exception Should any issue arise.
     */
    public static String translate(String textToTranslate, String fromLang, String toLang) throws Exception {
        // Is there internet...
        // ---------------------------------------
        boolean hasInternet;
        /* Connect to Google DNS via port 53. Sometimes Anti-Virus
           applications will block standard internet access from 
           applications that do not contain a digital signature. This
           is one way to get around that problem...at least for checking
           to see if there is indeed internet access for the system.  */
        String host = "8.8.8.8";
        int port = 53;
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(host, port), 5000);
            hasInternet = true;
        }
        catch (IOException ex) {
            hasInternet = false;
        }
        if (!hasInternet) {
            return "No Internet availalble to acquire translation!";
        }
        // ---------------------------------------

        // Language Map...
        HashMap<String, String> langMap = new HashMap<>();
        //<editor-fold defaultstate="collapsed" desc=" Language Map Data ">
        langMap.put("af", "Afrikaans");
        langMap.put("ar", "Arabic");
        langMap.put("az", "Azerbaijani");
        langMap.put("be", "Belarusian");
        langMap.put("bg", "Bulgarian");
        langMap.put("bn", "Bengali");
        langMap.put("bs", "Bosnian");
        langMap.put("ca", "Catalan");
        langMap.put("ceb", "Cebuano");
        langMap.put("cs", "Czech");
        langMap.put("cy", "Welsh");
        langMap.put("da", "Danish");
        langMap.put("de", "German");
        langMap.put("el", "Greek");
        langMap.put("en", "English");
        langMap.put("eo", "Esperanto");
        langMap.put("es", "Spanish");
        langMap.put("et", "Estonian");
        langMap.put("eu", "Basque");
        langMap.put("fa", "Persian");
        langMap.put("fi", "Finnish");
        langMap.put("fr", "French");
        langMap.put("ga", "Irish");
        langMap.put("gl", "Galician");
        langMap.put("gu", "Gujarati");
        langMap.put("ha", "Hausa");
        langMap.put("hi", "Hindi");
        langMap.put("hmn", "Hmong");
        langMap.put("hr", "Croatian");
        langMap.put("ht", "Haitian Creole");
        langMap.put("hu", "Hungarian");
        langMap.put("hy", "Armenian");
        langMap.put("id", "Indonesian");
        langMap.put("ig", "Igbo");
        langMap.put("is", "Icelandic");
        langMap.put("it", "Italian");
        langMap.put("iw", "Hebrew");
        langMap.put("ja", "Japanese");
        langMap.put("jw", "Javanese");
        langMap.put("ka", "Georgian");
        langMap.put("kk", "Kazakh");
        langMap.put("km", "Khmer");
        langMap.put("kn", "Kannada");
        langMap.put("ko", "Korean");
        langMap.put("la", "Latin");
        langMap.put("lo", "Lao");
        langMap.put("lt", "Lithuanian");
        langMap.put("lv", "Latvian");
        langMap.put("ma", "Punjabi");
        langMap.put("mg", "Malagasy");
        langMap.put("mi", "Maori");
        langMap.put("mk", "Macedonian");
        langMap.put("ml", "Malayalam");
        langMap.put("mn", "Mongolian");
        langMap.put("mr", "Marathi");
        langMap.put("ms", "Malay");
        langMap.put("mt", "Maltese");
        langMap.put("my", "Myanmar (Burmese)");
        langMap.put("ne", "Nepali");
        langMap.put("nl", "Dutch");
        langMap.put("no", "Norwegian");
        langMap.put("ny", "Chichewa");
        langMap.put("pl", "Polish");
        langMap.put("pt", "Portuguese");
        langMap.put("ro", "Romanian");
        langMap.put("ru", "Russian");
        langMap.put("si", "Sinhala");
        langMap.put("sk", "Slovak");
        langMap.put("sl", "Slovenian");
        langMap.put("so", "Somali");
        langMap.put("sq", "Albanian");
        langMap.put("sr", "Serbian");
        langMap.put("st", "Sesotho");
        langMap.put("su", "Sudanese");
        langMap.put("sv", "Swedish");
        langMap.put("sw", "Swahili");
        langMap.put("ta", "Tamil");
        langMap.put("te", "Telugu");
        langMap.put("tg", "Tajik");
        langMap.put("th", "Thai");
        langMap.put("tl", "Filipino");
        langMap.put("tr", "Turkish");
        langMap.put("uk", "Ukrainian");
        langMap.put("ur", "Urdu");
        langMap.put("uz", "Uzbek");
        langMap.put("vi", "Vietnamese");
        langMap.put("yi", "Yiddish");
        langMap.put("yo", "Yoruba");
        langMap.put("zcn", "Chinese Simplified");
        langMap.put("zct", "Chinese Traditional");
        langMap.put("zu", "Zulu");
        //</editor-fold>

        // Ensure supplied FROM/TO Language spec's are in lowercase.
        fromLang = fromLang.toLowerCase();
        toLang = toLang.toLowerCase();

        boolean foundLang = false;
        // If only the FROM language abrieviation (map key) is provided...
        // fromLang parameter...
        if (fromLang.length() < 4) {
            if (!langMap.containsKey(fromLang.toLowerCase())) {
                return "ERROR! Can not locate specified 'FROM' Language! --> (" + fromLang + ")";
            }
        }
        // If full FROM language Name (map value) is provided...
        else {
            String value = fromLang;
            for (Map.Entry<String, String> entry : langMap.entrySet()) {
                if (value.equalsIgnoreCase(entry.getValue())) {
                    fromLang = entry.getKey();
                    foundLang = true;
                    break; //breaking because its one to one map
                }
            }
            if (!foundLang) {
                return "ERROR! Can not locate specified 'FROM' Language! --> (" + fromLang + ")";
            }
        }
        // If only the TO language abrieviation (map key) is provided... 
        // toLang parameter...
        foundLang = false;
        if (toLang.length() < 4) {
            if (!langMap.containsKey(toLang)) {
                return "ERROR! Can not locate specified 'TO' Language! --> (" + toLang + ")";
            }
        }
        // If full TO language Name (map value) is provided...
        else {
            String value = toLang;
            for (Map.Entry<String, String> entry : langMap.entrySet()) {
                if (value.equalsIgnoreCase(entry.getValue())) {
                    toLang = entry.getKey();
                    foundLang = true;
                    break; //breaking because its one to one map
                }
            }
            if (!foundLang) {
                return "ERROR! Can not locate specified 'TO' Language! --> (" + toLang + ")";
            }
        }
        if (fromLang.equalsIgnoreCase("zcn")) {
            fromLang = "zh-CN";
        }
        else if (fromLang.equalsIgnoreCase("zct")) {
            fromLang = "zh-CT";
        }
        if (toLang.equalsIgnoreCase("zcn")) {
            toLang = "zh-CN";
        }
        else if (toLang.equalsIgnoreCase("zct")) {
            toLang = "zh-CT";
        }

        String jsonPayload = new StringBuilder()
                .append("{")
                .append("\"fromLang\":\"")
                .append(fromLang)
                .append("\",")
                .append("\"toLang\":\"")
                .append(toLang)
                .append("\",")
                .append("\"text\":\"")
                .append(textToTranslate)
                .append("\"")
                .append("}")
                .toString();

        URL url = new URL("http://api.whatsmate.net/v1/translation/translate");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("X-WM-CLIENT-ID", "FREE_TRIAL_ACCOUNT");
        conn.setRequestProperty("X-WM-CLIENT-SECRET", "PUBLIC_SECRET");
        conn.setRequestProperty("Content-Type", "application/json");

        // 'Try With Resources' used here to auto-close stream.
        try (OutputStream os = conn.getOutputStream()) {
            os.write(jsonPayload.getBytes());
            os.flush();
        }

        int statusCode = conn.getResponseCode();
        // System.out.println("Status Code: " + statusCode);
        BufferedReader br = new BufferedReader(new InputStreamReader(
                (statusCode == 200) ? conn.getInputStream() : conn.getErrorStream()
        ));

        String output;
        StringBuilder sb = new StringBuilder();
        while ((output = br.readLine()) != null) {
            sb.append(output).append(System.lineSeparator());
        }
        return sb.toString();
    }
    
}