Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 自动翻译.po文件?_Api_Translate_Po - Fatal编程技术网

Api 自动翻译.po文件?

Api 自动翻译.po文件?,api,translate,po,Api,Translate,Po,过去有一些服务使用Google Translate API V1自动翻译.po文件 谷歌已经停止了他们的v1api,用V2他们对1.000.000个单词收取20美元 我已经搜索过,但找不到任何提供V2版本翻译的工具。你会期望有人更新他们的工具,每20000个单词收取2美元,并获得丰厚的利润 有没有付费或免费的工具可以自动翻译.po文件?有点晚,但谷歌现在提供了这一功能 谷歌翻译已经关闭了这项服务:/请参阅我的免费PHP工具Potrans,它使用谷歌翻译API翻译PO文件 从repo下载:给你,

过去有一些服务使用Google Translate API V1自动翻译
.po
文件

谷歌已经停止了他们的v1api,用V2他们对1.000.000个单词收取20美元

我已经搜索过,但找不到任何提供V2版本翻译的工具。你会期望有人更新他们的工具,每20000个单词收取2美元,并获得丰厚的利润

有没有付费或免费的工具可以自动翻译
.po
文件?

有点晚,但谷歌现在提供了这一功能


谷歌翻译已经关闭了这项服务:/

请参阅我的免费PHP工具Potrans,它使用谷歌翻译API翻译PO文件


从repo下载:

给你,我刚刚下载并使用了它,效果很好!!!我不知道这是否回答了你的问题,但对我来说,这是一项无用的工作。

请随意编辑这篇文章,以便进行更正或更好地处理错误。我不是
.po
文件格式方面的专家,但我认为这能满足我的gettext需求。我认为我使用的唯一外部库是Newtonsoft的Json.NET。我不是狂热的附庸。它出现在谷歌上。如果您需要每3秒进行一次以上的翻译,我建议您使用不同的翻译API


输入文件: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 ""
输入命令:
>program.exe template.pot en_VE fr_fr


输出文件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"
  }
}
输出文件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"
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"
输出文件3:fr\u 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 "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"
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"

来源

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 = "your.em@il.com";
    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();
                }
            }
        }
    }
}
公共接口ICache
{
void Add(字符串语言、entry条目);
IEntry Get(字符串语言,字符串id);
字符串GetSerialized();
}
公共类JsonCache:ICache
{
专用字典缓存;
公共JsonCache(字符串json)
{
此缓存为。\u缓存=
json==null?
新字典():
反序列化对象(json);
}
公共void添加(字符串语言,IEntry条目)
{
如果(!this._cache.ContainsKey(语言))
{
此._cache.Add(语言,新字典());
}
var languageCache=this.\u cache[language];
languageCache.Add(entry.Id,entry.Value);
}
public-IEntry-Get(字符串语言,字符串id)
{
如果(!this._cache.ContainsKey(语言))
{
返回null;
}
var languageCache=this.\u cache[language];
输入结果=空;
if(languageCache.ContainsKey(id))
{
结果=新条目();
结果:Id=Id;
result.Value=languageCache[id];
}
返回结果;
}
公共字符串GetSerialized()
{
返回JsonConvert.Serialized对象(此.u缓存,格式化.Indented);
}
}
公共接口IReader:IDisposable
{
智能阅读();
}
公共类PoReader:IReader
{
私有流阅读器(StreamReader);;
公共PoReader(字符串文件名)
{
此._reader=新的StreamReader(文件名);
}
公共空间处置()
{
如果(此._读取器!=null)
{
这个。_reader.Dispose();
}
}
公共图书馆阅读()
{
var entry=新条目();
while(entry.Id==null | | entry.Value==null)
{
var line=这个。_reader.ReadLine();
如果(行==null)
{
返回null;
}
if(行StartsWith(常数StartComment))
{
entry.Comment=line.Substring(Constants.StartComment.Length);
}
else if(line.StartsWith(Constants.StartId))
{
entry.Id=line.Substring(Constants.StartId.Length);
//删除双引号。
entry.Id=entry.Id.Substring(1,entry.Id.Length-2);
}
else if(line.StartsWith(Constants.StartValue))
{
entry.Value=line.Substring(Constants.StartValue.Length);
//删除双引号。
entry.Value=entry.Value.Substring(1,entry.Value.Length-2);
}
}
//跳过第一个条目
if(entry.Id.Length==0)
{
返回这个。Read();
}
返回条目;
}
}
公共类CachedTranslator:ITranslator
{
私人ITranslator(译者);
专用ICache\u缓存;
公共缓存转换器(ICache缓存、ITranslator转换器)
{
这个。_translator=translator;
这个。_cache=cache;
}
公共IEntry翻译(字符串语言,IEntry条目)
{
var result=this.\u cache.Get(语言,entry.Id);
如果(结果==null)
{
结果=此._translator.Translate(语言,条目);
此._cache.Add(语言、结果);
}
其他的
{
//我们不想使用缓存的注释。
var clone=新条目();
clone.Comment=entry.Comment;
clone.Value=result.Value;
clone.Id=result.Id;
结果=克隆;
}
返回结果;
}
}
公共类法语翻译:ITranslator
{
私有字符串\u密码;
私人字符串\u电子邮件;
语言中的私有字符串;
公共法语Translator(字符串电子邮件、字符串密码、字符串语言)
{
这个。_email=电子邮件;
此密码为.\u password=password;
这个。_inLanguage=inLanguage;
}
公共IEntry翻译(字符串语言,IEntry条目)
{
var url=string.Format(“http://syslang.com?src={4} &dest={0}&text={1}&email={2}&password={3}&outformat=json“,
语言。子字符串(0,2),
条目.Id,
这是我的电子邮件,
这个