0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

NCMBとMonaca、DeepL APIを使って翻訳アプリを作る(その2:翻訳処理とデータの保存)

Last updated at Posted at 2022-07-07

NCMBとMonacaを使ってデモアプリを作ってみます。今回はDeepL APIを使った翻訳アプリです。翻訳結果をNCMBのデータストアに保存し、後で確認できるようにします。データストアにデータを保存したり、逆に取り出すのはよくあるケースなので、様々な場面で応用できるはずです。

前回は画面の説明とSDKの導入まで紹介しました。今回はDeepL APIを使った翻訳処理と、データをNCMBに保存するまでを解説します。

コードについて

今回のコードはNCMBMania/monaca_translation_app: MonacaとNCMB、DeepL APIを使った翻訳アプリですにアップロードしてあります。実装時の参考にしてください。

翻訳処理について

翻訳画面を再掲します。翻訳するボタンを押すと addTranslate 関数が実行される仕組みです。日本語はテキストエリアに入力します。

<div class="page-content">
	<div class="list no-hairlines-md">
		<form id="translation">
			<ul>
				<li class="item-content item-input">
					<div class="item-inner">
						<div class="item-title item-label">日本語</div>
						<div class="item-input-wrap">
							<textarea class="resizable" name="text" placeholder="翻訳するテキストを入力してください"></textarea>
						</div>
					</div>
				</li>
				${translatedText !== '' ?
				$h`
				<li class="item-content item-input">
					<div class="item-inner">
						<div class="item-title item-label">英訳</div>
						<div class="item-input-wrap">
							${translatedText}
						</div>
					</div>
				</li>
				`
				:
				''
				}
			</ul>
			<div class="block">
				<button class="button button-fill" @click=${addTranslate}>翻訳する</Button>
			</div>
		</form>
	</div>
</div>

monaca-translation-2.jpg

JavaScript処理

Framework7の基本形として、JavaScriptは下記の中に書きます。今回はストア $store と画面更新用の $update 関数を使います。

export default (props, { $store, $update }) => {
	// ここに記述
	return $render;
}

画面表示で利用する変数

画面上では翻訳後のテキスト有無によって表示を変更しています。そのための変数を用意します。

let translatedText = '';

翻訳ボタンを押した後の処理

addTranslate 関数の内容です。まず入力値を取得して、それをDeepLにて英語に翻訳します。

const addTranslate = async (e) => {
	e.preventDefault();
	// 入力値の取得
	const params = app.form.convertToData('#translation');
	// 翻訳実行(js/app.jsに定義)
	translatedText = await translationText(params.text);
	// 以下は後述
}

translationText 関数は js/app.js にて定義しています。契約状態によってURLが異なるので、変数化してあります。

// DeepL実行用URL
const DEEPL_API_URL = 'https://api-free.deepl.com';

// DeepLを使ってテキストを翻訳する関数
const translationText = async (text, target_lang = 'EN-US') => {
  const res = await fetch(`${DEEPL_API_URL}/v2/translate`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: new URLSearchParams({
      text,
      target_lang,
      auth_key: config.deepLAuthKey,
    })
  });
  const json = await res.json();
  return json['translations'][0]['text'];
}

翻訳されたテキストは画面表示に利用します。画面表示を更新した後、データをNCMBに保存します。

// 画面を更新
$update();
// データをNCMBに保存する処理
await saveTranslate(params.text, translatedText);

NCMBのデータストアに翻訳結果を保存する

saveTranslate 関数の内容です。Translateはデータストアのクラス名(DBでいうテーブル名相当)になります。

// NCMBにデータを保存する処理
const saveTranslate = (originalText, translateText) => {
	const Translate = ncmb.DataStore('Translate');
	const translate = new Translate;
	return translate
		.set('original', originalText)
		.set('translate', translatedText)
		.save();
}

ストアに反映

翻訳結果を保存したNCMBのデータはそのままストアに追加します。

// ストアに追加
$store.dispatch('addTranslate', translate);

処理全体

pages/translations.html のJavaScriptは全体として、次のようになります。

export default (props, { $store, $update }) => {
	let translatedText = '';
	// 翻訳ボタンを押した時の処理
	const addTranslate = async (e) => {
		e.preventDefault();
		// 入力値の取得
		const params = app.form.convertToData('#translation');
		// 翻訳実行(js/app.jsに定義)
		translatedText = await translationText(params.text);
		// 画面を更新
		$update();
		// データをNCMBに保存する処理
		const translate = await saveTranslate(params.text, translatedText);
		// ストアに追加
		$store.dispatch('addTranslate', translate);
	}

	// NCMBにデータを保存する処理
	const saveTranslate = (originalText, translateText) => {
		const Translate = ncmb.DataStore('Translate');
		const translate = new Translate;
		return translate
			.set('original', originalText)
			.set('translate', translatedText)
			.save();
	}
	
	return $render;
}

これでNCMBの管理画面にて、データストアにTranslateクラスができあがり、翻訳結果も保存されているのが確認できるはずです。

image.png

まとめ

NCMBを使うとクラウドデータベースへの保存がわずか数行で書けます。今回は使っていませんが、ACL(アクセス権限)も指定できます。ぜひ試してください。

次回は保存したデータの取得と表示を行います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?