鴻蒙NEXT開發案例:簡體繁體轉換器

zhongcx發表於2024-11-21

【引言】

簡體繁體轉換器是一個實用的小工具,它可以幫助使用者輕鬆地在簡體中文和繁體中文之間進行轉換。對於需要頻繁處理兩岸三地文件的使用者來說,這樣的工具無疑是提高工作效率的好幫手。本案例將展示如何利用鴻蒙NEXT提供的元件和服務,結合第三方庫@nutpi/chinese_transverter,來實現這一功能。

【環境準備】

• 作業系統:Windows 10
• 開發工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806
• 目標裝置:華為Mate60 Pro
• 開發語言:ArkTS
• 框架:ArkUI
• API版本:API 12
• 三方庫:chinese_transverter

【實現步驟】

1. 專案初始化

首先,確保你的開發環境已經安裝了鴻蒙NEXT的相關工具鏈。然後,建立一個新的鴻蒙NEXT專案。

2. 引入第三方庫

使用ohpm命令安裝@nutpi/chinese_transverter庫:

ohpm install @nutpi/chinese_transverter

3. 編寫核心邏輯

接下來,在專案的主元件中引入所需的模組,並定義好狀態變數和方法。這裡的關鍵在於設定監聽器以響應輸入文字的變化,並呼叫轉換函式來獲取轉換結果。

import { transverter, TransverterType, TransverterLanguage } from "@nutpi/chinese_transverter";

@Entry
@Component
struct SimplifiedTraditionalConverter {
  @State @Watch('onInputTextChanged') inputText: string = '';
  @State simplifiedResult: string = '';
  @State traditionalResult: string = '';
  @State isInputFocused: boolean = false;

  onInputTextChanged() {
    this.simplifiedResult = transverter({
      type: TransverterType.SIMPLIFIED,
      str: this.inputText,
      language: TransverterLanguage.ZH_CN
    });
    this.traditionalResult = transverter({
      type: TransverterType.TRADITIONAL,
      str: this.inputText,
      language: TransverterLanguage.ZH_CN
    });
  }

  private copyToClipboard(text: string): void {
    const clipboardData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);
    const systemClipboard = pasteboard.getSystemPasteboard();
    systemClipboard.setData(clipboardData);
    promptAction.showToast({ message: '已複製到剪貼簿' });
  }

  build() {
    // UI構建程式碼...
  }
}

4. 構建使用者介面

在build方法中,我們構建了應用的使用者介面。這裡主要包括一個可滾動的容器、輸入區域、結果展示區以及操作按鈕。

Scroll() {
  Column() {
    Text("簡體繁體轉換器")
      .width('100%')
      .height(54)
      .fontSize(18)
      .fontWeight(600)
      .backgroundColor(Color.White)
      .textAlign(TextAlign.Center)
      .fontColor(this.textColor);

    // 輸入區域與清空按鈕
    Column() {
      // ...省略部分程式碼...

      Text('清空')
        .borderWidth(1)
        .borderColor(this.themeColor)
        .fontColor(this.themeColor)
        .height(50)
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .fontSize(18)
        .width(`${650 - this.basePadding * 2}lpx`)
        .margin({ top: `${this.basePadding}lpx` })
        .onClick(() => this.inputText = "");
    }
    .width('650lpx')
    .padding(`${this.basePadding}lpx`)
    .margin({ top: 20 })
    .backgroundColor(Color.White)
    .borderRadius(10)
    .alignItems(HorizontalAlign.Start);

    // 結果展示區
    // ...省略部分程式碼...
  }
  .width('100%')
  .height('100%')
  .backgroundColor("#f2f3f5")
  .align(Alignment.Top)
  .padding({ bottom: `${this.basePadding}lpx` });
}

【完整程式碼】

// 匯入必要的轉換庫,提供簡體與繁體之間的轉換功能
import { transverter, TransverterType, TransverterLanguage } from "@nutpi/chinese_transverter";
// 匯入剪貼簿服務,用於將文字複製到系統剪貼簿
import { pasteboard } from '@kit.BasicServicesKit';
// 匯入提示服務,用於向使用者顯示訊息
import { promptAction } from '@kit.ArkUI';

// 使用@Entry裝飾器標記此元件為應用的入口點
@Entry
  // 使用@Component裝飾器定義一個名為SimplifiedTraditionalConverter的元件
@Component
struct SimplifiedTraditionalConverter {
  // 定義狀態變數inputText,儲存使用者輸入的原始文字,當其值變化時觸發onInputTextChanged方法
  @State @Watch('onInputTextChanged') inputText: string = '';
  // 定義狀態變數simplifiedResult,儲存轉換後的簡體結果
  @State simplifiedResult: string = '';
  // 定義狀態變數traditionalResult,儲存轉換後的繁體結果
  @State traditionalResult: string = '';
  // 定義狀態變數isInputFocused,表示輸入框是否獲得了焦點
  @State isInputFocused: boolean = false;
  // 定義主題顏色
  @State private themeColor: string = '#439fff';
  // 定義文字顏色
  @State private textColor: string = "#2e2e2e";
  // 定義基礎內邊距大小
  @State private basePadding: number = 30;
  // 定義最小文字區域高度
  @State private minTextAreaHeight: number = 50;
  // 定義最大文字區域高度
  @State private maxTextAreaHeight: number = 300;

  // 當inputText狀態改變時觸發的方法,用於更新轉換結果
  onInputTextChanged() {
    // 將inputText轉換為簡體,並更新simplifiedResult
    this.simplifiedResult = transverter({
      type: TransverterType.SIMPLIFIED,
      str: this.inputText,
      language: TransverterLanguage.ZH_CN
    });
    // 將inputText轉換為繁體,並更新traditionalResult
    this.traditionalResult = transverter({
      type: TransverterType.TRADITIONAL,
      str: this.inputText,
      language: TransverterLanguage.ZH_CN
    });
  }

  // 將給定的文字複製到剪貼簿,並顯示提示資訊
  private copyToClipboard(text: string): void {
    const clipboardData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text); // 建立剪貼簿資料
    const systemClipboard = pasteboard.getSystemPasteboard(); // 獲取系統剪貼簿
    systemClipboard.setData(clipboardData); // 設定剪貼簿資料
    promptAction.showToast({ message: '已複製到剪貼簿' }); // 顯示覆製成功的提示
  }

  // 構建元件的UI
  build() {
    Scroll() { // 建立可滾動的容器
      Column() { // 在滾動容器中建立垂直佈局
        // 建立標題文字
        Text("簡體繁體轉換器")
          .width('100%')
          .height(54)
          .fontSize(18)
          .fontWeight(600)
          .backgroundColor(Color.White)
          .textAlign(TextAlign.Center)
          .fontColor(this.textColor);

        // 建立使用者輸入區域
        Column() {
          // 建立多行文字輸入框
          TextArea({ text: $$this.inputText, placeholder: '請輸入簡體/繁體字(支援混合輸入)' })
            .fontSize(18)
            .placeholderColor(this.isInputFocused ? this.themeColor : Color.Gray)
            .fontColor(this.isInputFocused ? this.themeColor : this.textColor)
            .borderColor(this.isInputFocused ? this.themeColor : Color.Gray)
            .caretColor(this.themeColor)
            .onBlur(() => this.isInputFocused = false) // 當輸入框失去焦點時,更新isInputFocused狀態
            .onFocus(() => this.isInputFocused = true) // 當輸入框獲得焦點時,更新isInputFocused狀態
            .borderWidth(1)
            .borderRadius(10)
            .backgroundColor(Color.White)
            .constraintSize({ minHeight: this.minTextAreaHeight, maxHeight: this.maxTextAreaHeight });

          // 建立清空按鈕
          Text('清空')
            .borderWidth(1)
            .borderColor(this.themeColor)
            .fontColor(this.themeColor)
            .height(50)
            .textAlign(TextAlign.Center)
            .borderRadius(10)
            .fontSize(18)
            .width(`${650 - this.basePadding * 2}lpx`)
            .margin({ top: `${this.basePadding}lpx` })
            .clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.8 }) // 新增點選效果
            .onClick(() => this.inputText = ""); // 清空輸入框
        }
        .width('650lpx')
        .padding(`${this.basePadding}lpx`)
        .margin({ top: 20 })
        .backgroundColor(Color.White)
        .borderRadius(10)
        .alignItems(HorizontalAlign.Start);

        // 建立繁體結果展示與複製區域
        Column() {
          // 建立繁體結果標題
          Text(`繁體結果:`)
            .fontWeight(600)
            .fontSize(18)
            .fontColor(this.textColor);

          // 建立繁體結果展示文字
          Text(`${this.traditionalResult}`)
            .constraintSize({ minHeight: this.minTextAreaHeight, maxHeight: this.maxTextAreaHeight })
            .fontColor(this.themeColor)
            .fontSize(18)
            .textAlign(TextAlign.Start)
            .copyOption(CopyOptions.InApp)
            .margin({ top: `${this.basePadding / 3}lpx` });

          // 建立複製繁體結果按鈕
          Text('複製')
            .enabled(this.traditionalResult ? true : false) // 只有當有繁體結果時,按鈕才可用
            .fontColor(Color.White)
            .backgroundColor(this.themeColor)
            .height(50)
            .textAlign(TextAlign.Center)
            .borderRadius(10)
            .fontSize(18)
            .width(`${650 - this.basePadding * 2}lpx`)
            .margin({ top: `${this.basePadding}lpx` })
            .clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.8 })
            .onClick(() => this.copyToClipboard(this.traditionalResult)); // 複製繁體結果到剪貼簿
        }
        .width('650lpx')
        .padding(`${this.basePadding}lpx`)
        .backgroundColor(Color.White)
        .borderRadius(10)
        .margin({ top: `${this.basePadding}lpx` })
        .alignItems(HorizontalAlign.Start);

        // 建立簡體結果展示與複製區域
        Column() {
          // 建立簡體結果標題
          Text(`簡體結果:`)
            .fontWeight(600)
            .fontSize(18)
            .fontColor(this.textColor);

          // 建立簡體結果展示文字
          Text(`${this.simplifiedResult}`)
            .constraintSize({ minHeight: this.minTextAreaHeight, maxHeight: this.maxTextAreaHeight })
            .fontColor(this.themeColor)
            .fontSize(18)
            .textAlign(TextAlign.Start)
            .copyOption(CopyOptions.InApp)
            .margin({ top: `${this.basePadding / 3}lpx` });

          // 建立複製簡體結果按鈕
          Text('複製')
            .enabled(this.simplifiedResult ? true : false) // 只有當有簡體結果時,按鈕才可用
            .fontColor(Color.White)
            .backgroundColor(this.themeColor)
            .height(50)
            .textAlign(TextAlign.Center)
            .borderRadius(10)
            .fontSize(18)
            .width(`${650 - this.basePadding * 2}lpx`)
            .margin({ top: `${this.basePadding}lpx` })
            .clickEffect({ level: ClickEffectLevel.HEAVY, scale: 0.8 })
            .onClick(() => this.copyToClipboard(this.simplifiedResult)); // 複製簡體結果到剪貼簿
        }
        .width('650lpx')
        .padding(`${this.basePadding}lpx`)
        .backgroundColor(Color.White)
        .borderRadius(10)
        .margin({ top: `${this.basePadding}lpx` })
        .alignItems(HorizontalAlign.Start);
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor("#f2f3f5")
    .align(Alignment.Top)
    .padding({ bottom: `${this.basePadding}lpx` });
  }
}

  

相關文章