Вопрос по api – Автоматически переводить .po файлы? [закрыто]

26

Раньше было несколько сервисов, которые использовали Google Translate API V1 для автоматического перевода..po файлы.

Google остановил API V1, а с V2 они берут 20 долларов за 1 000 000 слов.

Я искал, но не могу найти инструмент, который предлагает перевод с версией V2. Вы ожидаете, что кто-то обновит свой инструмент и будет брать 2 доллара за 20 000 слов и получать хорошую прибыль.

Существуют ли платные или бесплатные инструменты, которые автоматически переведут.po файлы?

Google не позволяет вам перепродавать свои платные переводы в соответствии с условиями предоставления услуг, поэтому никто не сможет сделать то, что вы предлагаете ... daveagp

Ваш Ответ

5   ответов
-2

http://sourceforge.net/projects/po-auto-tran/?source=dlp вот, пожалуйста, я только что скачал и использовал его, он работает ОТЛИЧНО !!! я не знаю, если это отвечает на ваш вопрос, но это грязная работа для меня

дубликат выше
45
это потрясающе. Любить это.
Это больше не бесплатно. Заряд довольно здоровенный
это круто! это экономит, возможно, 90% работы!
Ебена мать. это потрясающе.
Это все еще свободно использовать, хотя интерфейс запутывает. Тот факт, что Google пытается направить вас к поставщику переводов, не помогает. Вы можете нажать «Нет, спасибо», пометить переведенный файл как «Завершено», а затем загрузить автоматически переведенный текст.
1

которые переводят PO-файлы с помощью Google Translator API

Скачать с репо здесь:https://github.com/OzzyCzech/potrans

Это великолепно! Было несколько ошибок с% s и% d переменными, но в целом это здорово. Спасибо
1

чтобы внести исправления или улучшить обработку ошибок. Я не эксперт по.po формат файла, но я думаю, что это будет работать с моими потребностями angular-gettext. Я думаю, что единственной внешней библиотекой, которую я использовал, был Jtons.NET компании Newtonsoft. Я не связан с Frengly. Это появилось в Google. Я рекомендую использовать другой API перевода, если вам требуется более 1 перевода за 3 секунды.

Input File: template.pot

msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: Comment
msgid "You do not have permission to view this application"
msgstr ""

msgid "You have permission to view this application"
msgstr ""

Input Command: > program.exe template.pot en es_VE fr_FR

Output File 1: en.cache.json Это сделано для того, чтобы любая используемая вами утилита перевода не приходилась снова и снова.

{
  "es_VE": {
    "You do not have permission to view this application": "Tu no la habana permiso que vista este aplicación",
    "You have permission to view this application": "Tu tienes permiso que vista este aplicación"
  },
  "fr_FR": {
    "You do not have permission to view this application": "Vous le faites pas as autorisation a vue cette une demande",
    "You have permission to view this application": "Tuas autorisation a vue cette une demande"
  }
}

Output File 2: es_VE.po

msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: Comment
msgid "You do not have permission to view this application"
msgstr "Tu no la habana permiso que vista este aplicación"

msgid "You have permission to view this application"
msgstr "Tu tienes permiso que vista este aplicación"

Output File 3: fr_FR.po

msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: Comment
msgid "You do not have permission to view this application"
msgstr "Vous le faites pas as autorisation a vue cette une demande"

msgid "You have permission to view this application"
msgstr "Tuas autorisation a vue cette une demande"

Source

public interface ICache
{
    void Add(string language, IEntry entry);

    IEntry Get(string language, string id);

    string GetSerialized();
}

public class JsonCache : ICache
{
    private Dictionary<string, Dictionary<string, string>> _cache;

    public JsonCache(string json)
    {
        this._cache = 
            json == null ?
            new Dictionary<string, Dictionary<string, string>>() :
            JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(json);
    }

    public void Add(string language, IEntry entry)
    {
        if (!this._cache.ContainsKey(language))
        {
            this._cache.Add(language, new Dictionary<string, string>());
        }

        var languageCache = this._cache[language];

        languageCache.Add(entry.Id, entry.Value);
    }

    public IEntry Get(string language, string id)
    {
        if (!this._cache.ContainsKey(language))
        {
            return null;
        }

        var languageCache = this._cache[language];

        Entry result = null;

        if (languageCache.ContainsKey(id))
        {
            result = new Entry();
            result.Id = id;
            result.Value =  languageCache[id];
        }

        return result;
    }

    public string GetSerialized()
    {
        return JsonConvert.SerializeObject(this._cache, Formatting.Indented);
    }
}

public interface IReader : IDisposable
{
    IEntry Read();
}

public class PoReader : IReader
{
    private StreamReader _reader;

    public PoReader(string fileName)
    {
        this._reader = new StreamReader(fileName);
    }

    public void Dispose()
    {
        if (this._reader != null)
        {
            this._reader.Dispose();
        }
    }

    public IEntry Read()
    {
        var entry = new Entry();

        while (entry.Id == null || entry.Value == null)
        {
            var line = this._reader.ReadLine();
            if (line == null)
            {
                return null;
            }

            if (line.StartsWith(Constants.StartComment))
            {
                entry.Comment = line.Substring(Constants.StartComment.Length);
            }
            else if (line.StartsWith(Constants.StartId))
            {
                entry.Id = line.Substring(Constants.StartId.Length);
                // Remove the double quotes.
                entry.Id = entry.Id.Substring(1, entry.Id.Length - 2);
            }
            else if (line.StartsWith(Constants.StartValue))
            {
                entry.Value = line.Substring(Constants.StartValue.Length);
                // Remove the double quotes.
                entry.Value = entry.Value.Substring(1, entry.Value.Length - 2);
            }
        }

        // Skip the first entry
        if (entry.Id.Length == 0)
        {
            return this.Read();
        }

        return entry;
    }
}

public class CachedTranslator : ITranslator
{
    private ITranslator _translator;
    private ICache _cache;

    public CachedTranslator(ICache cache, ITranslator translator)
    {
        this._translator = translator;
        this._cache = cache;
    }

    public IEntry Translate(string language, IEntry entry)
    {
        var result = this._cache.Get(language, entry.Id);
        if (result == null)
        {
            result = this._translator.Translate(language, entry);
            this._cache.Add(language, result);
        }
        else
        {
            // We don't want to use the cached comment.
            var clone = new Entry();

            clone.Comment = entry.Comment;
            clone.Value = result.Value;
            clone.Id = result.Id;

            result = clone;
        }
        return result;
    }
}

public class FrenglyTranslator : ITranslator
{
    private string _password;
    private string _email;
    private string _inLanguage;

    public FrenglyTranslator(string email, string password, string inLanguage)
    {
        this._email = email;
        this._password = password;
        this._inLanguage = inLanguage;
    }

    public IEntry Translate(string language, IEntry entry)
    {
        var url = string.Format("http://syslang.com?src={4}&dest={0}&text={1}&email={2}&password={3}&outformat=json",
            language.Substring(0, 2),
            entry.Id,
            this._email,
            this._password,
            this._inLanguage);

        var result = new Entry();
        result.Id = entry.Id;
        result.Comment = entry.Comment;

        using (var client = new HttpClient())
        {
            var clientResult = client.GetStringAsync(url).Result;
            var jo = (JObject)JsonConvert.DeserializeObject(clientResult);               
            result.Value = jo.Property("translation").Value.Value<string>();
        }

        // Must wait 3 seconds between calls.
        Thread.Sleep(3001);

        return result;
    }
}

public interface ITranslator
{
    IEntry Translate(string language, IEntry entry);
}

public interface IWriter : IDisposable
{
    void Write(IEntry entry);
}

public class PoWriter : IWriter
{
    private StreamWriter _writer;

    public PoWriter(string fileName)
    {
        this._writer = new StreamWriter(fileName);

        var header = @"msgid """"
msgstr """"
""Content-Type: text/plain; charset=UTF-8\n""
""Content-Transfer-Encoding: 8bit\n""";

        this._writer.WriteLine(header);
    }

    public void Write(IEntry entry)
    {
        this._writer.WriteLine();

        if (entry.Comment != null && entry.Comment.Length > 0)
        {
            this._writer.WriteLine(Constants.StartComment + entry.Comment);
        }

        this._writer.WriteLine(string.Format("{0}\"{1}\"", Constants.StartId, entry.Id));
        this._writer.WriteLine(string.Format("{0}\"{1}\"", Constants.StartValue, entry.Value));
    }

    public void Dispose()
    {
        if (this._writer != null)
        {
            this._writer.Dispose();
        }
    }
}

public static class Constants
{
    public const string StartComment = "#: ";
    public const string StartId = "msgid ";
    public const string StartValue = "msgstr ";
}

public class Entry : IEntry
{
    public string Comment { get; set; }

    public string Value { get; set; }

    public string Id { get; set; }
}

public interface IEntry
{
    string Comment { get; }

    string Value { get; }

    string Id { get; }
}

class Program
{
    private const string cacheFileNameSuffix = ".cache.json";
    private const string frenglyEmail = "[email protected]";
    private const string frenglyPassword = "YourPassword";

    static void Main(string[] args)
    {
        //
        // INITIALIZE
        //
        var inFileName = args[0];
        var inLanguage = args[1];
        var outLanguages = args.Skip(2);

        // ICache
        var cacheFileName = inLanguage + cacheFileNameSuffix;
        var json = File.Exists(cacheFileName) ? File.ReadAllText(cacheFileName) : null;
        ICache cache = new JsonCache(json);

        // ITranslator
        ITranslator translator = new FrenglyTranslator(frenglyEmail, frenglyPassword, inLanguage);
        ITranslator cachedTranslator = new CachedTranslator(cache, translator);

        // IWriters
        var writers = new Dictionary<string, IWriter>();
        foreach (var language in outLanguages)
        {
            writers.Add(language, new PoWriter(language + ".po"));
        }

        try
        {
            using (IReader reader = new PoReader(inFileName))
            {
                //
                // RUN
                //
                IEntry entry = null;
                while (true)
                {
                    entry = reader.Read();
                    if (entry == null)
                    {
                        break;
                    }

                    foreach (var kv in writers)
                    {
                        var translated = cachedTranslator.Translate(kv.Key, entry);
                        kv.Value.Write(translated);
                    }
                }
            }
        }
        finally
        {
            // Store the cache.
            File.WriteAllText(cacheFileName, cache.GetSerialized());

            //
            // CLEANUP
            //

            // Dispose of the writers.
            foreach (var writer in writers.Values)
            {
                if (writer != null)
                {
                    writer.Dispose();
                }
            }
        }
    }
}
-3

http://www.po-auto-translator.tk/ работает просто отлично, я только что скачал софт.

Приложение не работает, не беспокойтесь.
этот сайт тоже мертв
сайт не работает
дубликат выше

Похожие вопросы