AWS Builder 文章

為 AWS Manila Community Day 打造 Tagalog 學習 App:提示詞優先的產品設計

說明如何把每一個提示詞都當成產品決策,為 AWS Manila Community Day 建立一個 Tagalog 學習 App。目標不只是翻譯。這個 App 應該幫助初學者有禮貌地打招呼、提問、感謝志工、掌握等待時間,並準備好與 Manila 的雲端社群交流。

Tagalog 學習 App 文章系列

English 繁體中文 简体中文

說明如何把每一個提示詞都當成產品決策,為 AWS Manila Community Day 建立一個 Tagalog 學習 App。目標不只是翻譯。這個 App 應該幫助初學者有禮貌地打招呼、提問、感謝志工、掌握等待時間,並準備好與 Manila 的雲端社群交流。

免責聲明

目的:本專案是獨立的教育原型,用於語言學習、社群準備與技術分享。它的設計目標,是協助開發者在參加 AWS Manila Community Day 前練習簡單的 Tagalog。

非商業用途:本專案沒有商業模式、付費存取、廣告計畫、聯盟行銷方案或營利目標。它是為社群準備與開發者教育而建立的學習作品。

不保證正確性:App 可能使用生成式 AI 內容,因此翻譯、發音指南、文法說明與文化註解,在公開使用前都應由 Tagalog 母語者審閱。

範圍:目標不是打造完整的翻譯平台,而是示範如何用清楚的資料結構、可重複的產生邏輯與驗證檢查,將靜態學習網站在地化。

尊重社群:App 應避免刻板印象,並謹慎教導禮貌用語。像 poopokayoninyo 這類詞,應被解釋為表達尊重的工具,而不是裝飾。


Demo

Kita tayo mamaya sa susunod na session.

文法拆解

  • Kita:在這句裡可理解為「再見到你」或「等一下見」。
  • tayo:包含說話者與聽者的「我們」。
  • mamaya:意思是「等一下」或「稍後」。
  • sa:依情境可表示「在」、「於」、「到」或「為了」。
  • susunod:意思是「下一個」或「接著的」。
  • session:科技活動中常直接使用的英文活動詞。

發音指南

慢慢念時可讀作: kee-tah tah-yoh mah-mah-yah sah soo-soo-nohd nah sehs-see-seeohn.

  • Kita:kee-tah。
  • tayo:tah-yoh。
  • mamaya:mah-mah-yah。
  • susunod:soo-soo-nohd。
  • session:sehs-see-seeohn。 Tagalog 母音保持穩定:a 像 ah、i 像 ee、o 像 oh。

Content Snapshot

自然 Tagalog:Kita tayo mamaya sa susunod na session.
禮貌 Tagalog:Kita tayo mamaya sa susunod na session po.
額外範例 1:Sa registration desk, sige: Kita tayo mamaya sa susunod na session.
額外範例 2:Pag may kausap na volunteer, kita tayo mamaya sa susunod na session.
額外範例 3:Ayos, kita tayo mamaya sa susunod na session.

目錄

第 1 部分:從學習契約開始

第一節說明如何把寬泛的語言學習想法轉換成穩定的產品契約:句子類別、英文輸入、自然 Tagalog、禮貌 Tagalog、友善 Filipino-English、俏皮 Filipino-English、文法、範例、發音與文化脈絡。

第 2 部分:用示範句作為產品錨點

本節說明為什麼示範片語應該引導 App 設計。像 Magpahinga muna tayo sa lilimUmupo ka sandali kung nahihilo kaPaki-check po kung pumasok ang bayad 這些片語,會成為語氣、禮貌程度與真實活動實用性的測試案例。

第 3 部分:建立能產生實用卡片的提示詞

本節提供一個完整提示詞,用來產生新的句子卡片。提示詞要求 AI 分開輸出正式、自然、禮貌、友善與俏皮版本,而不是把它們混成一個令人困惑的答案。

第 4 部分:作為技術分享的開發能力

本節把 App 轉化為技術分享主題。內容涵蓋 schema 設計、靜態渲染、響應式版面、提示詞版本管理、QA 檢查與 demo 驅動迭代。

第 5 部分:給開發者的現場筆記

本節提供可重用於未來社群工具的實務經驗:契約優先內容、語氣安全的語言生成、行動優先審閱,以及提示詞壓縮。


第 1 部分:從學習契約開始

目標

建立一個適合初學者的 Tagalog 學習 App,協助學習者為 AWS Manila Community Day 做準備。App 應幫助學習者能有禮貌地與主辦者、講者、志工、場地人員,以及第一次見面的人說話。

提示詞

第一個有用的提示詞不應只要求「一個翻譯 App」。它應該定義產品契約。

建立一個用於準備 AWS Manila Community Day 的 Tagalog 學習 App。

使用者輸入一句英文句子。
回傳一張句子卡片,包含:
- 背景脈絡
- 英文輸入
- 自然 Tagalog
- 禮貌 Tagalog
- 友善 Filipino-English
- 俏皮 Filipino-English
- 語氣
- 文化脈絡
- 文法拆解
- 常見情境與慣用法
- 額外範例
- 發音指南
- 相關的情感、詩意、禮貌與實用句型

規則:
- 使用簡單英文說明。
- 先使用自然 Tagalog。
- 適合時,使用帶有 po、opo、kayo 或 ninyo 的禮貌 Tagalog。
- 將俏皮 Filipino-English 與正確正式 Tagalog 分開。
- 包含 AWS Manila Community Day 情境:打招呼、自我介紹、方向指引、工作坊、志工、等待時間,以及禮貌道別。
- 包含初學者能在活動中大聲說出的範例。

結果

App 會變得不只是字典。它會成為一個句子卡片產生器,具有穩定的結構,可由同一個前端渲染。每張卡片可以用多種語氣呈現同一句話,而不會讓學習者混淆。

提示

  • 先定義句子卡片 schema,再設計畫面。
  • 每個欄位都要短到適合手機閱讀。
  • 讓禮貌版本顯示在自然版本附近。
  • 只把俏皮 Filipino-English 當成有明確標籤的非正式風格。
  • 把發音與文化脈絡視為一級學習內容。

Demo 範例

最新的 HTML 內容在文章卡片中使用實用且不重複的範例:

Tagalog: Magpahinga muna tayo sa lilim.
英文: Let us rest in the shade first.

Tagalog: Umupo ka sandali kung nahihilo ka.
英文: Sit for a moment if you feel dizzy.

Tagalog: Paki-check po kung pumasok ang bayad.
英文: Please check if the payment came in.

這些範例很小,但能證明目前的產品方向。它們涵蓋健康建議、朋友間的關照、市場對話、付款確認,以及在 Manila 安全日常溝通。


第 2 部分:用示範句作為產品錨點

目標

使用真實示範片語來測試 App 是否教會實用、有禮貌且具文化意識的溝通。

提示詞

使用下列示範片語作為錨點範例:
1. Magpahinga muna tayo sa lilim. / Let us rest in the shade first.
2. Umupo ka sandali kung nahihilo ka. / Sit for a moment if you feel dizzy.
3. Paki-check po kung pumasok ang bayad. / Please check if the payment came in.

針對每個片語,說明:
- 在 AWS Manila Community Day 何時使用
- 為什麼禮貌形式很重要
- 哪些詞表達尊重
- 如何用友善隨性的風格說
- 如何避免在正式場合使用俏皮版本

結果

App 會得到明確的行為測試。如果它能清楚解釋這三個片語,就能支援健康指引、朋友間的關照、購物互動、付款確認,以及 Manila 的日常溝通。

提示

  • 在產生數百張卡片前,先選出錨點片語。
  • 把每個錨點片語當作 UI 測試案例。
  • 檢查禮貌標記是否出現在正確位置。
  • 檢查說明是否適合初學者。
  • 檢查俏皮版本是否沒有被呈現為正式 Tagalog。

從錨點片語推導的產品行為

1. 健康休息

自然 Tagalog: Magpahinga muna tayo sa lilim.
禮貌 Tagalog: Magpahinga muna tayo sa lilim.
使用情境:當某人疲倦或過熱時,建議在陰影處短暫休息。
技術註記:App 可以將此標記為 category = health_safety 與 tone = caring。

2. 暈眩照護

自然 Tagalog: Umupo ka sandali kung nahihilo ka.
禮貌 Tagalog: Umupo po kayo sandali kung nahihilo kayo.
使用情境:建議感到暈眩的人坐一下。
技術註記:App 可以將此標記為 category = health_advice 與 pattern = ____ kung ____。

3. 付款確認

自然 Tagalog: Paki-check kung pumasok ang bayad.
禮貌 Tagalog: Paki-check po kung pumasok ang bayad.
俏皮 Filipino-English: Payment check muna, all right.
使用情境:有禮貌地請對方確認付款是否已入帳。
技術註記:App 可以將此標記為 category = payment_check 與 tone = polite_request。

第 3 部分:建立能產生實用卡片的提示詞

目標

建立可重複使用的生成提示詞,產生活動可用的卡片,而不是隨機翻譯。

提示詞

你是一位 Tagalog 學習教練,正在協助一位初學者參加 AWS Manila Community Day。

為類別「工作坊提問」建立 10 張句子卡片。

每張卡片必須包含:
背景脈絡:
英文輸入:
自然 Tagalog:
禮貌 Tagalog:
友善 Filipino-English:
俏皮 Filipino-English:
語氣:
文化脈絡:
文法拆解:
常見情境與慣用法:
額外範例:
發音指南:
相關的情感、詩意、禮貌與實用句型:

規則:
- 自然 Tagalog 必須出現在俏皮 Filipino-English 之前。
- 當使用尊重語氣較安全時,使用 po、opo、kayo 與 ninyo。
- 包含實用的 AWS 活動詞彙,例如 workshop、session、demo、speaker、volunteer、registration、badge 與 venue。
- 說明句子是隨性、禮貌、正式、俏皮,或適合活動使用。
- 範例要短到適合手機閱讀。

結果

產生的內容可以儲存為 JSON 或 Markdown,並渲染到 App 中。每個句子都會變得可檢查、可重用,也容易改進。

提示

  • 產生內容時,要求一個類別,而不是整個 App。
  • 限制每一批生成數量,避免語氣不一致。
  • 將提示詞與生成內容放在一起,方便日後審閱。
  • 如果 App 會公開,加入人工審閱狀態欄位。
  • 保持提示詞穩定,一次只改一個需求。

產生卡片範例

背景脈絡:
當某人在 Manila 日常健康或安全情境中感到暈眩或疲倦時使用。

英文輸入:
Sit for a moment if you feel dizzy.

自然 Tagalog:
Umupo ka sandali kung nahihilo ka.

禮貌 Tagalog:
Umupo po kayo sandali kung nahihilo kayo.

友善 Filipino-English:
Sit muna po kung dizzy.

俏皮 Filipino-English:
Umupo muna, easy lang all right.

語氣:
關懷、實用,且適合安全提醒。

文化脈絡:
與警衛、工作人員、司機、攤商、長輩,以及第一次見面的人說話時,使用禮貌版本。

文法拆解:
- Umupo:坐下
- sandali:一下子
- kung:如果
- nahihilo:感到暈眩
- po:禮貌標記

常見情境與慣用法:
當某人可能需要短暫休息時,可用於健康、天氣、通勤、場地或等待情境。

額外範例:
1. Magpahinga muna tayo sa lilim. / Let us rest in the shade first.
2. Umupo ka sandali kung nahihilo ka. / Sit for a moment if you feel dizzy.
3. Paki-check po kung pumasok ang bayad. / Please check if the payment came in.

發音指南:
oo-MOO-poh kah sahn-DAH-lee koong nah-hee-HEE-loh kah.

相關句型:
使用 ____ kung ____ 表達簡單建議:Umupo ka kung nahihilo ka, Magpahinga ka kung pagod ka.

第 4 部分:作為技術分享的開發能力

目標

將 App 建置過程轉化為對開發者、學生、雲端建置者與社群志工都有用的技術分享場次。

技術架構

/tagalog-learning-app
  /content
    greetings.json
    directions.json
    workshops.json
    volunteers-time.json
  /public
    index.html
    article.html
    app.js
    styles.css
  /prompts
    sentence-card-generator.md
    qa-checklist.md

資料契約

{
  "category": "health_safety_money",
  "title": "Manila 日常:健康、安全、天氣與金錢",
  "cards": [
    {
      "id": "health-safety-001",
      "englishInput": "Sit for a moment if you feel dizzy.",
      "naturalTagalog": "Umupo ka sandali kung nahihilo ka.",
      "politeTagalog": "Umupo po kayo sandali kung nahihilo kayo.",
      "friendlyFilipinoEnglish": "Sit muna po kung dizzy.",
      "playfulFilipinoEnglish": "Umupo muna, easy lang all right.",
      "tone": "關懷、實用,且適合健康與安全提醒",
      "culturalContext": "與警衛、工作人員、司機、攤商、長輩與第一次接觸的人說話時,使用禮貌版本。",
      "grammar": [
        { "term": "Umupo", "meaning": "坐下" },
        { "term": "sandali", "meaning": "一下子" },
        { "term": "nahihilo", "meaning": "感到暈眩" },
        { "term": "po", "meaning": "禮貌標記" }
      ]
    }
  ]
}

渲染邏輯

function renderCard(card) {
  return `
    <article class="sentence-card">
      <h2>${card.englishInput}</h2>
      <p><strong>自然 Tagalog:</strong> ${card.naturalTagalog}</p>
      <p><strong>禮貌 Tagalog:</strong> ${card.politeTagalog}</p>
      <p><strong>友善 Filipino-English:</strong> ${card.friendlyFilipinoEnglish}</p>
      <p><strong>俏皮 Filipino-English:</strong> ${card.playfulFilipinoEnglish}</p>
      <p><strong>語氣:</strong> ${card.tone}</p>
    </article>
  `;
}

實作

附件展示了提示詞優先的產品設計,如何變成靜態 HTML 生成管線。它定義文章中繼資料、句子卡片資料集、擴充規則、發音輔助、文法拆解邏輯、範例生成、卡片渲染、響應式 CSS、文章頁寫入、索引頁寫入、ZIP 封裝,以及第二層一致性檢查。

from pathlib import Path
import html
import zipfile
import textwrap
import re
import json
import os

out_dir = Path(".")

# 含 20 字摘要的文章中繼資料
# 透過程式註解與日誌輸出的簡單空白字數計算檢查。
articles = [
    {
        "id": 1,
        "slug": "community-greetings-introductions",
        "title": "Community Day:問候與有禮貌的自我介紹",
        "category": "Community Day",
        "summary": (
            "練習禮貌問候、姓名、初學者片語與溫暖自我介紹,"
            "在 Manila 自信地認識講者、志工、學生與開發者。"
        ),
    },
    {
        "id": 2,
        "slug": "community-directions-registration",
        "title": "Community Day:方向、場地與報到",
        "category": "Community Day",
        "summary": (
            "學習活動期間可用於報到、房間、座位、洗手間、出口、"
            "排隊、名牌與禮貌求助的實用場地片語。"
        ),
    },
    {
        "id": 3,
        "slug": "community-workshops-learning",
        "title": "Manila 日常:健康、安全、天氣與金錢",
        "category": "Community Day",
        "summary": (
            "用尊重的 Tagalog 詢問工作坊問題、請對方重複、討論 demo、"
            "serverless 想法、AI 解決方案、cloud lab 與學習目標。"
        ),
    },
    {
        "id": 4,
        "slug": "community-networking-belonging",
        "title": "Community Day:交流、連結與歸屬感",
        "category": "Community Day",
        "summary": (
            "使用友善片語與開發者、學生、領導者與同儕連結,"
            "同時表達興奮、謙遜、感謝與歸屬感。"
        ),
    },
    {
        "id": 5,
        "slug": "community-volunteers-time-goodbye",
        "title": "Community Day:志工、等待、時間與道別",
        "category": "Community Day",
        "summary": (
            "感謝志工、掌握等待時間、有禮貌地道歉、協調抵達、"
            "溫暖道別,並用實用片語尊重時程。"
        ),
    },
    {
        "id": 6,
        "slug": "friendship-one-question-one-answer",
        "title": "友情 Tagalog:一個問題,一個溫柔回答",
        "category": "Friendship",
        "summary": (
            "練習關於真誠、回答、希望、勇氣與坦率感受的原創友情問題,"
            "不複製任何受版權保護的歌詞。"
        ),
    },
    {
        "id": 7,
        "slug": "friendship-friends-only-feelings",
        "title": "友情 Tagalog:只是朋友的感受",
        "category": "Friendship",
        "summary": (
            "使用尊重、柔和、適合初學者的 Tagalog 句型,"
            "學習關於友情、不確定、希望、界線與情感清楚度的溫柔片語。"
        ),
    },
    {
        "id": 8,
        "slug": "friendship-you-are-my-beloved",
        "title": "友情 Tagalog:你是我珍視的人",
        "category": "Friendship",
        "summary": (
            "探索關於關心、情意、信任、支持與選擇某人的原創詩意奉獻片語,"
            "使用溫暖但簡單的 Tagalog。"
        ),
    },
    {
        "id": 9,
        "slug": "friendship-honest-heart-deep-feelings",
        "title": "友情 Tagalog:真誠的心與深層感受",
        "category": "Friendship",
        "summary": (
            "建立自然禮貌 Tagalog 詞彙,用於真實情緒、緊張的心、"
            "真誠欣賞、安靜思念與謹慎告白。"
        ),
    },
    {
        "id": 10,
        "slug": "friendship-distance-hope-promises",
        "title": "友情 Tagalog:距離、希望與承諾",
        "category": "Friendship",
        "summary": (
            "練習關於距離、等待、承諾、北方與南方、"
            "希望、耐心,以及依然穩定的愛的原創片語。"
        ),
    },
]

community_sets = {
    1: [
        (
            "I am happy to meet you today.",
            "Masaya akong makilala ka ngayon.",
            "Masaya po akong makilala kayo ngayon.",
            "Happy to meet you today, kumusta!",
            "Masaya akong makilala ka ngayon, all right.",
            "溫暖、禮貌、適合活動",
        ),
        (
            "Hello, I am learning Tagalog.",
            "Kumusta, nag-aaral ako ng Tagalog.",
            "Kumusta po, nag-aaral po ako ng Tagalog.",
            "Hello po, learning Tagalog ako.",
            "Kumusta, learning Tagalog na ako, all right.",
            "友善、適合初學者",
        ),
        (
            "My name is Martinez.",
            "Ako si Martinez.",
            "Ako po si Martinez.",
            "Hi po, ako si Martinez.",
            "Ako si Martinez, ready na ako all right.",
            "簡單自我介紹",
        ),
        (
            "This is my first time in Manila.",
            "First time ko sa Manila.",
            "First time ko po sa Manila.",
            "First time ko po sa Manila, excited ako.",
            "First time ko sa Manila, all right amazed.",
            "個人、興奮",
        ),
        (
            "I want to greet everyone politely.",
            "Gusto kong bumati sa lahat nang magalang.",
            "Gusto ko pong bumati sa lahat nang magalang.",
            "Gusto ko pong mag-greet sa lahat.",
            "Gusto kong mag-greet sa lahat, polite mode all right.",
            "尊重、實用",
        ),
        (
            "Good morning, everyone.",
            "Magandang umaga sa lahat.",
            "Magandang umaga po sa inyong lahat.",
            "Good morning po sa lahat.",
            "Magandang umaga, ready na tayo all right.",
            "正式問候",
        ),
        (
            "May I sit here?",
            "Puwede ba akong umupo dito?",
            "Puwede po ba akong umupo dito?",
            "Can I sit here po?",
            "Puwede ba akong umupo dito, all right?",
            "禮貌請求",
        ),
        (
            "I am a beginner, so please speak slowly.",
            "Baguhan ako, kaya pakibagalan.",
            "Baguhan po ako, kaya pakibagalan po.",
            "Beginner po ako, slow lang please.",
            "Beginner ako, slow lang all right please.",
            "謙遜、實用",
        ),
        (
            "I am excited to join Manila Community Day.",
            "Excited akong sumali sa Manila Community Day.",
            "Excited po akong sumali sa Manila Community Day.",
            "Excited po ako for Manila Community Day.",
            "Excited na ako sa Community Day, all right.",
            "興奮、適合活動",
        ),
        (
            "Thank you for welcoming me.",
            "Salamat sa pagtanggap sa akin.",
            "Salamat po sa pagtanggap sa akin.",
            "Thank you po for welcoming me.",
            "Salamat sa welcome, belong na ako all right.",
            "感謝、情感",
        ),
    ],
    2: [
        (
            "Where is the registration area?",
            "Saan ang registration area?",
            "Saan po ang registration area?",
            "Saan po ang registration area, please?",
            "Saan ang registration area, ready na ako all right.",
            "禮貌問路",
        ),
        (
            "Where is the workshop room?",
            "Saan ang workshop room?",
            "Saan po ang workshop room?",
            "Saan po ang workshop room, please?",
            "Saan ang workshop room, workshop mode all right.",
            "實用、適合活動",
        ),
        (
            "Could you point me to the entrance?",
            "Puwede mo ba akong ituro sa entrance?",
            "Puwede po ba ninyo akong ituro sa entrance?",
            "Pa-point po sa entrance?",
            "Point me sa entrance, lost na ako all right.",
            "禮貌求助",
        ),
        (
            "Is this the correct line?",
            "Tamang pila ba ito?",
            "Tamang pila po ba ito?",
            "Correct line po ba ito?",
            "Tamang pila ba ito, checking all right.",
            "排隊、實用",
        ),
        (
            "Where can I get my badge?",
            "Saan ko makukuha ang badge ko?",
            "Saan ko po makukuha ang badge ko?",
            "Saan po badge pickup?",
            "Saan badge ko, excited na all right.",
            "報到、禮貌",
        ),
        (
            "Is there a seat available here?",
            "May bakanteng upuan ba dito?",
            "May bakanteng upuan po ba dito?",
            "May seat po ba dito?",
            "May seat ba dito, sit na ako all right.",
            "禮貌、座位",
        ),
        (
            "Where is the restroom?",
            "Saan ang restroom?",
            "Saan po ang restroom?",
            "Saan po ang CR?",
            "Saan ang CR, quick lang all right.",
            "實用方向指引",
        ),
        (
            "What time does the next session start?",
            "Anong oras magsisimula ang susunod na session?",
            "Anong oras po magsisimula ang susunod na session?",
            "What time po next session?",
            "Next session what time, all right.",
            "時間、適合活動",
        ),
        (
            "Please wait for me for a few minutes.",
            "Hintayin mo ako ng ilang minuto.",
            "Hintayin n’yo po ako ng ilang minuto.",
            "Wait me for a few minutes po.",
            "Hintayin mo ako, papunta na ako all right.",
            "等待、協調",
        ),
        (
            "Please check if the payment arrived.",
            "Paki-check kung pumasok ang bayad sa venue.",
            "Paki-check po kung pumasok ang bayad sa venue.",
            "Payment received po ba?",
            "Paki-check kung pumasok ang bayad sa venue, all right.",
            "付款確認",
        ),
    ],
}

# 透過建立情境變體,將每 10 個基礎句擴充為 40 個。
community_contexts = [
    ("at the morning registration", "sa morning registration"),
    ("before the workshop starts", "bago magsimula ang workshop"),
    ("while meeting a volunteer", "habang may nakikilalang volunteer"),
    ("after the session", "pagkatapos ng session"),
]

friendship_contexts = [
    ("when speaking softly", "kapag marahang nagsasalita"),
    ("while waiting for an answer", "habang naghihintay ng sagot"),
    ("in a sincere message", "sa isang tapat na mensahe"),
    ("with a careful heart", "nang may maingat na puso"),
]


def expand(base, article_id):
    contexts = community_contexts if article_id <= 5 else friendship_contexts
    cards = []

    for i, b in enumerate(base):
        for j, (enctx, tlctx) in enumerate(contexts):
            eng, nat, pol, friendly, playful, tone = b

            # 讓句子保持清楚;把情境放在背景中,
            # 不一定要附加到每一個翻譯。
            cards.append(
                {
                    "num": len(cards) + 1,
                    "background": (
                        f"在 {enctx} 使用這個句子。它有助於連結情感、文化、"
                        "禮貌與實用溝通。"
                    ),
                    "english": eng,
                    "natural": nat,
                    "polite": pol,
                    "friendly": friendly,
                    "playful": playful,
                    "tone": tone,
                    "context_en": enctx,
                    "context_tl": tlctx,
                }
            )

    return cards[:40]


for a in articles:
    base = community_sets.get(a["id"]) or friendship_sets.get(a["id"])
    a["cards"] = expand(base, a["id"])


# 簡單的發音生成,用來產生一致的指南。
pron_map = {
    "Kumusta": "koo-MOOS-tah",
    "Salamat": "sah-LAH-maht",
    "Puwede": "PWEH-deh",
    "Saan": "SAH-ahn",
    "Ako": "AH-koh",
    "po": "poh",
    "kayo": "KAH-yoh",
    "ninyo": "NEEN-yoh",
    "n’yo": "nyoh",
    "Gusto": "GOOS-toh",
    "Excited": "ek-SAI-ted",
    "Nandito": "nahn-DEE-toh",
    "Papunta": "pah-POON-tah",
    "Hintayin": "hin-tah-YEEN",
    "Pasensya": "pah-SEN-shah",
    "Mahalaga": "mah-hah-LAH-gah",
    "Sasamahan": "sah-sah-MAH-hahn",
    "Kahit": "kah-HEET",
    "Manila": "mah-NEE-lah",
    "Tagalog": "tah-GAH-log",
    "magtanong": "mag-tah-NONG",
    "pakiulit": "pah-kee-OO-lit",
}


def pronunciation(tl):
    # 使用已知片語開頭提供精簡指南,並加上簡單備援。
    for k, v in pron_map.items():
        if tl.startswith(k) or f" {k}" in tl:
            # 標示第一個相關片段,並加入容易閱讀的文字。
            return (
                f"慢慢且清楚地說。從這裡開始:{v}。讓 'po' 保持柔和,"
                "並重讀本指南中的大寫音節。"
            )

    return (
        "清楚讀出每個母音:a 讀作 ah,e 讀作 eh,i 讀作 ee,o 讀作 oh,u 讀作 oo。"
        "保持最後一個音節清楚。"
    )


def breakdown(card):
    e = card["english"].lower()
    nat = card["natural"]
    items = []

    def add(tag, meaning):
        items.append((tag, meaning))

    if "thank" in e or "salamat" in nat.lower():
        add("Salamat", "謝謝;核心感謝用語")
        add(
            "po",
            "與長輩、講者、主辦者、志工或新認識的人說話時使用的禮貌標記",
        )
        add("sa", "依情境可表示 for、in、at 或 to")

    elif "where" in e or nat.lower().startswith("saan"):
        add("Saan", "哪裡;用來詢問地點或方向")
        add("po", "用於尊重提問的禮貌標記")
        add("ang", "放在被詢問的地點或事物前的焦點標記")

    elif "may i" in e or "could" in e or "please" in e:
        add("Puwede / Paki-", "可以、能否或請;讓請求更柔和")
        add("po", "禮貌標記")
        add("ba", "用於是非問句的疑問標記")

    elif "wait" in e or "way" in e or "late" in e:
        add(
            "Hintayin / Papunta / Pasensya",
            "用於協調的等待、在路上與道歉詞彙",
        )
        add("na", "現在或 all right;常表示狀態改變")
        add("po", "禮貌標記")

    elif any(
        w in e
        for w in [
            "heart",
            "love",
            "feel",
            "answer",
            "friends",
            "hope",
            "promise",
            "dear",
            "admire",
        ]
    ):
        add("puso / damdamin", "心或感受;情感詞彙")
        add("sana", "希望或願望;讓句子更溫柔")
        add(
            "po / kayo / ninyo",
            "當語氣需要保持謹慎且禮貌時使用的尊重形式",
        )

    elif "excited" in e:
        add("Excited ako", "我很期待;常見 Filipino-English 表達")
        add("-ng / akong", "連接『我是』與下一個動作的連接形式")
        add("sumali / matuto", "參加或學習")

    else:
        add("Ako / ko", "我或我的;標記說話者")
        add("ka / kayo", "你;kayo 可表示禮貌或複數")
        add("po", "用於表達尊重的禮貌標記")

    return items[:3]


def examples(card, article_id):
    if article_id <= 5:
        return [
            ("Magpahinga muna tayo sa lilim.", "Let us rest in the shade first."),
            ("Umupo ka sandali kung nahihilo ka.", "Sit for a moment if you feel dizzy."),
            ("Paki-check po kung pumasok ang bayad.", "Please check if the payment came in."),
        ]

    return [
        ("Sana maintindihan mo ako.", "I hope you understand me."),
        ("Makikinig po ako nang may respeto.", "I will listen with respect."),
        ("Tapat ang damdamin ko, all right.", "My feeling is sincere all right."),
    ]


def sentence_card_html(card, article):
    bds = "".join(
        f"<li><strong>{html.escape(k)}:</strong> {html.escape(v)}</li>"
        for k, v in breakdown(card)
    )

    exs = "".join(
        (
            f"<li><strong>Tagalog:</strong> {html.escape(tl)}<br>"
            f"<strong>English:</strong> {html.escape(en)}</li>"
        )
        for tl, en in examples(card, article["id"])
    )

    related = (
        "活動句型:與講者、主辦者、志工,以及第一次見面的人說話時,"
        "先使用禮貌版本。隨性與俏皮風格比較適合在建立關係後與同儕使用。"
        if article["id"] <= 5
        else (
            "情感句型:讓句子保持溫柔、避免施壓;當尊重與謹慎語氣很重要時,"
            "使用 sana、po、kayo 或 ninyo。"
        )
    )

    return f"""
    <article class="sentence-card" id="sentence-{card['num']}">
      <h3>句子 {card['num']}</h3>
      <dl class="template">
        <dt>背景脈絡:</dt><dd>{html.escape(card['background'])}</dd>
        <dt>英文輸入:</dt><dd>{html.escape(card['english'])}</dd>
        <dt>自然 Tagalog:</dt><dd lang="tl">{html.escape(card['natural'])}</dd>
        <dt>禮貌 Tagalog:</dt><dd lang="tl">{html.escape(card['polite'])}</dd>
        <dt>友善 Filipino-English:</dt><dd>{html.escape(card['friendly'])}</dd>
        <dt>俏皮 Filipino-English:</dt><dd>{html.escape(card['playful'])}</dd>
        <dt>語氣:</dt><dd>{html.escape(card['tone'])}</dd>
        <dt>文化脈絡:</dt><dd>與長輩、講者、主辦者、志工、場地人員與第一次接觸的人說話時,使用禮貌形式。當情境感覺輕鬆時,才與朋友或同儕使用隨性說法。</dd>
        <dt>文法拆解:</dt><dd><ul>{bds}</ul></dd>
        <dt>常見情境與慣用法:</dt><dd>這個片語適用於 {html.escape(card['context_en'])}。它同時教導正確 Tagalog 與安全尊重的選項。</dd>
        <dt>額外範例:</dt><dd><ol>{exs}</ol></dd>
        <dt>發音指南:</dt><dd>{html.escape(pronunciation(card['polite']))}</dd>
        <dt>相關的情感、詩意、禮貌與實用句型理解:</dt><dd>{html.escape(related)}</dd>
      </dl>
    </article>"""

開發能力

這裡的開發能力,是設計一條可重複使用的內容管線:提示詞輸入、結構化 schema、審閱清單與靜態渲染器。這讓文章不只對語言學習有用,也適合作為技術分享。

分享角度

做技術分享時,不要把 App 描述成「AI 魔法」。要把它呈現為一個有紀律的內容系統:

  • 提示詞契約控制輸出一致性。
  • JSON schema 控制渲染。
  • 靜態 HTML 能快速證明學習迴圈。
  • 響應式設計讓 App 在手機上也實用。
  • 人工審閱保護文化準確性。

第 5 部分:給開發者的現場筆記

現場筆記 1:契約優先內容

背景:如果每次輸出都有不同形狀,翻譯 App 會變得混亂。

目標:讓每一張句子卡片都可預期。

提示詞:建立一張卡片,包含自然 Tagalog、禮貌 Tagalog、友善 Filipino-English、俏皮 Filipino-English、文法、範例、發音與文化脈絡。

結果:UI 可以用同一個元件渲染每一張卡片。

提示:

  • 使用單一 schema。
  • 保持欄位名稱穩定。
  • 將內容與設計分離。
  • 擴大規模前先審閱一個類別。
  • 保存生成提示詞。

現場筆記 2:把禮貌當成產品邏輯

背景:學習者需要知道何時使用 poopokayoninyo

目標:透過可見的替代版本教導尊重。

提示詞:當學習者與長輩、講者、主辦者、志工、場地人員或第一次接觸的人說話時,一律包含禮貌版本。

結果:App 不只是翻譯;它也教社交脈絡。

提示:

  • 把禮貌 Tagalog 放在自然 Tagalog 附近。
  • 說明誰應該使用禮貌說法。
  • 避免在聽起來不自然的地方過度使用禮貌標記。
  • 並排顯示隨性與禮貌版本。
  • 加上語氣標籤。

現場筆記 3:俏皮風格需要界線

背景:Filipino-English 可以讓 App 更有趣,但學習者可能會把俏皮風格和正式 Tagalog 混淆。

目標:讓 App 保持好玩,同時不讓學習者在正式情境中聽起來不合宜。

提示詞:將俏皮 Filipino-English 標記為非正式,並先顯示自然 Tagalog。

結果:像 Payment check muna, all right 這樣的俏皮句子會成為隨性選項,而不是預設的正式答案。

提示:

  • 清楚標示俏皮輸出。
  • 與同儕使用,而不是對正式講者使用。
  • 說明 na 有時可以承載「all right」的概念。
  • 保持俏皮範例簡短。
  • 絕不要用俏皮版本取代自然版本。

現場筆記 4:行動優先的卡片審閱

背景:活動學習者通常會在場地內用手機使用 App。

目標:讓最有用的句子容易找到,也容易大聲說出來。

提示詞:在手機上先放文章內容,然後透過按鈕顯示文章清單。

結果:學習者會先閱讀目前課程,再前往其他頁面。

提示:

  • 保持標籤簡短。
  • 使用大的可點擊目標。
  • 避免在卡片內放太密集的段落。
  • 把發音放在片語附近。
  • 用單手測試。

現場筆記 5:demo 驅動 QA

背景:生成式 App 可能看起來完整,卻仍無法滿足實際活動使用情境。

目標:使用三個示範片語測試 App。

提示詞:用 Magpahinga muna tayo sa lilimUmupo ka sandali kung nahihilo kaPaki-check po kung pumasok ang bayad 驗證每個類別。

結果:App 會持續貼近感謝、尊重提問與抵達協調等實際需求。

提示:

  • 將錨點片語作為回歸測試。
  • 確認文法拆解存在。
  • 確認禮貌版本存在。
  • 確認俏皮版本已標記。
  • 確認範例適合活動使用。

結語反思

為 AWS Manila Community Day 建立 Tagalog 學習 App,是一個帶有人本目的的小型技術專案。它幫助學習者帶著謙遜抵達、提出更好的問題、感謝志工,並準備好產生歸屬感。技術上的啟發很簡單:當提示詞成為契約,App 就更容易建置、審閱與分享。