原创Odoo开发文档学习之:构建接口扩展(BuildingInterfaceExtensions)(边Google翻译边学习)A·DONG

本指南是关于为Odoo的web客户创建模块。

警告:该指南需要以下知识:Javascript、jQuery、Underscore.js同时也需要安装Odoo和Git。一个简单的模型让我们从一个简单的Odoo模块开始,它包含基本的web组件配置,并让我们测试web框架。示例模块可以在线下载,可以使用以下命令下载:

如果您浏览petstore文件夹,您应该看到以下内容:

在Odoo模块的“web”端中使用的文件必须放置在静态文件夹中,这样它们就可以在web浏览器中使用,而浏览器之外的文件也不能被浏览器获取。src/css、src/js和src/xml子文件夹是常规的,并不是绝对必要的。

oepetstore/static/css/petstore.css目前为空,将为宠物店(petstore)内容保留CSS。

oepetstore/static/xml/petstore.xml大部分也是空的,将保存QWeb模板。

oepetstore/static/js/petstore.js最重要(也是最有趣的)部分,包含javascript应用程序的逻辑(或者至少是它的web浏览器端)。它现在应该是:

openerp.oepetstore=function(instance,local){//特别注意:红色部分在开发文档中10.0版本中用odoo关键字,但是测试时无法通过,必须是openerp,估计是尚未完全支持odoo关键字var_t=instance.web._t,_lt=instance.web._lt;varQWeb=instance.web.qweb;local.HomePage=instance.Widget.extend({start:function(){console.log("petstorehomepageloaded");},});instance.web.client_actions.add('petstore.homepage','instance.oepetstore.HomePage');}它只在浏览器的控制台打印一个小消息。

静态文件夹中的文件,需要在模块中定义,以便正确加载它们。src/xml中的所有内容都在__manifest.__中定义。在petstore.xml或类似的文件中定义或引用src/css和src/js的内容。

当Web客户端加载你的模块时,它会调用根函数并提供两个参数:

第一个参数(instance)是OdooWeb客户端的当前实例,它允许访问由Odoo(网络服务)定义的各种功能以及由内核或其他模块定义的对象。

第二个参数(local)是您自己的本地名称空间,由Web客户端自动创建。应该可以从模块外部访问的对象和变量(无论是因为OdooWeb客户端需要调用它们,还是因为其他人可能想要定制它们)应该在该名称空间内设置。

就像模块一样,并且与大多数面向对象的语言相反,JavaScript不会构建在classes中,尽管它提供了大致相同(如果是较低级别和更详细的)机制。

为了简单和开发人员友好,Odooweb提供了一个基于JohnResig的简单JavaScript继承的类系统。

通过调用odoo.web.Class()的extend()方法来定义新的类:

varMyClass=instance.web.Class.extend({say_hello:function(){console.log("hello");},});extend()方法需要一个描述新类的内容(方法和静态属性)的字典。在这种情况下,它只会有一个不带参数的say_hello方法。

类使用new运算符实例化:

varmy_object=newMyClass();my_object.say_hello();//print"hello"intheconsole实例的属性可以通过以下方式this访问:

varMyClass=instance.web.Class.extend({say_hello:function(){console.log("hello",this.name);},});varmy_object=newMyClass();my_object.name="Bob";my_object.say_hello();//print"helloBob"intheconsole通过定义init()方法,类可以提供初始化程序来执行实例的初始设置。初始化程序接收使用新运算符时传递的参数:

varMyClass=instance.web.Class.extend({init:function(name){this.name=name;},say_hello:function(){console.log("hello",this.name);},});varmy_object=newMyClass("Bob");my_object.say_hello();//print"helloBob"intheconsole也可以通过在父类上调用extend()来创建现有(使用定义的)类的子类,如同子类Class()所做的那样:

varMySpanishClass=MyClass.extend({say_hello:function(){console.log("hola",this.name);},});varmy_object=newMySpanishClass("Bob");my_object.say_hello();//print"holaBob"intheconsole当使用继承覆盖方法时,可以使用this._super()调用原始方法:

varMySpanishClass=MyClass.extend({say_hello:function(){//已覆盖的方法this._super();//调用父类中的原始方法,即“hello。。。”console.log("translationinSpanish:hola",this.name);},});varmy_object=newMySpanishClass("Bob");my_object.say_hello();//print"helloBob\ntranslationinSpanish:holaBob"intheconsole警告_super不是一个标准的方法,它被设置为当前继承链中的一个方法(如果有的话)。它只在方法调用的同步部分中定义,用于异步处理程序(在网络调用或setTimeout回调之后)应该保留对其值的引用,因此不应通过以下方式访问它:

//以下调用会产生错误say_hello:function(){setTimeout(function(){this._super();}.bind(this),0);}//以下方式正确say_hello:function(){//不能忘记.bind()var_super=this._super.bind(this);setTimeout(function(){_super();}.bind(this),0);}Widgets基础Odooweb客户端捆绑了jQuery以实现简单的DOM操作。它比标准的W3CDOM2更有用,并且提供了更好的API,但不足以构成复杂的应用程序,导致难以维护。很像面向对象的桌面UI工具包(例如Qt,Cocoa或GTK),OdooWeb使特定组件负责页面的各个部分。在Odoo网站中,这些组件的基础是Widget()类,它是专门处理页面部分并显示用户信息的组件。

初始演示模块已经提供了一个基本的widget:

local.HomePage=instance.Widget.extend({start:function(){console.log("petstorehomepageloaded");},});它扩展了Widget()并重载了标准方法start(),它与之前的MyClass很像,现在做的很少。

该行在文件末尾:

instance.web.client_actions.add('petstore.homepage','instance.oepetstore.HomePage');将我们的widget注册为客户端操作。客户端操作将在稍后解释,现在这只是当我们选择PetStorePetStoreHomePage菜单时,可以调用和显示我们的窗口小部件。

警告

由于该组件将从我们的模块外部调用,Web客户端需要其“完全限定(规范)”名称,而不是任意名称。

local.HomePage=instance.Widget.extend({start:function(){this.$el.append("

HellodearOdoouser!
");},});当您打开PetStorePetStoreHomePage时,此消息将显示。

注意

要刷新OdooWeb中加载的JavaScript代码,您需要重新加载页面(升级一下模块)。没有必要重新启动Odoo服务器。

HomePageWidget由OdooWeb使用并自动管理。要学习如何从头开始使用Widget,我们来创建一个新Widget:

local.GreetingsWidget=instance.Widget.extend({start:function(){this.$el.append("

Wearesohappytoseeyouagaininthismenu!
");},});现在我们可以使用GreetingsWidget的appendTo()方法将我们的GreetingsWidget添加到主页:

local.HomePage=instance.Widget.extend({start:function(){this.$el.append("

HellodearOdoouser!
");vargreeting=newlocal.GreetingsWidget(this);returngreeting.appendTo(this.$el);},});HomePage首先将其自己的内容添加到其DOM根目录;

HomePage然后实例化GreetingsWidget;

最后,它告诉GreetingsWidget将自己的部分插入到GreetingsWidget中。

当调用appendTo()方法时,它会要求小部件(widget,以下将的小部件就是widget)将自身插入指定位置并显示其内容。在调用appendTo()期间,将调用start()方法。

要查看显示界面下发生了什么,我们将使用浏览器的DOMExplorer。但首先让我们稍微修改我们的小部件,以便通过向它们的根元素添加一个类来更轻松地找到它们的位置:

HellodearOdoouser!
Wearesohappytoseeyouagaininthismenu!
它清楚地显示了由Widget()自动创建的两个
元素,因为我们在它们上面添加了一些类。

我们也可以看到我们自己添加的两个消息控制器。

最后,注意GreetingsWidget实例的元素位于代表HomePage实例的中,这是因为我们追加了该元素。

在上一部分中,我们使用以下语法实例化了一个小部件:

newlocal.GreetingsWidget(this);//括号内对象是指greetingswidget实例化后归谁所有。第一个参数是this,在这种情况下是一个HomePage实例。这告诉小部件被创建,其他小部件是其父项。

正如我们所看到的,小部件通常由另一个小部件插入到DOM中,并在其他小部件的根元素内插入。这意味着大多数小部件是另一个小部件的“部分”,并代表它存在。我们将容器称为父项,并将包含的小部件称为子项。

由于技术和概念上的多重原因,小部件有必要知道谁是其父类以及谁是子类。

getParent()可以用来获取小部件的父级:

local.GreetingsWidget=instance.Widget.extend({start:function(){console.log(this.getParent().$el);//willprint"div.oe_petstore_homepage"intheconsole},});getChildren()可以用来获取其子女的名单:

local.HomePage=instance.Widget.extend({start:function(){vargreeting=newlocal.GreetingsWidget(this);greeting.appendTo(this.$el);console.log(this.getChildren()[0].$el);//willprint"div.oe_petstore_greetings"intheconsole},});当重写小部件的init()方法时,将父项传递给this._super()调用是非常重要的,否则关系将无法正确设置:

local.GreetingsWidget=instance.Widget.extend({init:function(parent,name){this._super(parent);this.name=name;},});最后,如果小部件没有父项(例如,因为它是应用程序的根小部件),则可以将null作为父项提供:

newlocal.GreetingsWidget(null);销毁Widget如果您可以向用户显示内容,则应该也可以将其删除。这是通过destroy()方法完成的:

greeting.destroy();当一个小部件被销毁时,它将首先对其所有子项调用destroy()。然后它从DOM中删除自己。如果你已经在init()或start()中设置了永久结构,必须明确清除它们(因为垃圾回收器不会处理它们),你可以重写destroy()。

危险

当覆盖destroy()时,必须始终调用_super(),否则即使没有显示错误,小部件及其子项也没有正确清理,从而可能会发生内存泄漏和“意想不到的事件”。

在上一节中,我们通过直接操作(并添加)DOM来将内容添加到我们的小部件:

this.$el.append("

HellodearOdoouser!
");这允许生成和显示任何类型的内容,但在生成大量DOM时会很难处理(大量重复,引用问题......)。

与许多其他环境一样,Odoo的解决方案是使用模板引擎。Odoo的模板引擎被称为QWeb。

QWeb是一种基于XML的模板语言,与Genshi,Thymeleaf或Facelets类似。它具有以下特点:

使用QWeb代替现有的JavaScript模板引擎的原理是预先存在的(第三方)模板的可扩展性,就像Odoo视图一样。

大多数JavaScript模板引擎是基于文本的,这排除了容易的结构可扩展性,其中基于XML的模板引擎可以通过使用例如通用数据库XPath或CSS以及树型变更DSL(甚至只是XSLT)。这种灵活性和可扩展性是Odoo的核心特征,丢失它被认为是不可接受的。

首先让我们在几乎空白的地方定义一个简单的QWeb模板,在以下文件进行操作:

oepetstore/static/src/xml/petstore.xml

ThisissomesimpleHTML

现在我们可以在HomePage小部件中使用这个模板。使用页面顶部定义的QWeb加载器变量,我们可以调用XML文件中定义的模板:local.HomePage=instance.Widget.extend({start:function(){this.$el.append(QWeb.render("HomePageTemplate"));},});QWeb.render()查找指定的模板,将其呈现为一个字符串并返回结果。

但是,因为Widget()对QWeb有特殊的集成,所以模板可以通过它的模板属性直接设置在Widget上:

local.HomePage=instance.Widget.extend({template:"HomePageTemplate",start:function(){...},});尽管结果看起来相似,但这些用法之间有两点区别:

QWeb模板可以被赋予数据并且可以包含基本的显示逻辑。

对于显式调用QWeb.render(),模板数据作为第二个参数传递:

QWeb.render("HomePageTemplate",{name:"Klaus"});将模板修改为:

Hello
最终结果为:

HelloKlaus
当使用Widget()的集成时,不可能为模板提供额外的数据。该模板将被赋予一个单一的窗口小部件上下文变量,引用在start()被调用之前被渲染的窗口小部件(窗口小部件的状态基本上是由init()设置的):

Hello
local.HomePage=instance.Widget.extend({template:"HomePageTemplate",init:function(parent){this._super(parent);this.name="Mordecai";},start:function(){},});结果为:

t-esc指令可用于输出文本:

Hello
它需要一个经过评估的Javascript表达式,然后表达式的结果被HTML转义并插入到文档中。由于它是一个表达式,因此可以像上面那样仅提供一个变量名称,或者像计算这样的更复杂的表达式:

或方法调用:

输出HTML要在呈现的页面中注入HTML,请使用t-raw。像t-esc一样,它以一个任意的Javascript表达式作为参数,但它不执行HTML转义步骤。

QWeb可以使用t-if的条件块。该指令采用任意表达式,如果表达式为falsy(false,null,0或空字符串),则整个块将被抑制,否则将显示该表达式。

trueistruetrueisnottrue
注意QWeb没有“else”结构,如果原始条件反转,则使用第二个t。如果它是复杂或昂贵的表达式,您可能需要将条件存储在局部变量中。

要在列表上迭代,请使用t-foreach和t-as。t-foreach需要一个表达式返回一个列表来迭代t-因为在迭代过程中需要一个变量名来绑定到每个项目。

Hello
注意t-foreach也可以用于数字和对象(字典)。

t-att-接受一个javascript表达式,其结果被设置为属性的值,如果计算该属性的所有值,则它是非常有用的:

Inputyourname:
t-attf-采用格式字符串。格式字符串是带有插值块的文本文本,插值块是{{和}}之间的javascript表达式,它将被表达式的结果替换。对于部分文字和部分计算的属性(如类),这是最有用的:

insertcontenthere

调用其他模板模板可以拆分成子模板(为了简单,可维护性,可重用性或避免过多的标记嵌套)。

这是通过使用t-call指令完成的,该指令采用要呈现的模板的名称:

渲染A模板将导致:

子模板继承其调用者的渲染上下文。

在Widgets创建一个构件除了parent:product_names和color之外还有两个参数的构件。

odoo.oepetstore=function(instance,local){var_t=instance.web._t,_lt=instance.web._lt;varQWeb=instance.web.qweb;local.HomePage=instance.Widget.extend({start:function(){varproducts=newlocal.ProductsWidget(this,["cpu","mouse","keyboard","graphiccard","screen"],"#00FF00");products.appendTo(this.$el);},});local.ProductsWidget=instance.Widget.extend({template:"ProductsWidget",init:function(parent,products,color){this._super(parent);this.products=products;this.color=color;},});instance.web.client_actions.add('petstore.homepage','instance.oepetstore.HomePage');}

小部件的jQuery选择器

在窗口小部件中选择DOM元素可以通过调用窗口小部件的DOM根目录上的find()方法来执行:

this.$el.find("input.my_input")...但是由于这是一种常见的操作,Widget()通过$()方法提供了一个等效的快捷方式:

local.MyWidget=instance.Widget.extend({start:function(){this.$("input.my_input")...},});警告全局jQuery函数$()应该永远不会被使用(不是this.$()),除非它是绝对必要的:对一个小部件的根进行选择的范围是小部件,对本地来说是本地的,但是使用$()的选择对于页面/应用程序是全局的,并且可以匹配部分其他小部件和视图,导致奇怪或危险的副作用。由于小部件通常只应用于其拥有的DOM部分,因此没有全局选择的原因。

我们以前使用常规jQuery事件处理程序(例如,.click()或.change())在窗口小部件元素上绑定了DOM事件:

local.MyWidget=instance.Widget.extend({start:function(){varself=this;this.$(".my_button").click(function(){self.button_clicked();});},button_clicked:function(){..},});虽然这有效,但它有一些问题:

小部件因此提供了通过事件绑定DOM事件的捷径:

local.MyWidget=instance.Widget.extend({events:{"click.my_button":"button_clicked",},button_clicked:function(){..}});event是事件触发时调用的函数或方法的对象(映射):

关键是一个事件名称,可能使用CSS选择器进行优化,在这种情况下,只有当事件发生在选定的子元素上时,函数或方法才会运行:点击将处理小部件内的所有点击,但单击.my_button将只处理点击含有my_button类的元素。

该值是触发事件时要执行的操作。

它也可以这样描述:

events:{'click':function(e){/*codehere*/}}或对象上方法的名称(请参见上面的示例)。

无论哪种情况,这都是小部件实例,并且处理程序被赋予一个参数,即事件的jQuery事件对象。

小部件提供了一个事件系统(与上面描述的DOM/jQuery事件系统分开):一个小部件可以触发自身的事件,其他小部件(或其本身)可以绑定自己并监听这些事件:

local.ConfirmWidget=instance.Widget.extend({events:{'clickbutton.ok_button':function(){this.trigger('user_chose',true);},'clickbutton.cancel_button':function(){this.trigger('user_chose',false);}},start:function(){this.$el.append("

Areyousureyouwanttoperformthisaction
"+"Ok"+"Cancel");},});trigger()将触发事件的名称作为其第一个(必需)参数,任何其他参数都视为事件数据并直接传递给侦听器。

然后,我们可以设置一个父事件来实例化我们的通用小部件,并使用on()来监听user_chose事件:

start:function(){varwidget=...widget.on("my_event",this,this.my_event_triggered);widget.trigger("my_event",1,2,3);},my_event_triggered:function(a,b,c){console.log(a,b,c);//willprint"123"}提示:

触发其他小部件上的事件通常是一个坏主意。该规则的主要例外是odoo.web.bus,它专门用于广播任何小部件可能对整个OdooWeb应用程序感兴趣的平台。

THE END
1.翻译在线在线翻译器文字翻译即时提供简体中文、繁体中文、英文、阿拉伯语、德语、法语、葡萄牙语、西班牙语、意大利语、韩语的互译服务,支持在办公、旅游、交流等场景中使用,支持直接播放翻译前与翻译后的文本内容,并提供翻译后文本的复制操作,可协助不同语种人群之间的沟通,提升交流效率。 http://voice.xunjiepdf.com/fanyi/
2.版本,新增同声传译等功能wifi同声传译命令提示符手机翻译IT之家 12 月 7 日消息,荣耀俱乐部显示,荣耀 Magic5 系列现已分批推送 9.0.0.128 版本,本次更新新增同声传译功能和对话翻译持续收音功能,修复部分场景异常耗电问题,提升系统稳定性和性能。IT之家整理详情如下: 打开网易新闻 查看精彩图片 一、版本推送时间 2024 年 12 月 6 日:开启正式版本升级尝鲜并开始分批https://m.163.com/dy/article/JIR60MKO0511B8LM.html
3.音频翻译器在线翻译哪家强?3分钟揭秘5个音频翻译的好帮手音频翻译器?伍?Alllanguage VoiceTranslator Alllanguage VoiceTranslator这个名字听起来就给人一种无所不能的感觉。【功能展示】这个软件确实覆盖了相当广泛的语言种类,几乎涵盖了全球主要使用的各种语言。除了基本的语音到文本翻译外,另外,Alllanguage VoiceTranslator还支持自定义设置,可以根据个人喜好调整发音速度和https://baijiahao.baidu.com/s?id=1817568646454541050&wfr=spider&for=pc
4.听力翻译在线(听力翻译)导读目前关于大家提出的听力翻译在线这个问题,那么小编今天就去收集了一些听力翻译相关的内容来分享给大家。1、但是这个一点都不影响,你可以同时下载一个欧路词典app.边听每日英语听力,因为装 目前关于大家提出的听力翻译在线这个问题,那么小编今天就去收集了一些听力翻译相关的内容来分享给大家。 https://www.00rr.com/gaozhi/202412/389920.html
5.边听边说是什么意思边听边说的翻译音标读音用法例句爱词霸权威在线词典,为您提供边听边说的中文意思,边听边说的用法讲解,边听边说的读音,边听边说的同义词,边听边说的反义词,边听边说的例句等英语服务。https://m.iciba.com/%E8%BE%B9%E5%90%AC%E8%BE%B9%E8%AF%B4
6.什么意思?中文翻译英文,英文翻译中文,怎么说?单词翻译 短句翻译 长句翻译 在线朗读 同步翻译 英语培训当前位置:首页 ? 翻译 匿名 关注:1 2013-05-23 12:21 求翻译:它还可以边看书边听音乐是什么意思?待解决 悬赏分:1 - 离问题结束还有 它还可以边看书边听音乐问题补充:匿名 2013-05-23 12:21:38 It can also be side reading a book whilehttp://www.zaixian-fanyi.com/fan_yi_9048969
7.有什么同声翻译软件可以一边听一边翻译出来。?同样是在实时识别语音内容并同步给出译文,实测下载翻译的精度和速度都在线。https://www.zhihu.com/question/454254856/answer/3181871125
8.一边听音乐一边工作用英文怎么翻译边听音乐边工作会影响工作效率吗? 一边听歌一边写作业,其实是影响思考的,需要动脑的工作,有音乐的存在,反而是种干扰,不 音乐完全就是干扰的,除非题简单,也会做,不用 走不一样的路线用英文怎么翻译 翻译为:Can't walk the same route 文字在线翻译电脑端翻译工具_智能AI翻译 文字在线翻译好用的电脑端https://wenda.so.com/q/1683443545213083
9.沉浸式六级翻译训练第123弹!本期主题“宋朝”哔哩哔哩沉浸式六级翻译训练第九十弹!本期主题“腊八节” 04:33 沉浸式六级翻译训练第九十一弹!本期主题“光棍节” 04:33 沉浸式六级翻译训练第九十二弹!本期主题“亚健康” 04:33 沉浸式六级翻译训练第九十三弹!本期主题“吸烟” 04:06 沉浸式六级翻译训练第九十四弹!本期主题“断舍离” 04:38 沉浸式六级翻https://www.bilibili.com/video/BV1nhqzY1ERk/
10.英语听力的技巧听的当中遇到生词不要停下多想,因为有些生词可以在整个内容中理解。有些生词并不影响理解意思,可以不管,停下来想,反而影响听下面的内容。听音时要随着录音材料的频率在脑中用英语重复,而且速度要练得能跟上录音速度,不能边听边翻译。一般只要难度相当,能听清大部分单词,是可以理解其大意的。http://mip.pincai.com/article/2461474.htm
11.边听边说的英文边听边说翻译边听边说英语怎么说海词词典,最权威的学习词典,专业出版边听边说的英文,边听边说翻译,边听边说英语怎么说等详细讲解。海词词典:学习变容易,记忆很深刻。http://dict.cn/%E8%BE%B9%E5%90%AC%E8%BE%B9%E8%AF%B4
12.边听边说的英文翻译边听边说英文怎么说?边听边说中文 边听边说 英文 【计】 listen while talk最新查询: 辱骂 辱骂的 辱骂者 边 边值 边值关系 边值定理 边值问题 边内回 边写边读 边列 边列表法 边割集 边区 边区法院 边卡 边双连通图 边反卷地 边吊机 边向量 边图 边塞 边境 边境交货 边境交货价 边境冲突 边境协定 边境居民 边境所有权 边境https://hanyingcidian.bmcx.com/biantingbianshuo__hanyingshow/
13.www.ounistar.com/appnode29937553.shtml男人边吻奶边挵进去AV片 亚洲无码天堂 21.57MB 823好评 张津瑜VS吕总视频外网 日本黄在线观看极品教师高清免费观看中文翻译 82.23MB 29%好评28人) 免费黄色的三级片 苏雪小说外卖免费阅读 宝贝我太喜欢听你叫了 33.98MB 76%好评39人) 美女被男人草出水的,软件 新版猫咪猫咪必火官网 https://www.ounistar.com/appnode29937553.shtml
14.思考听力的时候常常情不自禁在脑子里边听边翻译成中文怎么办?听力上的这个问题算是很普遍的了,我最开始学英语的时候,做听力题目就是把听到的翻译成中文关键词,然后以火急火燎的心情和乌龟一样的速度再找其对应的英文答案。 做完听力,基本上就是虚脱了,后面还有大半张试卷,就有一种越过山丘,还有山脉的感觉。(有同感的老铁,请在评论区写下你的山脉到底是落基山脉,还是喜马https://www.douban.com/note/636497250/
15.日文翻译软件中文翻译日文软件下载日语边听边翻译的软件多特软件站为您提供做最新日文翻译软件专题,在这里安卓版苹果版等应用应有尽有,找最新日文翻译软件就来多特软件站。 更新时间:2024-08-13 全部软件电脑软件手机软件 鸿安翻译软件 大小:平台:电脑 推荐理由:鸿安翻译软件是一款快速.方便快捷.高效率.精确的迷你型实时翻译专用工具,程序流程选用迅速的动态性汉语翻译技术https://www.duote.com/zt/ruanjian33/
16.www.oxfam.org.cn/apfnode80567338.shtml鬼父第一季在线观看免费完整番外翻译 970.10MB 301好评 国产猛男GAYB0Y1069视频 小说区图片区图片区另类灬 小黄人视频日本在线观看 98.07MB 227好评 边摸边亲奶边做爽视频在线观看 工棚嫖j系列看起来能有70 61.28MB 366好评 欧美人与禽2O2O性论交 gogo亚洲肉体艺术照片9090 WRITE AS撅好 909.6https://www.oxfam.org.cn/apfnode80567338.shtml
17.将纸分成九格,然后教师随便念九个学过的单词,学生边听边将单词英语翻译(bingo游戏规则)每个学生准备一张纸,并在上面画一个井字,将纸分成九格,然后教师随便念九个学过的单词,学生边听边将单词写在格子中,随便填在哪格里都好.学生填好后,教师再打扰次序逐个念这九个单词,学生边听边在听到单词上画圈,当画的圈在横行、竖行或对角线上成为一条直线时,学生就可边喊“宾狗(https://qb.zuoyebang.com/xfe-question/question/ab575fefd516b2b40563459da19ce50e.html
18.日语翻译N1语法边听边记ならでは2用「~ならでは」的方式,表示感慨「如果不是~则不可能的,只有~可以做得到」的时候,使用本句型。「~ならではの」中的「の」是代替「見られない、できない」等动词。 注:题号不需听写。动词只提供原形。 ヒント: 书写方式参考:【听写规范】听写稿常见规范说明(2013修订版) https://jp.hjenglish.com/riyufanyi/p614497/
19.IT之家评测室科大讯飞录音笔B1体验:小巧便捷,功能丰富3、边转写,边同声传译 除了能实时转文字,讯飞录音笔 B1 还能一边录音一边翻译一边转文字,这个功能就比较厉害了。 IT之家在同样场景下也录了一段演示视频: 可以看到,讯飞录音笔 B1 在转写的同时还将英文翻译成了中文,从结果上看,无论英文转写还是中文翻译,都能够做到语义通顺,对于不懂英文的用户来说,大体看下来https://www.ithome.com/0/520/744.htm
20.好用的论文翻译工具集锦看文献用的英文自动翻译csdn这个和侧边翻译比较类似,不用科学上网就可以获取,不过听说以后会收费,现在不收费,有电脑客户端可以下载使用(无linux版本),在线版是一个网页,需要使用微信扫码关注一个公账号进行登录使用。与侧边翻译相比,有更多的翻译源可以使用(侧边翻译为谷歌和有道)。 https://blog.csdn.net/qq_38863413/article/details/103486682
21.英语翻译N2语法边听边记つつある3【N2语法边听边记】つつある3 2014-03-28 15:00 本文支持点词翻译 Powered by 沪江小D语法点:つつある 日文意思:今ちょうど~している 中文意思:现在正在进行~ Vます去ます+つつある (1)事物正向某个方向前进之意。特别是在想要确切地表达正在行进过程中之意时,使用本句型。(2)通常于会话中不用。 http://m.hujiang.com/en_fanyi/p611950/