0

一个有趣的 Google 电子表格问题,我有一个基于 key=value 的语言文件,我已将其复制到电子表格中,例如。

titleMessage=Welcome to My Website
youAreLoggedIn=Hello #{user.name} you are now logged in
facebookPublish=Facebook Publishing

我设法将键/值分成两列,然后翻译值列,并用键重新加入它,瞧!这给了我一个翻译的语言文件

但是您可能已经发现其中有一些变量(例如#{user.name})是由我的应用程序注入的,显然我不想翻译它们。

所以这是我的问题,考虑到以下单元格内容......

Hello #{user.name} you are now logged in

是否有一个函数可以使用 TRANSLATE 函数翻译内容,但忽略 #{ } 中的任何内容(这可能在句子中的任何位置)

任何 Google 电子表格大师都可以为我提供解决方案吗?

非常感谢

4

3 回答 3

0

如果最多出现一次#{},那么您可以使用 SPLIT 函数将字符串分成三个部分,如下所示。

A           B                   C                 D           E
Original    =SPLIT(An, "#{}")   First piece       Tag         Rest of string
                                Translate         Keep as is  Translate

用 CONCATENATE 将这些部分放在一起。

=CONCATINATE(Cn,Dn,En)
于 2014-02-04T19:50:40.047 回答
0

您不能只是拆分和连接,因为不同的语言使用不同的主语/谓语/宾语等词序,还因为几种语言会根据它们在句子中的作用来修改具有不同前缀/后缀/拼写变化的名词。这一切都非常复杂。谷歌需要在我们想要引用而不是翻译的任何术语周围启用某种括号。

于 2021-08-28T22:57:40.787 回答
0

我想出了同样的问题。

假设转义模式是#{sth.sth}(在正则表达式中#{[\w.]+})。将它们替换为谷歌翻译认为不可翻译的字符串,如VAR.

翻译后,将术语替换为原始模式。

这是我在电子表格的脚本编辑器中执行此操作的方法:

function myTranslate(text, source_language, target_language) {
  if(text.toString()) {
    var str = text.toString();
    var regex = /#{[\w.]+}/g; // g flag for multiple matches
    var replace = 'VAR'; // Replace #{variable} to prevent from translation
    var vars = str.match(regex).reverse(); // original patterns
    str = str.replace(regex, replace);

    str = LanguageApp.translate(str, source_language, target_language);

    var ret = '';
    for (var idx = str.search(replace); idx; idx = str.search(replace)) {
      ret += str.slice(0, idx) + vars.pop();
      str = str.slice(idx+replace.length);
    }
    return ret;
  }
  return null;
}
于 2019-06-21T06:44:10.083 回答