diff --git a/sources/tech/20180720 Building a Messenger App- Conversation Page.md b/sources/tech/20180720 Building a Messenger App- Conversation Page.md
index 811dd3c60e..b249c2dcfb 100644
--- a/sources/tech/20180720 Building a Messenger App- Conversation Page.md
+++ b/sources/tech/20180720 Building a Messenger App- Conversation Page.md
@@ -7,31 +7,31 @@
[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/)
[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/)
-Building a Messenger App: Conversation Page
+构建一个即时消息应用(九):Conversation 页面
======
-This post is the 9th and last in a series:
+本文是该系列的第九篇,也是最后一篇。
- * [Part 1: Schema][1]
- * [Part 2: OAuth][2]
- * [Part 3: Conversations][3]
- * [Part 4: Messages][4]
- * [Part 5: Realtime Messages][5]
- * [Part 6: Development Login][6]
- * [Part 7: Access Page][7]
- * [Part 8: Home Page][8]
+ * [第一篇: 模式][1]
+ * [第二篇: OAuth][2]
+ * [第三篇: 对话][3]
+ * [第四篇: 消息][4]
+ * [第五篇: 实时消息][5]
+ * [第六篇: 仅用于开发的登录][6]
+ * [第七篇: Access 页面][7]
+ * [第八篇: Home 页面][8]
-In this post we’ll code the conversation page. This page is the chat between the two users. At the top we’ll show info about the other participant, below, a list of the latest messages and a message form at the bottom.
+在这篇文章中,我们将对对话页面进行编码。此页面是两个用户之间的聊天室。在顶部我们将显示其他参与者的信息,下面接着的是最新消息列表,以及底部的消息表单。
-### Chat heading
+### 聊天标题
![chat heading screenshot][9]
-Let’s start by creating the file `static/pages/conversation-page.js` with the following content:
+让我们从创建 `static/pages/conversation-page.js` 文件开始,它包含以下内容:
-```
+```js
import http from '../http.js'
import { navigate } from '../router.js'
import { avatar, escapeHTML } from '../shared.js'
@@ -65,17 +65,17 @@ function getConversation(id) {
}
```
-This page receives the conversation ID the router extracted from the URL.
+此页面接收路由从 URL 中提取的会话 ID。
-First it does a GET request to `/api/conversations/{conversationID}` to get info about the conversation. In case of error, we show it and redirect back to `/`. Then we render info about the other participant.
+首先,它向 `/api/ conversations/{conversationID}` 发起一个 GET 请求,以获取有关对话的信息。 如果出现错误,我们会将其显示,并重定向回 `/`。然后我们呈现有关其他参与者的信息。
-### Conversation List
+### 对话列表
![chat heading screenshot][10]
-We’ll fetch the latest messages too to display them.
+我们也会获取最新的消息并显示它们。
-```
+```js
let conversation, messages
try {
[conversation, messages] = await Promise.all([
@@ -85,32 +85,32 @@ try {
}
```
-Update the `conversationPage()` function to fetch the messages too. We use `Promise.all()` to do both request at the same time.
+更新 `conversationPage()` 函数以获取消息。我们使用 `Promise.all()` 同时执行这两个请求。
-```
+```js
function getMessages(conversationID) {
return http.get(`/api/conversations/${conversationID}/messages`)
}
```
-A GET request to `/api/conversations/{conversationID}/messages` gets the latest messages of the conversation.
+发起对 `/api/conversations/{conversationID}/messages` 的 GET 请求可以获取对话中的最新消息。
-```
+```html
```
-Now, add that list to the markup.
+现在,将该列表添加到标记中。
-```
+```js
const messagesOList = page.getElementById('messages')
for (const message of messages.reverse()) {
messagesOList.appendChild(renderMessage(message))
}
```
-So we can append messages to the list. We show them in reverse order.
+这样我们就可以将消息附加到列表中了。我们以时间倒序来显示它们。
-```
+```js
function renderMessage(message) {
const messageContent = escapeHTML(message.content)
const messageDate = new Date(message.createdAt).toLocaleString()
@@ -127,28 +127,28 @@ function renderMessage(message) {
}
```
-Each message item displays the message content itself with its timestamp. Using `.mine` we can append a different class to the item so maybe you can show the message to the right.
+每个消息条目显示消息内容本身及其时间戳。使用 `.mine`,我们可以将不同的 css 类附加到条目,这样您就可以将消息显示在右侧。
-### Message Form
+### 消息表单
![chat heading screenshot][11]
-```
+```html
```
-Add that form to the current markup.
+将该表单添加到当前标记中。
-```
+```js
page.getElementById('message-form').onsubmit = messageSubmitter(conversationID)
```
-Attach an event listener to the “submit” event.
+将事件监听器附加到 “submit” 事件。
-```
+```js
function messageSubmitter(conversationID) {
return async ev => {
ev.preventDefault()
@@ -191,19 +191,20 @@ function createMessage(content, conversationID) {
}
```
-We make use of [partial application][12] to have the conversation ID in the “submit” event handler. It takes the message content from the input and does a POST request to `/api/conversations/{conversationID}/messages` with it. Then prepends the newly created message to the list.
-### Messages Subscription
+我们利用 [partial application][12] 在 “submit” 事件处理程序中获取对话 ID。它 从输入中获取消息内容,并用它对 `/api/conversations/{conversationID}/messages` 发出 POST 请求。 然后将新创建的消息添加到列表中。
-To make it realtime we’ll subscribe to the message stream in this page also.
+### 消息订阅
-```
+为了实现实时,我们还将订阅此页面中的消息流。
+
+```js
page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID)))
```
-Add that line in the `conversationPage()` function.
+将该行添加到 `conversationPage()` 函数中。
-```
+```js
function subscribeToMessages(cb) {
return http.subscribe('/api/messages', cb)
}
@@ -229,14 +230,14 @@ function readMessages(conversationID) {
}
```
-We also make use of partial application to have the conversation ID here.
-When a new message arrives, first we check if it’s from this conversation. If it is, we go a prepend a message item to the list and do a POST request to `/api/conversations/{conversationID}/read_messages` to updated the last time the participant read messages.
+在这里我们仍然使用 partial application 来获取会话 ID。
+当新消息到达时,我们首先检查它是否来自此对话。如果是,我们会将消息条目预先添加到列表中,并向`/api/conversations/{conversationID}/read_messages`发起 POST 一个请求,以更新参与者上次阅读消息的时间。
* * *
-That concludes this series. The messenger app is now functional.
+本系列到此结束。 Messenger app 现在可以运行了。
-~~I’ll add pagination on the conversation and message list, also user searching before sharing the source code. I’ll updated once it’s ready along with a hosted demo 👨💻~~
+~~我将在对话和消息列表中添加分页功能,并在共享源代码之前添加用户搜索。我会在准备好的时候和托管的演示👨💻一起更新它~~
[Souce Code][13] • [Demo][14]
@@ -246,7 +247,7 @@ via: https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/
作者:[Nicolás Parada][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
+译者:[gxlct008](https://github.com/gxlct008)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出