Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ Then open [http://localhost:8080](http://localhost:8080).

- **Main repository:** [github.com/Funput/Funput](https://github.com/Funput/Funput)
- **Docs:** [docs.funput.app](https://docs.funput.app)
- **Windows (Microsoft Store):** [Funput on Microsoft Store](https://apps.microsoft.com/store/detail/9NR3WL5PD4ZS)
- **Releases:** [github.com/Funput/Funput/releases](https://github.com/Funput/Funput/releases)

## Contributing
Expand Down
11 changes: 6 additions & 5 deletions public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## Summary

Funput (Funput IME) is an open-source Vietnamese input method. It lets people type Vietnamese with Telex or VNI on iOS, Android, macOS, Windows, and Linux. Desktop builds are available from GitHub Releases; iOS is on the App Store and Android is on Google Play.
Funput (Funput IME) is an open-source Vietnamese input method. It lets people type Vietnamese with Telex or VNI on iOS, Android, macOS, Windows, and Linux. Windows is available on Microsoft Store; desktop builds are also available from GitHub Releases. iOS is on the App Store and Android is on Google Play.

## Platforms

Expand All @@ -13,7 +13,7 @@ Funput runs on:
- iOS — Vietnamese keyboard for iPhone and iPad; requires iOS/iPadOS 18.6+; available on the App Store
- Android — Vietnamese keyboard for phones and tablets; requires Android 8.0 (API 26)+; available on Google Play
- macOS — native input method; requires macOS 26 (Tahoe)+; ready to download
- Windows — native input method; requires Windows 10 version 1809+ or Windows 11; ready to download
- Windows — native input method; requires Windows 10 version 1809+ or Windows 11; available on Microsoft Store (ID 9NR3WL5PD4ZS), with a portable build also on GitHub
- Linux — native input method (Fcitx5 and IBus); install guide: https://docs.funput.app/docs/install/linux/

## Features
Expand All @@ -28,14 +28,14 @@ Funput runs on:
## Official app pages

- [Funput for macOS](https://funput.app/macos/): Vietnamese input method for macOS 26+, Apple Silicon and Intel; .pkg or .app.zip.
- [Funput for Windows](https://funput.app/windows/): Vietnamese input method for Windows 10 version 1809+ and Windows 11; portable x86-64 .exe.
- [Funput for Windows](https://funput.app/windows/): Vietnamese input method for Windows 10 version 1809+ and Windows 11; install and update through Microsoft Store, with an optional portable x86-64 .exe.
- [Funput for Linux](https://funput.app/linux/): Vietnamese input method for Fcitx5 and IBus; Ubuntu, Debian, Fedora, openSUSE and Arch on x86-64.
- [Funput for iOS](https://funput.app/ios/): Vietnamese keyboard for iPhone and iPad; App Store ID 6788829996.
- [Funput for Android](https://funput.app/android/): Vietnamese keyboard for phones and tablets; Google Play package app.funput.funput.
- [Introducing Funput](https://funput.app/blog/funput-la-gi/): Vietnamese introduction to Funput, Telex/VNI, supported devices and official downloads.
- [Telex, VNI and advanced Telex](https://funput.app/blog/telex-vni-va-telex-nang-cao/): Vietnamese typing guide with key mappings, examples and Funput advanced Telex shortcuts.
- [Set up Funput on iPhone and iPad](https://funput.app/blog/cach-bat-ban-phim-funput-iphone-ipad/): Illustrated keyboard setup, Full Access explanation and troubleshooting.
- [Install Funput on Windows](https://funput.app/blog/cai-funput-windows-10-11/): Windows 10/11 portable setup, typing methods, system tray, troubleshooting and updates.
- [Install Funput on Windows](https://funput.app/blog/cai-funput-windows-10-11/): Windows 10/11 Microsoft Store installation, typing methods, system tray, troubleshooting, Store updates and optional portable setup.
- [Blog](https://funput.app/blog/): Published updates from Funput.
- [Move from Windows to Linux](https://funput.app/blog/chuyen-windows-sang-linux-go-tieng-viet/): Keep familiar Telex/VNI typing with Funput, configure Fcitx5 or IBus and verify everyday workflows.
- [A modern Vietnamese input method for Linux](https://funput.app/blog/bo-go-tieng-viet-linux-hien-dai/): Funput features, package updates, maintenance evaluation and practical migration checks.
Expand All @@ -50,7 +50,8 @@ Funput runs on:
- Website: https://funput.app
- Privacy: https://funput.app/privacy/
- Documentation: https://docs.funput.app/
- Download (desktop): https://github.com/Funput/Funput/releases
- Microsoft Store (Windows): https://apps.microsoft.com/store/detail/9NR3WL5PD4ZS
- Download (desktop / portable): https://github.com/Funput/Funput/releases
- App Store (iOS): https://apps.apple.com/vn/app/id6788829996
- Google Play (Android): https://play.google.com/store/apps/details?id=app.funput.funput
- Source: https://github.com/Funput/Funput
Expand Down
11 changes: 11 additions & 0 deletions scripts/check_seo.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,17 @@ def handle_endtag(self, tag):
assert home_app == app, f"App identity differs across pages: {platform}"
assert f"/{platform}/" in pages["/"].links
assert f"{SITE}/{platform}/" in (DIST / "llms.txt").read_text()
windows_store = "https://apps.microsoft.com/store/detail/9NR3WL5PD4ZS"
windows_page = pages["/windows/"]
windows_app = next(node for node in windows_page.schemas if node.get("@id") == f"{SITE}/windows/#app")
assert windows_app["downloadUrl"] == windows_app["installUrl"] == windows_store
assert windows_app["offers"]["url"] == windows_store
assert windows_app["identifier"] == "9NR3WL5PD4ZS"
assert windows_store in windows_app["sameAs"]
assert "Microsoft Store" in windows_page.meta["description"]
for route in ("/", "/windows/", "/blog/cai-funput-windows-10-11/", "/blog/funput-la-gi/"):
assert windows_store in pages[route].links, f"Missing Microsoft Store link: {route}"
assert windows_store in (DIST / "llms.txt").read_text()
for platform in ("macos", "windows", "linux", "ios", "android"):
page = pages[f"/{platform}/"]
app_id = f"{SITE}/{platform}/#app"
Expand Down
77 changes: 71 additions & 6 deletions src/components/DesktopPlatform.astro
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
import PlatformLinks from './PlatformLinks.astro';
import MicrosoftStoreButton from './MicrosoftStoreButton.astro';
import { PLATFORMS } from '../lib/platforms';
import { DESKTOP } from '../lib/desktop';
import { platformPageJsonLd } from '../lib/seo';
Expand All @@ -27,17 +28,31 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
<section class="desktop-hero" aria-label={`Funput cho ${platform.name}`}>
<div class="hero-copy">
<p class="page-eyebrow">FUNPUT / {platform.name}</p>
{id === 'windows' && (
<p class="store-status">
<span aria-hidden="true">✦</span> Đã có trên Microsoft Store
</p>
)}
<h1 class="page-title">
{content.headline}
<br />
<em>{content.accent}</em>
<span class="sr-only"> Bộ gõ tiếng Việt cho {platform.name}</span>
</h1>
<p class="page-lead">{content.lead}</p>
<a class="site-button" href={platform.ctaHref}>
{platform.ctaLabel}
<span aria-hidden="true">↗</span>
</a>
{id === 'windows' ? (
<div class="windows-actions">
<MicrosoftStoreButton />
<a class="portable-link" href={links.RELEASES_URL}>
Bản portable trên GitHub <span aria-hidden="true">↗</span>
</a>
</div>
) : (
<a class="site-button" href={platform.ctaHref}>
{platform.ctaLabel}
<span aria-hidden="true">↗</span>
</a>
)}
<p class="free-note">Miễn phí · Mã nguồn mở · Telex & VNI</p>
</div>
<figure>
Expand All @@ -53,7 +68,11 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
alt={platform.screenshotAlt}
fetchpriority="high"
/>
<figcaption>Thiết kế riêng cho {platform.name}. Quen ngay từ lần gõ đầu.</figcaption>
<figcaption>
{id === 'windows'
? 'Thiết kế riêng cho Windows. Tải miễn phí trên Microsoft Store.'
: `Thiết kế riêng cho ${platform.name}. Quen ngay từ lần gõ đầu.`}
</figcaption>
</figure>
</section>
<section class="requirements" aria-label="Yêu cầu hệ thống">
Expand Down Expand Up @@ -81,6 +100,11 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
Gõ vui mỗi ngày.
</h2>
<a href={docs}>Hướng dẫn cài đặt {platform.name} ↗</a>
{id === 'windows' && (
<p class="install-store-link">
<a href={links.WINDOWS_STORE_URL}>Mở Funput trên Microsoft Store ↗</a>
</p>
)}
</div>
<ol>
{content.steps.map(([title, body]) => (
Expand All @@ -104,6 +128,11 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
))}
<p class="source-note">
Funput là bộ gõ tiếng Việt miễn phí, phát hành theo giấy phép MIT.{' '}
{id === 'windows' && (
<>
<a href={links.WINDOWS_STORE_URL}>Tải trên Microsoft Store</a>,{' '}
</>
)}
<a href={links.RELEASES_URL}>Các bản phát hành</a>,{' '}
<a href={links.GITHUB_URL}>xem mã nguồn</a> hoặc đọc{' '}
<a href="/privacy/">chính sách quyền riêng tư</a>.
Expand All @@ -120,6 +149,42 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
</article>
</BaseLayout>
<style>
.store-status {
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 22px;
padding: 7px 12px;
background: var(--sage);
color: #4a5a31;
border: 1px solid #d5dec4;
border-radius: 6px;
font-size: 11px;
font-weight: 500;
}
.store-status span {
color: #687c48;
font-size: 16px;
}
.windows-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 18px 24px;
margin-top: 30px;
}
.portable-link {
color: var(--muted);
font-size: 12px;
text-decoration: underline;
text-underline-offset: 4px;
}
.portable-link:hover {
color: #ba3919;
}
.install-store-link {
margin-top: 16px;
}
.windows-guide {
margin-top: 32px;
font-size: 14px;
Expand Down Expand Up @@ -161,7 +226,7 @@ const docs = `${links.INSTALL_DOCS_URL}${id}/`;
min-width: 0;
}
.windows figure {
background: #e5eaf0;
background: linear-gradient(140deg, #e5eaf0, #edf0e2);
}
.linux figure {
background: #eee6da;
Expand Down
Loading
Loading