طراحی روش ورودی هوشمند چند زبانه Hongmeng: سوئیچینگ زیرنوع پویا و توابع ترجمه بلادرنگ

Summarize this content to 400 words in Persian Lang
هدف این مقاله بررسی عمیق طراحی و اجرای روشهای ورودی هوشمند چند زبانه و خلاصه کردن آنها بر اساس شیوههای توسعه واقعی است. به طور عمده به عنوان حاملی برای اشتراک گذاری و تبادل فناوری، اشتباهات و حذفیات اجتناب ناپذیر است که نظرات و سوالات ارزشمندی را برای پیشرفت متقابل مطرح کنند. این مقاله محتوای اصلی است و هر گونه چاپ مجدد به هر شکلی باید منبع و نویسنده اصلی را ذکر کند.
در دنیای جهانی شده امروزی، روشهای ورودی هوشمند چندزبانه به ابزار مهمی برای مردم برای برقراری ارتباط بین زبانها تبدیل شدهاند. این نه تنها نیاز به پشتیبانی از ورودی در چندین زبان دارد، بلکه دارای عملکردهای سوئیچینگ راحت و قابلیت ترجمه بلادرنگ برای برآورده کردن نیازهای کاربر در سناریوهای مختلف است. این مقاله به طور مفصل نحوه طراحی و پیاده سازی چنین برنامه کاربردی روش ورودی هوشمند چند زبانه را در سیستم Huawei HarmonyOS Next (API12) شامل تجزیه و تحلیل نیازمندی های پروژه، طراحی معماری، پیاده سازی فناوری کلید، سازگاری داده ها و مدیریت خطا و غیره معرفی می کند.
1. الزامات پروژه و تجزیه و تحلیل طراحی
(1) نیازهای کاربر
هنگام استفاده از روشهای ورودی هوشمند چند زبانه، کاربران انتظار دارند که بتوانند به راحتی بین طرحبندی صفحهکلید به زبانهای مختلف جابهجا شوند، مانند جابهجایی سریع بین روشهای ورودی چینی و انگلیسی. در عین حال، متن وارد شده توسط کاربر می تواند در زمان واقعی به زبان مقصد ترجمه شود و نیازی به راه اندازی دستی عملیات ترجمه را از بین ببرد و کارایی ارتباط را بهبود بخشد.
(2) طراحی معماری
به منظور دستیابی به الزامات فوق، ما یک طراحی معماری لایه ای را اتخاذ کردیم. روش ورودی به لایه رابط ورودی، لایه هسته روش ورودی و لایه سرویس ترجمه تقسیم می شود. لایه رابط ورودی مسئول نمایش طرحبندی صفحهکلید به زبانهای مختلف و دریافت ورودی کاربر است مسئول فراخوانی API ترجمه برای ترجمه متن است و نتیجه را به لایه اصلی روش ورودی برمیگرداند. این طراحی جدا شده، مسئولیت های هر لایه را روشن و نگهداری و گسترش آن را آسان می کند.
2. چیدمان صفحه کلید چند زبانه و تغییر نوع فرعی
(1) پیکربندی زیرگروه های چند زبانه
در سیستم Hongmeng، ما عبور می کنیم ohos_extension.input_method برای پیکربندی نوع فرعی روش ورودی. مثال زیر یک نمونه پیکربندی ساده است، با فرض اینکه ما از زیرشاخهها در هر دو زبان چینی و انگلیسی پشتیبانی میکنیم:
{
“module”: {
“extensionAbilities”: [
{
“description”: “InputMethodExtDemo”,
“icon”: “Smedia:icon”,
“name”: “InputMethodExtAbility”,
“srcEntry”: “./ets/InputMethodExtensionAbility/InputMethodService.ts”,
“type”: “inputMethod”,
“exported”: true,
“metadata”: [
{
“name”: “ohos.extension.input_method”,
“resource”: “Sprofile:input_method_config”
}
]
}
]
},
“subtypes”: [
{
“icon”: “Smedia:icon”,
“id”: “InputMethodExtAbility”,
“label”: “$string:english”,
“locale”: “en-US”,
“mode”: “lower”
},
{
“icon”: “Smedia:icon”,
“id”: “InputMethodExtAbility1”,
“label”: “$string:chinese”,
“locale”: “zh-CN”,
“mode”: “lower”
}
]
}
(2) رابط سوئیچینگ زیرنوع را پیاده سازی کنید
در برنامه های کاربردی روش ورودی، استفاده می کنیم switchCurrentInputMethodSubtype رابط برای اجرای سوئیچینگ زیرنوع. در اینجا یک کد نمونه است:
import { InputMethodSubtype, inputMethod } from ‘@kit.IMEKit’;
export class KeyboardController {
async switchCurrentInputMethodSubtype() {
let subTypes = await inputMethod.getSetting().listCurrentInputMethodSubtype();
let currentSubType = inputMethod.getCurrentInputMethodSubtype();
for (let i = 0; i < subTypes.length; i++) {
if (subTypes[i].id!== currentSubType.id) {
await inputMethod.switchCurrentInputMethodSubtype(subTypes[i]);
}
}
}
}
(3) نظارت setSubtype رویداد
برای بارگیری رابط ورودی مربوطه با توجه به انواع فرعی، باید گوش کنیم setSubtype رویداد در اینجا کد نمونه است:
import { InputMethodSubtype, inputMethodEngine, inputMethod } from ‘@kit.IMEKit’;
export class KeyboardController {
async handleSubtypeChange() {
let panel: inputMethodEngine.Panel;
let inputMethodAbility: inputMethodEngine.InputMethodAbility = inputMethodEngine.getInputMethodAbility();
inputMethodAbility.on(‘setSubtype’, (inputMethodSubtype: InputMethodSubtype) => {
if (inputMethodSubtype.id === ‘InputMethodExtAbility’) {
panel.setUiContent(‘pages/Index’);
} else if (inputMethodSubtype.id === ‘InputMethodExtAbility1’) {
panel.setUiContent(‘pages/Index1’);
}
});
}
}
3. طراحی و پیاده سازی ماژول تابع ترجمه بلادرنگ
(1) از وظایف ناهمزمان برای مدیریت درخواست های ترجمه استفاده کنید
برای جلوگیری از مسدود کردن درخواستهای ترجمه ورودی کاربر، از وظایف ناهمزمان برای مدیریت درخواستهای ترجمه استفاده میکنیم. هنگامی که کاربر متن را وارد می کند، یک کار ترجمه ناهمزمان را راه اندازی می کنیم و متن را برای ترجمه به لایه سرویس ترجمه می فرستیم. در اینجا یک مثال ساده کار ناهمزمان (با استفاده از Promise):
async function translateText(text: string): Promise<string> {
return new Promise((resolve, reject) => {
// 这里模拟一个异步翻译操作,实际应用中应调用真实的翻译API
setTimeout(() => {
resolve(`翻译结果: ${text}`);
}, 1000);
});
}
(2) API ترجمه فراخوانی متقابل را پیاده سازی کنید
در سیستم Hongmeng، برنامه کاربردی روش ورودی و سرویس ترجمه ممکن است در فرآیندهای مختلف اجرا شود، بنابراین برای فراخوانی API ترجمه باید ارتباطات بین فرآیندی اجرا شود. ما می توانیم از مکانیسم ارتباط بین فرآیندی ارائه شده توسط سیستم استفاده کنیم (مانند Ability ارتباط) برای دستیابی به. در زیر یک مثال فراخوانی متقابل ساده است (با فرض اینکه سرویس ترجمه یک است ServiceAbility):
import { FeatureAbility } from ‘@ohos.ability.featureAbility’;
async function callTranslationService(text: string): Promise<string> {
let want = {
bundleName: ‘com.example.translation’,
abilityName: ‘TranslationServiceAbility’
};
try {
let result = await FeatureAbility.callAbility(want, { text });
return result;
} catch (error) {
console.error(‘翻译服务调用失败:’, error);
return ”;
}
}
(3) نتیجه ترجمه را دریافت کنید و به برنامه روش ورودی بازگردید
هنگامی که سرویس ترجمه ترجمه را کامل می کند، نتایج ترجمه را از طریق یک مکانیسم تماس یا پیام به برنامه روش ورودی برمی گرداند. در یک اپلیکیشن روش ورودی، باید نتایج ترجمه را پردازش کرده و به کاربر نمایش دهیم. در اینجا یک مثال پردازش ساده است:
callTranslationService(‘Hello’).then((result) => {
console.log(‘翻译结果:’, result);
// 在输入界面显示翻译结果
});
4. سازگاری داده ها و مدیریت خطا
(1) خطاهای درخواست شبکه در طول پردازش ترجمه
در طول فرآیند ترجمه، ممکن است با خطاهای درخواست شبکه یا در دسترس نبودن خدمات ترجمه مواجه شوید. ما باید این خطاها را مدیریت کنیم و به کاربران اعلانهای دوستانه ارائه کنیم. به عنوان مثال:
callTranslationService(‘Hello’).catch((error) => {
console.error(‘翻译失败:’, error);
// 显示错误提示给用户,如弹出对话框提示“翻译失败,请检查网络连接”
});
(2) اطمینان حاصل کنید که متن وارد شده توسط کاربر و نتیجه ترجمه به طور همزمان نمایش داده می شوند
برای اطمینان از اینکه متن وارد شده توسط کاربر همزمان با نتایج ترجمه نمایش داده می شود، باید رابط ورودی را در زمان مناسب به روز کنیم. به عنوان مثال، پس از بازگشت نتایج ترجمه، نتایج در کنار کادر ورودی یا سایر مکان های تعیین شده به موقع نمایش داده می شوند. در عین حال، برای جلوگیری از سردرگمی نمایش، لازم است شرایطی را که کاربر همچنان به وارد کردن متن در طول فرآیند ترجمه ادامه میدهد، مدیریت کرد.
5. نمونه کد و نمودار معماری
(1) کد نمونه
در زیر نمونه ای از ساختار کد اصلی یک برنامه کاربردی روش ورودی هوشمند چند زبانه ساده شده است:
// InputMethodService.ts
import { Want } from ‘@kit.AbilityKit’;
import keyboardController from ‘./model/KeyboardController’;
import { InputMethodExtensionAbility } from ‘@kit.IMEKit’;
export default class InputDemoService extends InputMethodExtensionAbility {
onCreate(want: Want): void {
keyboardController.onCreate(this.context);
}
onDestroy(): void {
keyboardController.onDestroy();
}
}
// KeyboardController.ts
import { display } from ‘@kit.ArkUT’;
import { inputMethodEngine, InputMethodExtensionContext } from ‘@kit.IMEKit’;
const inputMethodAbility: inputMethodEngine.InputMethodAbility = inputMethodEngine.getInputMethodAbility();
export class KeyboardController {
private mContext: InputMethodExtensionContext | undefined = undefined;
private panel: inputMethodEngine.Panel | undefined = undefined;
private textInputClient: inputMethodEngine.InputClient | undefined = undefined;
private keyboardController: inputMethodEngine.KeyboardController | undefined = undefined;
constructor() {}
public onCreate(context: InputMethodExtensionContext): void {
this.mContext = context;
this.initWindow();
this.registerListener();
}
public onDestroy(): void {
this.unRegisterListener();
if (this.panel) {
this.panel.hide();
inputMethodAbility.destroyPanel(this.panel);
}
if (this.mContext) {
this.mContext.destroy();
}
}
public insertText(text: string): void {
if (this.textInputClient) {
this.textInputClient.insertText(text);
// 触发翻译任务
this.translateText(text);
}
}
public deleteForward(length: number): void {
if (this.textInputClient) {
this.textInputClient.deleteForward(length);
}
}
private initWindow(): void {
if (this.mContext === undefined) {
return;
}
let dis = display.getDefaultDisplaySync();
let dWidth = dis.width;
let dHeight = dis.height;
let keyHeightRate = 0.47;
let keyHeight = dHeight * keyHeightRate;
let nonBarPosition = dHeight – keyHeight;
let panelInfo: inputMethodEngine.PanelInfo = {
type: inputMethodEngine.PanelType.SOFT_KEYBOARD,
flag: inputMethodEngine.PanelFlag.FLG_FIXED
};
inputMethodAbility.createPanel(this.mContext, panelInfo).then(async (inputPanel: inputMethodEngine.Panel) => {
this.panel = inputPanel;
if (this.panel) {
await this.panel.resize(dWidth, keyHeight);
await this.panel.moveTo(0, nonBarPosition);
await this.panel.setUiContent(‘InputMethodExtensionAbility/pages/Index’);
}
});
}
private registerListener(): void {
this.registerInputListener();
}
private registerInputListener(): void {
inputMethodAbility.on(‘inputStart’, (kbController, textInputClient) => {
this.textInputClient = textInputClient;
this.keyboardController = kbController;
});
inputMethodAbility.on(‘inputStop’, () => {
this.onDestroy();
});
}
private unRegisterListener(): void {
inputMethodAbility.off(‘inputStart’);
inputMethodAbility.off(‘inputStop’, () => {});
}
private async translateText(text: string): Promise<void> {
try {
let result = await callTranslationService(text);
// 处理翻译结果并显示
console.log(‘翻译结果:’, result);
} catch (error) {
console.error(‘翻译失败:’, error);
}
}
}
const keyboardController = new KeyboardController();
export default keyboardController;
(2) نمودار معماری
شکل زیر یک نمودار معماری از یک برنامه کاربردی روش ورودی هوشمند چند زبانه است:
سطح
شرح عملکرد
لایه رابط ورودی
نمایش طرحبندی صفحهکلید به زبانهای مختلف، دریافت ورودی کاربر و نمایش نتایج ترجمه.
لایه هسته روش ورودی
وضعیت روش ورودی را مدیریت کنید، رویدادهای ورودی کاربر را مدیریت کنید، با خدمات ترجمه تماس بگیرید و رابط ورودی را بهروزرسانی کنید.
لایه خدمات ترجمه
برای ترجمه متن با API ترجمه تماس بگیرید و نتایج ترجمه را به لایه اصلی روش ورودی برگردانید.
از طریق طراحی و پیاده سازی فوق، ما با موفقیت یک برنامه کاربردی روش ورودی هوشمند چند زبانه ایجاد کرده ایم که نیازهای کاربران را برای ورودی چند زبانه و ترجمه بلادرنگ برآورده می کند. در توسعه واقعی، عملکرد را می توان بیشتر بهینه کرد، پشتیبانی زبان بیشتری اضافه کرد و تجربه کاربر را بهبود بخشید. امیدوارم این مقاله بتواند مرجع و مرجع مفیدی برای توسعه روش ورودی سیستم Hongmeng باشد.
هدف این مقاله بررسی عمیق طراحی و اجرای روشهای ورودی هوشمند چند زبانه و خلاصه کردن آنها بر اساس شیوههای توسعه واقعی است. به طور عمده به عنوان حاملی برای اشتراک گذاری و تبادل فناوری، اشتباهات و حذفیات اجتناب ناپذیر است که نظرات و سوالات ارزشمندی را برای پیشرفت متقابل مطرح کنند. این مقاله محتوای اصلی است و هر گونه چاپ مجدد به هر شکلی باید منبع و نویسنده اصلی را ذکر کند.
در دنیای جهانی شده امروزی، روشهای ورودی هوشمند چندزبانه به ابزار مهمی برای مردم برای برقراری ارتباط بین زبانها تبدیل شدهاند. این نه تنها نیاز به پشتیبانی از ورودی در چندین زبان دارد، بلکه دارای عملکردهای سوئیچینگ راحت و قابلیت ترجمه بلادرنگ برای برآورده کردن نیازهای کاربر در سناریوهای مختلف است. این مقاله به طور مفصل نحوه طراحی و پیاده سازی چنین برنامه کاربردی روش ورودی هوشمند چند زبانه را در سیستم Huawei HarmonyOS Next (API12) شامل تجزیه و تحلیل نیازمندی های پروژه، طراحی معماری، پیاده سازی فناوری کلید، سازگاری داده ها و مدیریت خطا و غیره معرفی می کند.
1. الزامات پروژه و تجزیه و تحلیل طراحی
(1) نیازهای کاربر
هنگام استفاده از روشهای ورودی هوشمند چند زبانه، کاربران انتظار دارند که بتوانند به راحتی بین طرحبندی صفحهکلید به زبانهای مختلف جابهجا شوند، مانند جابهجایی سریع بین روشهای ورودی چینی و انگلیسی. در عین حال، متن وارد شده توسط کاربر می تواند در زمان واقعی به زبان مقصد ترجمه شود و نیازی به راه اندازی دستی عملیات ترجمه را از بین ببرد و کارایی ارتباط را بهبود بخشد.
(2) طراحی معماری
به منظور دستیابی به الزامات فوق، ما یک طراحی معماری لایه ای را اتخاذ کردیم. روش ورودی به لایه رابط ورودی، لایه هسته روش ورودی و لایه سرویس ترجمه تقسیم می شود. لایه رابط ورودی مسئول نمایش طرحبندی صفحهکلید به زبانهای مختلف و دریافت ورودی کاربر است مسئول فراخوانی API ترجمه برای ترجمه متن است و نتیجه را به لایه اصلی روش ورودی برمیگرداند. این طراحی جدا شده، مسئولیت های هر لایه را روشن و نگهداری و گسترش آن را آسان می کند.
2. چیدمان صفحه کلید چند زبانه و تغییر نوع فرعی
(1) پیکربندی زیرگروه های چند زبانه
در سیستم Hongmeng، ما عبور می کنیم ohos_extension.input_method
برای پیکربندی نوع فرعی روش ورودی. مثال زیر یک نمونه پیکربندی ساده است، با فرض اینکه ما از زیرشاخهها در هر دو زبان چینی و انگلیسی پشتیبانی میکنیم:
{
"module": {
"extensionAbilities": [
{
"description": "InputMethodExtDemo",
"icon": "Smedia:icon",
"name": "InputMethodExtAbility",
"srcEntry": "./ets/InputMethodExtensionAbility/InputMethodService.ts",
"type": "inputMethod",
"exported": true,
"metadata": [
{
"name": "ohos.extension.input_method",
"resource": "Sprofile:input_method_config"
}
]
}
]
},
"subtypes": [
{
"icon": "Smedia:icon",
"id": "InputMethodExtAbility",
"label": "$string:english",
"locale": "en-US",
"mode": "lower"
},
{
"icon": "Smedia:icon",
"id": "InputMethodExtAbility1",
"label": "$string:chinese",
"locale": "zh-CN",
"mode": "lower"
}
]
}
(2) رابط سوئیچینگ زیرنوع را پیاده سازی کنید
در برنامه های کاربردی روش ورودی، استفاده می کنیم switchCurrentInputMethodSubtype
رابط برای اجرای سوئیچینگ زیرنوع. در اینجا یک کد نمونه است:
import { InputMethodSubtype, inputMethod } from '@kit.IMEKit';
export class KeyboardController {
async switchCurrentInputMethodSubtype() {
let subTypes = await inputMethod.getSetting().listCurrentInputMethodSubtype();
let currentSubType = inputMethod.getCurrentInputMethodSubtype();
for (let i = 0; i < subTypes.length; i++) {
if (subTypes[i].id!== currentSubType.id) {
await inputMethod.switchCurrentInputMethodSubtype(subTypes[i]);
}
}
}
}
(3) نظارت setSubtype
رویداد
برای بارگیری رابط ورودی مربوطه با توجه به انواع فرعی، باید گوش کنیم setSubtype
رویداد در اینجا کد نمونه است:
import { InputMethodSubtype, inputMethodEngine, inputMethod } from '@kit.IMEKit';
export class KeyboardController {
async handleSubtypeChange() {
let panel: inputMethodEngine.Panel;
let inputMethodAbility: inputMethodEngine.InputMethodAbility = inputMethodEngine.getInputMethodAbility();
inputMethodAbility.on('setSubtype', (inputMethodSubtype: InputMethodSubtype) => {
if (inputMethodSubtype.id === 'InputMethodExtAbility') {
panel.setUiContent('pages/Index');
} else if (inputMethodSubtype.id === 'InputMethodExtAbility1') {
panel.setUiContent('pages/Index1');
}
});
}
}
3. طراحی و پیاده سازی ماژول تابع ترجمه بلادرنگ
(1) از وظایف ناهمزمان برای مدیریت درخواست های ترجمه استفاده کنید
برای جلوگیری از مسدود کردن درخواستهای ترجمه ورودی کاربر، از وظایف ناهمزمان برای مدیریت درخواستهای ترجمه استفاده میکنیم. هنگامی که کاربر متن را وارد می کند، یک کار ترجمه ناهمزمان را راه اندازی می کنیم و متن را برای ترجمه به لایه سرویس ترجمه می فرستیم. در اینجا یک مثال ساده کار ناهمزمان (با استفاده از Promise
):
async function translateText(text: string): Promise<string> {
return new Promise((resolve, reject) => {
// 这里模拟一个异步翻译操作,实际应用中应调用真实的翻译API
setTimeout(() => {
resolve(`翻译结果: ${text}`);
}, 1000);
});
}
(2) API ترجمه فراخوانی متقابل را پیاده سازی کنید
در سیستم Hongmeng، برنامه کاربردی روش ورودی و سرویس ترجمه ممکن است در فرآیندهای مختلف اجرا شود، بنابراین برای فراخوانی API ترجمه باید ارتباطات بین فرآیندی اجرا شود. ما می توانیم از مکانیسم ارتباط بین فرآیندی ارائه شده توسط سیستم استفاده کنیم (مانند Ability
ارتباط) برای دستیابی به. در زیر یک مثال فراخوانی متقابل ساده است (با فرض اینکه سرویس ترجمه یک است ServiceAbility
):
import { FeatureAbility } from '@ohos.ability.featureAbility';
async function callTranslationService(text: string): Promise<string> {
let want = {
bundleName: 'com.example.translation',
abilityName: 'TranslationServiceAbility'
};
try {
let result = await FeatureAbility.callAbility(want, { text });
return result;
} catch (error) {
console.error('翻译服务调用失败:', error);
return '';
}
}
(3) نتیجه ترجمه را دریافت کنید و به برنامه روش ورودی بازگردید
هنگامی که سرویس ترجمه ترجمه را کامل می کند، نتایج ترجمه را از طریق یک مکانیسم تماس یا پیام به برنامه روش ورودی برمی گرداند. در یک اپلیکیشن روش ورودی، باید نتایج ترجمه را پردازش کرده و به کاربر نمایش دهیم. در اینجا یک مثال پردازش ساده است:
callTranslationService('Hello').then((result) => {
console.log('翻译结果:', result);
// 在输入界面显示翻译结果
});
4. سازگاری داده ها و مدیریت خطا
(1) خطاهای درخواست شبکه در طول پردازش ترجمه
در طول فرآیند ترجمه، ممکن است با خطاهای درخواست شبکه یا در دسترس نبودن خدمات ترجمه مواجه شوید. ما باید این خطاها را مدیریت کنیم و به کاربران اعلانهای دوستانه ارائه کنیم. به عنوان مثال:
callTranslationService('Hello').catch((error) => {
console.error('翻译失败:', error);
// 显示错误提示给用户,如弹出对话框提示“翻译失败,请检查网络连接”
});
(2) اطمینان حاصل کنید که متن وارد شده توسط کاربر و نتیجه ترجمه به طور همزمان نمایش داده می شوند
برای اطمینان از اینکه متن وارد شده توسط کاربر همزمان با نتایج ترجمه نمایش داده می شود، باید رابط ورودی را در زمان مناسب به روز کنیم. به عنوان مثال، پس از بازگشت نتایج ترجمه، نتایج در کنار کادر ورودی یا سایر مکان های تعیین شده به موقع نمایش داده می شوند. در عین حال، برای جلوگیری از سردرگمی نمایش، لازم است شرایطی را که کاربر همچنان به وارد کردن متن در طول فرآیند ترجمه ادامه میدهد، مدیریت کرد.
5. نمونه کد و نمودار معماری
(1) کد نمونه
در زیر نمونه ای از ساختار کد اصلی یک برنامه کاربردی روش ورودی هوشمند چند زبانه ساده شده است:
// InputMethodService.ts
import { Want } from '@kit.AbilityKit';
import keyboardController from './model/KeyboardController';
import { InputMethodExtensionAbility } from '@kit.IMEKit';
export default class InputDemoService extends InputMethodExtensionAbility {
onCreate(want: Want): void {
keyboardController.onCreate(this.context);
}
onDestroy(): void {
keyboardController.onDestroy();
}
}
// KeyboardController.ts
import { display } from '@kit.ArkUT';
import { inputMethodEngine, InputMethodExtensionContext } from '@kit.IMEKit';
const inputMethodAbility: inputMethodEngine.InputMethodAbility = inputMethodEngine.getInputMethodAbility();
export class KeyboardController {
private mContext: InputMethodExtensionContext | undefined = undefined;
private panel: inputMethodEngine.Panel | undefined = undefined;
private textInputClient: inputMethodEngine.InputClient | undefined = undefined;
private keyboardController: inputMethodEngine.KeyboardController | undefined = undefined;
constructor() {}
public onCreate(context: InputMethodExtensionContext): void {
this.mContext = context;
this.initWindow();
this.registerListener();
}
public onDestroy(): void {
this.unRegisterListener();
if (this.panel) {
this.panel.hide();
inputMethodAbility.destroyPanel(this.panel);
}
if (this.mContext) {
this.mContext.destroy();
}
}
public insertText(text: string): void {
if (this.textInputClient) {
this.textInputClient.insertText(text);
// 触发翻译任务
this.translateText(text);
}
}
public deleteForward(length: number): void {
if (this.textInputClient) {
this.textInputClient.deleteForward(length);
}
}
private initWindow(): void {
if (this.mContext === undefined) {
return;
}
let dis = display.getDefaultDisplaySync();
let dWidth = dis.width;
let dHeight = dis.height;
let keyHeightRate = 0.47;
let keyHeight = dHeight * keyHeightRate;
let nonBarPosition = dHeight - keyHeight;
let panelInfo: inputMethodEngine.PanelInfo = {
type: inputMethodEngine.PanelType.SOFT_KEYBOARD,
flag: inputMethodEngine.PanelFlag.FLG_FIXED
};
inputMethodAbility.createPanel(this.mContext, panelInfo).then(async (inputPanel: inputMethodEngine.Panel) => {
this.panel = inputPanel;
if (this.panel) {
await this.panel.resize(dWidth, keyHeight);
await this.panel.moveTo(0, nonBarPosition);
await this.panel.setUiContent('InputMethodExtensionAbility/pages/Index');
}
});
}
private registerListener(): void {
this.registerInputListener();
}
private registerInputListener(): void {
inputMethodAbility.on('inputStart', (kbController, textInputClient) => {
this.textInputClient = textInputClient;
this.keyboardController = kbController;
});
inputMethodAbility.on('inputStop', () => {
this.onDestroy();
});
}
private unRegisterListener(): void {
inputMethodAbility.off('inputStart');
inputMethodAbility.off('inputStop', () => {});
}
private async translateText(text: string): Promise<void> {
try {
let result = await callTranslationService(text);
// 处理翻译结果并显示
console.log('翻译结果:', result);
} catch (error) {
console.error('翻译失败:', error);
}
}
}
const keyboardController = new KeyboardController();
export default keyboardController;
(2) نمودار معماری
شکل زیر یک نمودار معماری از یک برنامه کاربردی روش ورودی هوشمند چند زبانه است:
سطح | شرح عملکرد |
---|---|
لایه رابط ورودی | نمایش طرحبندی صفحهکلید به زبانهای مختلف، دریافت ورودی کاربر و نمایش نتایج ترجمه. |
لایه هسته روش ورودی | وضعیت روش ورودی را مدیریت کنید، رویدادهای ورودی کاربر را مدیریت کنید، با خدمات ترجمه تماس بگیرید و رابط ورودی را بهروزرسانی کنید. |
لایه خدمات ترجمه | برای ترجمه متن با API ترجمه تماس بگیرید و نتایج ترجمه را به لایه اصلی روش ورودی برگردانید. |
از طریق طراحی و پیاده سازی فوق، ما با موفقیت یک برنامه کاربردی روش ورودی هوشمند چند زبانه ایجاد کرده ایم که نیازهای کاربران را برای ورودی چند زبانه و ترجمه بلادرنگ برآورده می کند. در توسعه واقعی، عملکرد را می توان بیشتر بهینه کرد، پشتیبانی زبان بیشتری اضافه کرد و تجربه کاربر را بهبود بخشید. امیدوارم این مقاله بتواند مرجع و مرجع مفیدی برای توسعه روش ورودی سیستم Hongmeng باشد.