diff --git a/src/components/article.tsx b/src/components/article.tsx index 0ea69d9..3b3929f 100644 --- a/src/components/article.tsx +++ b/src/components/article.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import intl = require("react-intl-universal") import { renderToString } from "react-dom/server" import { RSSItem } from "../scripts/models/item" import { openExternal } from "../scripts/utils" @@ -11,6 +12,7 @@ const FONT_SIZE_OPTIONS = [12, 13, 14, 15, 16, 17, 18, 19, 20] type ArticleProps = { item: RSSItem source: RSSSource + locale: string dismiss: () => void toggleHasRead: (item: RSSItem) => void toggleStarred: (item: RSSItem) => void @@ -57,13 +59,13 @@ class Article extends React.Component { items: [ { key: "openInBrowser", - text: "在浏览器中打开", + text: intl.get("openExternal"), iconProps: {iconName: "NavigateExternalInline"}, onClick: this.openInBrowser }, { key: "toggleHidden", - text: this.props.item.hidden ? "取消隐藏" : "隐藏文章", + text: this.props.item.hidden ? intl.get("article.unhide") : intl.get("article.hide"), onClick: () => { this.props.toggleHidden(this.props.item) } } ] @@ -128,7 +130,7 @@ class Article extends React.Component { articleView = () => "article/article.html?h=" + window.btoa(encodeURIComponent(renderToString(<>

{this.props.item.title}

-

{this.props.item.date.toLocaleString("zh-cn", {hour12: false})}

+

{this.props.item.date.toLocaleString(this.props.locale, {hour12: !this.props.locale.startsWith("zh")})}

))) + `&s=${this.state.fontSize}&u=${this.props.item.link}&d=${Number(document.body.classList.contains("dark"))}` @@ -144,35 +146,35 @@ class Article extends React.Component { this.props.toggleHasRead(this.props.item)} /> this.props.toggleStarred(this.props.item)} /> diff --git a/src/components/context-menu.tsx b/src/components/context-menu.tsx index c99937e..0836725 100644 --- a/src/components/context-menu.tsx +++ b/src/components/context-menu.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import intl = require("react-intl-universal") import { clipboard } from "electron" import { openExternal, cutText, googleSearch } from "../scripts/utils" import { ContextualMenu, IContextualMenuItem, ContextualMenuItemType, DirectionalHint } from "office-ui-fabric-react/lib/ContextualMenu" @@ -34,7 +35,7 @@ export class ContextMenu extends React.Component { case ContextMenuType.Item: return [ { key: "showItem", - text: "阅读", + text: intl.get("context.read"), iconProps: { iconName: "TextDocument" }, onClick: () => { this.props.markRead(this.props.item) @@ -43,7 +44,7 @@ export class ContextMenu extends React.Component { }, { key: "openInBrowser", - text: "在浏览器中打开", + text: intl.get("openExternal"), iconProps: { iconName: "NavigateExternalInline" }, onClick: () => { this.props.markRead(this.props.item) @@ -53,25 +54,25 @@ export class ContextMenu extends React.Component { this.props.item.hasRead ? { key: "markAsUnread", - text: "标为未读", + text: intl.get("article.markUnread"), iconProps: { iconName: "RadioBtnOn", style: { fontSize: 14, textAlign: "center" } }, onClick: () => { this.props.markUnread(this.props.item) } } : { key: "markAsRead", - text: "标为已读", + text: intl.get("article.markRead"), iconProps: { iconName: "StatusCircleRing" }, onClick: () => { this.props.markRead(this.props.item) } }, { key: "toggleStarred", - text: this.props.item.starred ? "取消星标" : "标为星标", + text: this.props.item.starred ? intl.get("article.unstar") : intl.get("article.star"), iconProps: { iconName: this.props.item.starred ? "FavoriteStar" : "FavoriteStarFill" }, onClick: () => { this.props.toggleStarred(this.props.item) } }, { key: "toggleHidden", - text: this.props.item.hidden ? "取消隐藏" : "隐藏文章", + text: this.props.item.hidden ? intl.get("article.unhide") : intl.get("article.hide"), onClick: () => { this.props.toggleHidden(this.props.item) } }, { @@ -80,25 +81,25 @@ export class ContextMenu extends React.Component { }, { key: "copyTitle", - text: "复制标题", + text: intl.get("context.copyTitle"), onClick: () => { clipboard.writeText(this.props.item.title) } }, { key: "copyURL", - text: "复制链接", + text: intl.get("context.copyURL"), onClick: () => { clipboard.writeText(this.props.item.link) } } ] case ContextMenuType.Text: return [ { key: "copyText", - text: "复制", + text: intl.get("context.copy"), iconProps: { iconName: "Copy" }, onClick: () => { clipboard.writeText(this.props.text) } }, { key: "searchText", - text: `使用Google搜索“${cutText(this.props.text, 15)}”`, + text: intl.get("context.search", { text: cutText(this.props.text, 15) }), iconProps: { iconName: "Search" }, onClick: () => { googleSearch(this.props.text) } } @@ -108,12 +109,12 @@ export class ContextMenu extends React.Component { key: "section_1", itemType: ContextualMenuItemType.Section, sectionProps: { - title: "视图", + title: intl.get("context.view"), bottomDivider: true, items: [ { key: "cardView", - text: "卡片视图", + text: intl.get("context.cardView"), iconProps: { iconName: "GridViewMedium" }, canCheck: true, checked: this.props.viewType === ViewType.Cards, @@ -121,7 +122,7 @@ export class ContextMenu extends React.Component { }, { key: "listView", - text: "列表视图", + text: intl.get("context.listView"), iconProps: { iconName: "BacklogList" }, canCheck: true, checked: this.props.viewType === ViewType.List, @@ -134,12 +135,12 @@ export class ContextMenu extends React.Component { key: "section_2", itemType: ContextualMenuItemType.Section, sectionProps: { - title: "筛选", + title: intl.get("context.filter"), bottomDivider: true, items: [ { key: "allArticles", - text: "全部文章", + text: intl.get("allArticles"), iconProps: { iconName: "ClearFilter" }, canCheck: true, checked: (this.props.filter & ~FeedFilter.ShowHidden) == FeedFilter.Default, @@ -147,7 +148,7 @@ export class ContextMenu extends React.Component { }, { key: "unreadOnly", - text: "仅未读文章", + text: intl.get("context.unreadOnly"), iconProps: { iconName: "RadioBtnOn", style: { fontSize: 14, textAlign: "center" } }, canCheck: true, checked: (this.props.filter & ~FeedFilter.ShowHidden) == FeedFilter.UnreadOnly, @@ -155,7 +156,7 @@ export class ContextMenu extends React.Component { }, { key: "starredOnly", - text: "仅星标文章", + text: intl.get("context.starredOnly"), iconProps: { iconName: "FavoriteStarFill" }, canCheck: true, checked: (this.props.filter & ~FeedFilter.ShowHidden) == FeedFilter.StarredOnly, @@ -166,7 +167,7 @@ export class ContextMenu extends React.Component { }, { key: "showHidden", - text: "显示隐藏文章", + text: intl.get("context.showHidden"), canCheck: true, checked: Boolean(this.props.filter & FeedFilter.ShowHidden), onClick: () => this.props.toggleFilter(FeedFilter.ShowHidden) diff --git a/src/components/feeds/cards-feed.tsx b/src/components/feeds/cards-feed.tsx index 916025a..292ce82 100644 --- a/src/components/feeds/cards-feed.tsx +++ b/src/components/feeds/cards-feed.tsx @@ -1,5 +1,6 @@ import * as React from "react" -import { Feed, FeedProps } from "./feed" +import intl = require("react-intl-universal") +import { FeedProps } from "./feed" import DefaultCard from "../cards/default-card" import { PrimaryButton } from 'office-ui-fabric-react'; @@ -47,7 +48,7 @@ class CardsFeed extends React.Component { { (this.props.feed.loaded && !this.props.feed.allLoaded) ?
this.props.loadMore(this.props.feed)} />
: null diff --git a/src/components/feeds/list-feed.tsx b/src/components/feeds/list-feed.tsx index d737305..23baca7 100644 --- a/src/components/feeds/list-feed.tsx +++ b/src/components/feeds/list-feed.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import intl = require("react-intl-universal") import { FeedProps } from "./feed" import { DefaultButton } from 'office-ui-fabric-react'; import ListCard from "../cards/list-card"; @@ -22,7 +23,7 @@ class ListFeed extends React.Component { { (this.props.feed.loaded && !this.props.feed.allLoaded) ?
this.props.loadMore(this.props.feed)} />
: null diff --git a/src/components/log-menu.tsx b/src/components/log-menu.tsx index 4f232ec..c252e34 100644 --- a/src/components/log-menu.tsx +++ b/src/components/log-menu.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import intl = require("react-intl-universal") import { Callout, ActivityItem, Icon, DirectionalHint } from "@fluentui/react" import { AppLog, AppLogType } from "../scripts/models/app" import Time from "./utils/time" @@ -29,7 +30,7 @@ class LogMenu extends React.Component { onDismiss={() => this.props.close()} > { this.props.logs.length == 0 - ?

无消息

+ ?

{intl.get("log.empty")}

: this.activityItems().map((item => ( ))) } diff --git a/src/components/menu.tsx b/src/components/menu.tsx index 2d58b8a..95471f3 100644 --- a/src/components/menu.tsx +++ b/src/components/menu.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import intl = require("react-intl-universal") import { Icon } from "@fluentui/react/lib/Icon" import { Nav, INavLink, INavLinkGroup } from "office-ui-fabric-react/lib/Nav" import { SourceGroup } from "../scripts/models/group" @@ -23,13 +24,13 @@ export class Menu extends React.Component { { links: [ { - name: "搜索", + name: intl.get("search"), key: "search", icon: "Search", url: null }, { - name: "全部文章", + name: intl.get("allArticles"), key: ALL, icon: "TextDocument", onClick: this.props.allArticles, @@ -78,14 +79,14 @@ export class Menu extends React.Component {
e.stopPropagation()}>
- - + +