この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Confluence CloudのAppを作ってAmazon Translateにつなげてみました。 それで、簡単にDemoをする記事を作成してみました。
目標
Amazon Translateを利用してConflueceの自動翻訳することです。
大きく
1.ACE(Attlasian Connect Express)を利用してConfluece Appを実装
2.Amazon API Gateway + AWS Lambda + Amazon Translateを利用してAPI Serverを構成
ですが、今回の記事ではACEを主に扱って見ます。
Getting started
ACE(Attlasian Connect Express)とは
Atlassian Connect App構築のためのNode.js Toolkitです。
- Node.js 12.1.0以上
- npm
を準備してください。
npm install -g atlas-connect
atlas-connect new [project name]
npm install
次は
- credentials.json作成
{
"hosts":{
"[your confluece domain]":{
"product":"confluence",
"username":"[your email]",
"password":"[your API token]"
}
}
}
- your confluence domain : つなげたいConfluenceのdomainを登録します。
- username: 自分のemailを登録します。
- password: API tokenを登録します。
- 一番簡単な方法はAPI Tokenを通じてTokenをもらう方法です。
登録したconfluece domainに移動 Confluence Cloud Developer Getting startedの Step2を通じてEnable developement modeを選択してください。
最後に
npm start
基本的な開発環境の構成はこれで終わりです。
ACE(attlasian Connect Express)作成
三つのファイルだけ触ってみましょう。
modules
まず、modulesを見る前にatlassian-connect.jsonを簡単にみます。
atlassian-connect.json
{
"key": "Translate",
"name": "Confluence Translate",
"description": "Translate for Confluence",
"vendor": {
"name": "Confluence Tutorials",
"url": "https://www.atlassian.com/"
},
"baseUrl": "{{localBaseUrl}}",
"links": {
"self": "{{localBaseUrl}}/atlassian-connect.json",
"homepage": "{{localBaseUrl}}/atlassian-connect.json"
},
"authentication": {
"type": "jwt"
},
"lifecycle": {
"installed": "/installed"
},
"scopes": [
"READ",
"WRITE"
],
"modules": {
}
}
Confluence Cloud Developer Getting startedの Step2の通り移動してください。
まず、key,name,description,vendorはappの情報を設定します。
- baseUrl:App instanceに関する通信に使用するAPPの基本URLです。
- links:アプリに投稿しようとするリンク集合
- authentication:つなげたConflueceとの認証形式を正義します。
- lifecycle: 設置した時呼ぶCallback endPoint、詳細な情報はApp descriptor-Lifecycleを参考してください。
- scopes:[READ,WRITE]:情報をRead,Writeすることができます。Deleteはできません。と考えばいいです。詳細な情報はScopes for Atlassian Connect appsを参考してください。
では、modulesを作成して見ます。
"modules": {
"contentBylineItems": [
{
"context": "addon",
"target": {
"type": "inlinedialog",
"options": {
"height": "100px",
"width": "200px"
}
},
"tooltip": {
"value": "Page Translate"
},
"name": {
"value": "Page Translate"
},
"key": "category",
"url": "/category?contentId={content.id}&spaceKey={space.key}"
}
],
}
routes
routes -> index.js
app.get('/translate', addon.authenticate(),(req, res) => {
res.render('translate',{
spaceKey: req.query['spaceKey'],
contentId: req.query['contentId']
});
});
queryはmodulesのurlを設定したあともらうことができます。
"url": "/translate?contentId={content.id}&spaceKey={space.key}"
views
簡単です。 index.jsのres.renderはviewの中のファイルを選択します。
ではtranslate.hbsファイルを作ってください。
{{!< layout}}
<form>
<label>sourceLang</label>
<select id="sourceLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<label>TranslateLang</label>
<select id="translateLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<input id="submit" type="button" value="submit">
</form>
Confluence Rest API
Confluence CloudのRest APIを利用してConflueceの下ページを作ってみます。
Confluence Cloud REST APIの詳細な内容は
Confluence Cloud REST APIを参考してください。
ここではConfluence Cloud JavaScript APIを利用してみます。
{{!< layout}}
<form>
<label>sourceLang</label>
<select id="sourceLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<label>TranslateLang</label>
<select id="translateLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<input id="submit" type="button" value="submit">
</form>
<script>
$(function(){
$('#submit').on('click',function(){
let jsonData = {
"type": "page",
"space": {
"key": "{{spaceKey}}"
},
"ancestors":[
{
"id":"{{contentId}}"
}
],
"title": "create page test",
"body": {
"storage": {
"value": "creat page test",
"representation": "storage"
}
}
};
AP.request({
url:"/rest/api/content",
type:"POST",
contentType: "application/json",
data:JSON.stringify(jsonData),
success:function(res){
AP.navigator.go('contentview',{contentId: JSON.parse(res).id});//作成したしたページに移動
},
error:function(err){
}
});
});
});
</script>
AP.navigator.go('contentview', {contentId:[contentId]});
の詳細な情報はConfluence JavaScriptAPI-Navigatorを参考してください。
下ページ作成確認
Translate →submitを押してしたページが完成されたら成功です。
Amazon Translateと連動
まず、 Translate + Lambda + API gatewayを 利用して api serverを作ります。今回はこの過程は簡単に紹介だけで飛ばします。
順番
1. LambdaにつなげるIAM RoleにAmazon Translate policyを追加します。
2. Lambdaを作成します。
3. API gatewayをつなげます。
- Lambda例
Amazon Translate この資料で好きな言語を選んで作成すればいいです。
例ではPythonを使って簡単に作って見ます。
Lambda
import json
import boto3
translate = boto3.client(service_name='translate', region_name='[region]', use_ssl=True)
def lambda_handler(event, context):
result = translate.translate_text(Text="[翻訳するTEXT]",
SourceLanguageCode="[翻訳する前の言語]", TargetLanguageCode="[翻訳する言語]")
print('TranslatedText: ' + result.get('TranslatedText'))//翻訳結果
print('SourceLanguageCode: ' + result.get('SourceLanguageCode'))
print('TargetLanguageCode: ' + result.get('TargetLanguageCode'))
return {[returnすること]}
このように作成すればいいです。
では、次のAppの方法です。
順番です。
- 現在のページのcontentを持ってきます。
- API gatewayに送ります。
- 翻訳した内容を上の下ページを作るjsonData.body.storage.valueに入れて下ページを作ります。
まず、管理ページを作ってAPI登録、登録したAPIを ajaxを利用してAPI gatewayを送ったあと翻訳した内容をもらいます。
modules(adminPages)
"adminPages": [
{
"url": "/myAdimTranslate",
"name": {
"value": "Confluence Translate"
},
"key": "myAdimTranslate"
}
]
routes(index.js)
app.get('/myAdimTranslate', addon.authenticate(),(req, res) => {
res.render('myAdimTranslate');
});
views(myAdimTranslate.hbs)
{{!< layout}}
<div class="field-group">
<input class="text" type="text" id="api" name="text-input" title="Text input">
<button id="save">save</button>
</div>
<script>
$(function(){
$('#save').on('click',function(){
//登録します。
let jsonData = {
"string": "[stirng name]",
"value": $('#api').val()
};
AP.request({
url:"/rest/atlassian-connect/1/addons/[AppKey(atlassian-connect.json의 Key입니다)]/properties/[properties_name]",
type:"PUT",
contentType: "application/json",
data: JSON.stringify(jsonData),
success:function(res){
AP.flag.create({
title: 'your Amazon url connection',
body: 'This is success',
type: 'success'
});//成功時に通知を受けるコードです。
},
error:function(err){
AP.flag.create({
title: 'App Err',
body: 'This is a Fail',
type: 'warning'
});//失敗したときに通知を受けるコードです
}
});
}
});
</script>
AP.flagの内容はConfluence Cloud Reference - Flagを参考してください。
同録確認
Apps→Confluence Translate→SAVEを押して同録してください。
登録が終わりました。
今からは、登録したAPIを利用してAPI Gatewayにページの情報をわたします。
routes(index.js)
app.post('/translateAmazon',addon.authenticate(),(req,res) => {
//先、登録したAPIを利用して通信します。ここでは、axiosを利用しました。
axios({
method:'post',
url:req.body.url,
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(req.body.value)
}).then(result => {
res.send(JSON.stringify(result.data));
}).catch(res => {
});
});
viewファイルです。重複するコードが多いため同期式に作って順番でコードを説明します。
流れを見ながらもっと効率的なコードを作ればいいです。
views(translate.hbs)
{{!< layout}}
<form>
<label>sourceLang</label>
<select id="sourceLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<label>TranslateLang</label>
<select id="translateLang">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
<input id="submit" type="button" value="submit">
</form>
<script>
$(function(){
$('#submit').on('click', async function(){
//現在のページの情報を呼びます。
let value = await apRequest(
"/rest/api/content/{{contentId}}?expand=space,body.view,version.container",
"GET",
null
);
//登録した情報を呼びます。
let url = await apRequest(
"/rest/atlassian-connect/1/addons/Trnaslate/properties/Amazon",
"GET",
null
);
//index.jsの /translateAmazonにrequestします。
let jsonData1 = {
"spaceKey":value.space.key,
"contentId":value.id,
"sourceLang":$('#sourceLang option:selected').val(),
"translateLang":$('#translateLang option:selected').val(),
"value":value.body.view.value,
"url":url
};
let content = await ajaxRequest("/translateAmazon","POST",jsonData1);
//下ぺージを作ります。
let jsonData2 = {
"type": "page",
"space": {
"key": "{{spaceKey}}"
},
"ancestors":[
{
"id":"{{contentId}}"
}
],
"title": `${value.title}(${$('#translateLang option:selected').val()})`,
"body": {
"storage": {
"value": content,
"representation": "storage"
}
}
};
await apRequest(
"/rest/api/content",
"POST",
jsonData2
).then(res=>{
AP.navigator.go('contentview', {contentId: res.id});//作成したしたページに移動
});
});
});
function ajaxRequest(url,type,jsonData){
return new Promise(function(resolve,reject){
AP.context.getToken(function(token){//認証が必要です。jwt Tokenをもらいます。
$.ajax({
url:url,
type:type,
dataType:"json",
contentType:"application/json",
headers:{
"Authorization": `JWT ${token}`//jwt Tokenを登録します。
},
data:JSON.stringify(jsonData),
success:function(res){
resolve(JSON.parse(res));
},
error:function(err){
reject(false);
}
});
});
});
}
function apRequest(url,type,jsonData){
return new Promise(function(resolve,reject){
AP.request({
url:url,
type:type,
contentType: "application/json",
data:JSON.stringify(jsonData),
success:function(res){
resolve(JSON.parse(res));
},
error:function(err){
reject(false);
}
});
});
}
</script>
最後に確認
最初の下ページ作成で現在の言語そして翻訳する言語を選んで下ページを作成してください。
ここでは韓国語で翻訳してみました。
終わりです。
もうしUIをもっときれいにしたいならAUI Documentationを参考してください。
以上 Confluece Cloud App + Amazon Translateの Demoをしてみました。
次はAmazon Translateに関する内容を作成して見ます。
参考資料
Confluence Cloud Developer
Confluence Cloud Reference
Confluence Cloud Rest API Reference
AUI Documentation
ATLASSIAN Community