💡 Idea Check
@@ -192,6 +394,66 @@ export default function IdeaPage() { {loading ? "Analyzing..." : "Assess Idea"} + +Recent Batch Exports
++ Re-export replays the saved snapshot payload when available. +
+Batch Assessment Summary
+
- 🦉 Owlscope
+
+
+
+ 🦉 Owlscope
-
+
Deep search, evaluation & recommendation for open-source projects,
libraries, and Agent Skills.
- {/* Search */}
- {/* Quick Actions */}
-
+
- {/* Results */}
);
diff --git a/web/src/app/zh/chat/page.tsx b/web/src/app/zh/chat/page.tsx
new file mode 100644
index 0000000..168487a
--- /dev/null
+++ b/web/src/app/zh/chat/page.tsx
@@ -0,0 +1 @@
+export { default } from "../../chat/page";
diff --git a/web/src/app/zh/compare/page.tsx b/web/src/app/zh/compare/page.tsx
new file mode 100644
index 0000000..815de86
--- /dev/null
+++ b/web/src/app/zh/compare/page.tsx
@@ -0,0 +1 @@
+export { default } from "../../compare/page";
diff --git a/web/src/app/zh/idea/page.tsx b/web/src/app/zh/idea/page.tsx
new file mode 100644
index 0000000..f8806fb
--- /dev/null
+++ b/web/src/app/zh/idea/page.tsx
@@ -0,0 +1 @@
+export { default } from "../../idea/page";
diff --git a/web/src/app/zh/page.tsx b/web/src/app/zh/page.tsx
new file mode 100644
index 0000000..894e1ae
--- /dev/null
+++ b/web/src/app/zh/page.tsx
@@ -0,0 +1,85 @@
+"use client";
+
+import { useState } from "react";
+import { useRouter } from "next/navigation";
+import { SearchBar } from "@/components/search-bar";
+import { SearchResults } from "@/components/search-results";
+
+export default function HomeZh() {
+ const [results, setResults] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const router = useRouter();
+
+ const handleSearch = async (query: string) => {
+ setLoading(true);
+ try {
+ const res = await fetch("/api/v1/search", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ query, limit: 20 }),
+ });
+ const data = await res.json();
+ setResults(data.recommendations || []);
+ } catch {
+ setResults([]);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+ 🦉 Owlscope
+
+
+ 面向开发者与 AI Agent 的开源情报引擎,帮助你快速检索、评估与选择开源方案。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/web/src/app/zh/project/[id]/page.tsx b/web/src/app/zh/project/[id]/page.tsx
new file mode 100644
index 0000000..393f97e
--- /dev/null
+++ b/web/src/app/zh/project/[id]/page.tsx
@@ -0,0 +1 @@
+export { default } from "../../../project/[id]/page";
diff --git a/web/src/app/zh/stack/page.tsx b/web/src/app/zh/stack/page.tsx
new file mode 100644
index 0000000..574677a
--- /dev/null
+++ b/web/src/app/zh/stack/page.tsx
@@ -0,0 +1 @@
+export { default } from "../../stack/page";
diff --git a/web/src/components/navbar.tsx b/web/src/components/navbar.tsx
index 5d7cf43..1070059 100644
--- a/web/src/components/navbar.tsx
+++ b/web/src/components/navbar.tsx
@@ -13,28 +13,66 @@ const NAV_ITEMS = [
export function Navbar() {
const pathname = usePathname();
+ const isZh = pathname === "/zh" || pathname.startsWith("/zh/");
+ const localPath = isZh ? pathname.replace(/^\/zh/, "") || "/" : pathname;
+ const enHref = localPath;
+ const zhHref = localPath === "/" ? "/zh" : `/zh${localPath}`;
+
+ const navItems = isZh
+ ? [
+ { href: "/zh", label: "搜索", icon: "🔍" },
+ { href: "/zh/idea", label: "想法验证", icon: "💡" },
+ { href: "/zh/chat", label: "对话", icon: "💬" },
+ { href: "/zh/compare", label: "对比", icon: "⚖️" },
+ { href: "/zh/stack", label: "技术栈", icon: "🧩" },
+ ]
+ : NAV_ITEMS;
return (
-
+ 🦉 Owlscope
-+
Deep search, evaluation & recommendation for open-source projects, libraries, and Agent Skills.
+ 🦉 Owlscope +
++ 面向开发者与 AI Agent 的开源情报引擎,帮助你快速检索、评估与选择开源方案。 +
+