public String translate(String source) throws Exception {

        String sourceContent = this.digContent(source);
        String[] content = StringUtils.splitByWholeSeparator(sourceContent, this.getLineSpliter());

        LinkedHashMap<String, String> sourceHashMap = new LinkedHashMap<>();
        for (String line : content) {
            if (StringUtils.isEmpty(line)) {
                continue;
            }
            try {
                String key = line.substring(0, line.indexOf(this.getKeyValueSpliter()));
                String value = line.substring(line.indexOf(this.getKeyValueSpliter()) + 1, line.length());
                sourceHashMap.put(key, value);
            } catch (Exception e) {
                Log.error("Cant split source keys and values to hashmap", e);
            }

        }

        ArrayList<Dictionary> reverseDictionaries = this.dictionaries;
        Collections.reverse(reverseDictionaries);

        LinkedHashMap<String, String> translated = new LinkedHashMap<>();

        for (Dictionary dictionary : reverseDictionaries) {
            ArrayList<String> reverseKeySet = new ArrayList<String>(dictionary.keySet());
            Collections.reverse(reverseKeySet);
            for (String word : reverseKeySet) {
                for (String key : sourceHashMap.keySet()) {
                    String value = sourceHashMap.get(key);
                    //If that value already been put to the "translated" then replace the string in the translated
                    if (!translated.containsKey(key)) {
                        value = value.replaceAll(word, dictionary.get(word));
                    } else {
                        Matcher m = Pattern.compile(word).matcher(value);
                        if (!m.find()) {
                            continue;
                        } else {
                            value = translated.get(key).replaceAll(m.group(), dictionary.get(word));
                        }

                    }
                    translated.put(key, value);

                }
            }
        }

        StringBuilder translatedContent = new StringBuilder();
        for (String key : translated.keySet()) {
            translatedContent.append(
                    String.format(
                            "%s%s%s%s",
                            key, this.getKeyValueSpliter(),
                            translated.get(key),
                            this.getLineSpliter()
                    )
            );
        }
        return source.replace(sourceContent, translatedContent.toString());
    }