From 958d220329e418d7702764978ba07b583e4f4c97 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Wed, 11 Jan 2023 11:47:14 +0800 Subject: [PATCH] update sponsor (#178) * [home]add sponsor * [home]add sponsor * update readme * update sponsor --- README.md | 11 +- README_CN.md | 10 +- home/i18n/en/code.json | 484 ++++++++++++++++++ .../options.json | 14 + .../current.json | 22 + .../en/docusaurus-theme-classic/footer.json | 62 +++ .../en/docusaurus-theme-classic/navbar.json | 54 ++ home/i18n/zh-cn/code.json | 229 ++++++++- .../current.json | 2 +- .../docusaurus-theme-classic/footer.json | 2 +- .../docusaurus-theme-classic/navbar.json | 2 +- home/src/pages/components/Sponsor.js | 31 ++ home/src/pages/components/Sponsor.module.css | 68 +++ home/src/pages/index.js | 4 + home/static/img/icons/eoapi_logo.jpg | Bin 0 -> 45414 bytes home/static/img/icons/postcat_logo.svg | 1 + 16 files changed, 972 insertions(+), 24 deletions(-) create mode 100644 home/i18n/en/code.json create mode 100644 home/i18n/en/docusaurus-plugin-content-blog/options.json create mode 100644 home/i18n/en/docusaurus-plugin-content-docs/current.json create mode 100644 home/i18n/en/docusaurus-theme-classic/footer.json create mode 100644 home/i18n/en/docusaurus-theme-classic/navbar.json create mode 100644 home/src/pages/components/Sponsor.js create mode 100644 home/src/pages/components/Sponsor.module.css create mode 100644 home/static/img/icons/eoapi_logo.jpg create mode 100644 home/static/img/icons/postcat_logo.svg diff --git a/README.md b/README.md index 676608b..8b8de5d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,3 @@ -自荐下我们新的全职开源项目 **[HertzBeat赫兹节拍](https://github.com/dromara/hertzbeat)** - 易用友好的高性能监控告警系统。 -网站监测,PING连通性,端口可用性,数据库监控,API监控,自定义监控,阈值告警,告警通知。 - -**代码仓库: [GITHUB](https://github.com/dromara/hertzbeat) | [GITEE](https://gitee.com/dromara/hertzbeat)** -**官网: [hertzbeat.com](https://hertzbeat.com) | [tancloud.cn](https://tancloud.cn)** -**[在线使用](https://console.tancloud.cn)** https://console.tancloud.cn - -欢迎使用,点赞,推荐,灰常感谢🙏。 - -

sureness @@ -244,6 +234,7 @@ See [CONTRIBUTING](CONTRIBUTING.md) ## 🌞 Friend's Links +* **```HertzBeat```** An open-source, real-time monitoring system with custom-monitor and agentLess: [Github](https://github.com/dromara/hertzbeat) * **```JustAuth```** A Java library of third-party authorized login: [Github](https://github.com/justauth/JustAuth) * **```MaxKey```** Leading-Edge Enterprise-Class open source IAM Identity and Access management product: [Github](https://github.com/dromara/MaxKey) * **```PhalApi```** PHP Api Framework: [Website](https://www.phalapi.net/) diff --git a/README_CN.md b/README_CN.md index 17caea5..0406534 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,12 +1,3 @@ -自荐下我们新的全职开源项目 **[HertzBeat赫兹节拍](https://gitee.com/dromara/hertzbeat)** - 易用友好的高性能监控告警系统。 -网站监测,PING连通性,端口可用性,数据库监控,API监控,自定义监控,阈值告警,告警通知。 - -**代码仓库: [GITHUB](https://github.com/dromara/hertzbeat) | [GITEE](https://gitee.com/dromara/hertzbeat)** -**官网: [hertzbeat.com](https://hertzbeat.com) | [tancloud.cn](https://tancloud.cn)** -**[在线使用](https://console.tancloud.cn)** https://console.tancloud.cn - -欢迎使用,点赞,推荐,灰常感谢🙏。 -

sureness @@ -262,6 +253,7 @@ Sureness提供了下面这些常用接口作为扩展点: ## 🌞 开源推荐 +* **```HertzBeat```** 易用友好的实时监控系统,无需Agent,强大自定义监控能力: [Github](https://github.com/dromara/hertzbeat) * **```JustAuth```** 小而全而美的第三方登录开源组件: [Gitee](https://gitee.com/yadong.zhang/JustAuth) * **```MaxKey```** 业界领先的企业级开源IAM身份管理和身份认证产品: [Gitee](https://gitee.com/dromara/MaxKey) * **```PhalApi```** 一个轻量级PHP开源接口框架: [官网](https://www.phalapi.net/) diff --git a/home/i18n/en/code.json b/home/i18n/en/code.json new file mode 100644 index 0000000..618b1e7 --- /dev/null +++ b/home/i18n/en/code.json @@ -0,0 +1,484 @@ +{ + "Extendable": { + "message": "Extendable" + }, + "Focus on the protection of {restApi}. Based on {rbac}.{br}Provides {authentication} and {authorization}, etc.{br}Extension custom interface is {simple} and really {useful}.": { + "message": "Focus on the protection of {restApi}. Based on {rbac}.{br}Provides {authentication} and {authorization}, etc.{br}Extension custom interface is {simple} and really {useful}." + }, + "Compatible": { + "message": "Compatible" + }, + "Support {WebSockets}, HTTP containers ({Servlet} and {JaxRs}).{br}No framework dependency.{native} supports {SpringBoot}, {SpringWebFlux}, {Javalin}, {Quarkus},{Ktor}, {Solon}, {Jfinal}, {Micronaut} etc.": { + "message": "Support {WebSockets}, HTTP containers ({Servlet} and {JaxRs}).{br}No framework dependency.{native} supports {SpringBoot}, {SpringWebFlux}, {Javalin}, {Quarkus},{Ktor}, {Solon}, {Jfinal}, {Micronaut} etc." + }, + "Multi And Fast": { + "message": "Multi And Fast" + }, + "Supports {jwt}, {basic}, {digest} etc.{br}{dynamic} modification of {perm}.{br}{high} with {tree}.": { + "message": "Supports {jwt}, {basic}, {digest} etc.{br}{dynamic} modification of {perm}.{br}{high} with {tree}." + }, + "Focus on Protection of API": { + "message": "Focus on Protection of API" + }, + "Get Started": { + "message": "Get Started" + }, + "Support for Jvm Modern Frameworks": { + "message": "Support for Jvm Modern Frameworks" + }, + "Sureness allows you to security any server written with jvm modern frameworks such as {Spring}, {SpringBoot}, {SpringWebFlux}, {Javalin}, {Quarkus}, {Micronaut}, {Solon}, {Jfinal} or {Ktor} as well as frameworks for Kotlin.": { + "message": "Sureness allows you to security any server written with jvm modern frameworks such as {Spring}, {SpringBoot}, {SpringWebFlux}, {Javalin}, {Quarkus}, {Micronaut}, {Solon}, {Jfinal} or {Ktor} as well as frameworks for Kotlin." + }, + "The essence of Sureness is to use {interceptor}(like servlet filter or Spring interceptor) to intercept all rest requests for authenticating and authorizing.{br}So no matter any framework, as long as it has a interceptor, it can integrate with sureness. Sureness uses {handling}, {checkIn} will return {SubjectSum}(user information) when auth success, or throw different types of auth exceptions when auth error.": { + "message": "The essence of Sureness is to use {interceptor}(like servlet filter or Spring interceptor) to intercept all rest requests for authenticating and authorizing.{br}So no matter any framework, as long as it has a interceptor, it can integrate with sureness. Sureness uses {handling}, {checkIn} will return {SubjectSum}(user information) when auth success, or throw different types of auth exceptions when auth error." + }, + "Multi Support Samples": { + "message": "Multi Support Samples" + }, + "Benchmark Compare": { + "message": "Benchmark Compare" + }, + "{Benchmark} test shows Sureness to lose 0.026ms performance compared to frameless application, Shiro lose 0.088ms, Spring Security lose 0.116ms.{br}In contrast, Sureness basically does not consume performance, and the performance (TPS loss) is {times3} that of Shiro and {times4} that of Spring Security.{br}{increases}.": { + "message": "{Benchmark} test shows Sureness to lose 0.026ms performance compared to frameless application, Shiro lose 0.088ms, Spring Security lose 0.116ms.{br}In contrast, Sureness basically does not consume performance, and the performance (TPS loss) is {times3} that of Shiro and {times4} that of Spring Security.{br}{increases}." + }, + "Why Is High Performance": { + "message": "Why Is High Performance" + }, + "In a large number of requests, we found that the {linear} of the {filter} is a performance bottleneck. {br}So we used a {tree} instead of {ant}.{br}Practice has proved that it is very {effective}.": { + "message": "In a large number of requests, we found that the {linear} of the {filter} is a performance bottleneck. {br}So we used a {tree} instead of {ant}.{br}Practice has proved that it is very {effective}." + }, + "Get Started With Sureness within Minutes": { + "message": "Get Started With Sureness within Minutes" + }, + "We provide many tutorials and samples, you can refer to them to builda complete permission project within 10 minutes.{br}Have Fun!": { + "message": "We provide many tutorials and samples, you can refer to them to builda complete permission project within 10 minutes.{br}Have Fun!" + }, + "sponsor": { + "message": "sponsor" + }, + "Friend Links": { + "message": "Friend Links" + }, + "theme.ErrorPageContent.title": { + "message": "This page crashed.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Try again", + "description": "The label of the button to try again when the page crashed" + }, + "theme.NotFound.title": { + "message": "Page Not Found", + "description": "The title of the 404 page" + }, + "theme.NotFound.p1": { + "message": "We could not find what you were looking for.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.admonition.note": { + "message": "note", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.danger": { + "message": "danger", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.caution": { + "message": "caution", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Close", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Scroll back to top", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "Archive", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archive", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Blog list page navigation", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Newer Entries", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Older Entries", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog post page navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Newer Post", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Older Post", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "One post|{count} posts", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} tagged with \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "View All Tags", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "Switch between dark and light mode (currently {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dark mode", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "light mode", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.home": { + "message": "Home page", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} items", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Docs pages navigation", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Previous", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Next", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "One doc tagged|{count} docs tagged", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} with \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "latest version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Edit this page", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Direct link to heading", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " on {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " by {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Last updated{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versions", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.common.skipToMainContent": { + "message": "Skip to main content", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Blog recent posts navigation", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "Copied", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copy code to clipboard", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Copy", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Toggle word wrap", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { + "message": "Toggle the collapsible sidebar category '{label}'", + "description": "The ARIA label to toggle the collapsible sidebar category" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Languages", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "On this page", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "Read More", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Read more about {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "One min read|{readingTime} min read", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Back to main menu", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.SearchBar.label": { + "message": "Search", + "description": "The ARIA label and placeholder for search button" + }, + "theme.SearchModal.searchBox.resetButtonTitle": { + "message": "Clear the query", + "description": "The label and ARIA label for search box reset button" + }, + "theme.SearchModal.searchBox.cancelButtonText": { + "message": "Cancel", + "description": "The label and ARIA label for search box cancel button" + }, + "theme.SearchModal.startScreen.recentSearchesTitle": { + "message": "Recent", + "description": "The title for recent searches" + }, + "theme.SearchModal.startScreen.noRecentSearchesText": { + "message": "No recent searches", + "description": "The text when no recent searches" + }, + "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { + "message": "Save this search", + "description": "The label for save recent search button" + }, + "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { + "message": "Remove this search from history", + "description": "The label for remove recent search button" + }, + "theme.SearchModal.startScreen.favoriteSearchesTitle": { + "message": "Favorite", + "description": "The title for favorite searches" + }, + "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { + "message": "Remove this search from favorites", + "description": "The label for remove favorite search button" + }, + "theme.SearchModal.errorScreen.titleText": { + "message": "Unable to fetch results", + "description": "The title for error screen of search modal" + }, + "theme.SearchModal.errorScreen.helpText": { + "message": "You might want to check your network connection.", + "description": "The help text for error screen of search modal" + }, + "theme.SearchModal.footer.selectText": { + "message": "to select", + "description": "The explanatory text of the action for the enter key" + }, + "theme.SearchModal.footer.selectKeyAriaLabel": { + "message": "Enter key", + "description": "The ARIA label for the Enter key button that makes the selection" + }, + "theme.SearchModal.footer.navigateText": { + "message": "to navigate", + "description": "The explanatory text of the action for the Arrow up and Arrow down key" + }, + "theme.SearchModal.footer.navigateUpKeyAriaLabel": { + "message": "Arrow up", + "description": "The ARIA label for the Arrow up key button that makes the navigation" + }, + "theme.SearchModal.footer.navigateDownKeyAriaLabel": { + "message": "Arrow down", + "description": "The ARIA label for the Arrow down key button that makes the navigation" + }, + "theme.SearchModal.footer.closeText": { + "message": "to close", + "description": "The explanatory text of the action for Escape key" + }, + "theme.SearchModal.footer.closeKeyAriaLabel": { + "message": "Escape key", + "description": "The ARIA label for the Escape key button that close the modal" + }, + "theme.SearchModal.footer.searchByText": { + "message": "Search by", + "description": "The text explain that the search is making by Algolia" + }, + "theme.SearchModal.noResultsScreen.noResultsText": { + "message": "No results for", + "description": "The text explains that there are no results for the following search" + }, + "theme.SearchModal.noResultsScreen.suggestedQueryText": { + "message": "Try searching for", + "description": "The text for the suggested query when no results are found for the following search" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsText": { + "message": "Believe this query should return results?", + "description": "The text for the question where the user thinks there are missing results" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { + "message": "Let us know.", + "description": "The text for the link to report missing results" + }, + "theme.SearchModal.placeholder": { + "message": "Search docs", + "description": "The placeholder of the input of the DocSearch pop-up modal" + }, + "theme.SearchBar.seeAll": { + "message": "See all {count} results" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "One document found|{count} documents found", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.existingResultsTitle": { + "message": "Search results for \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Search the documentation", + "description": "The search page title for empty query" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Type your search here", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Search", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.algoliaLabel": { + "message": "Search by Algolia", + "description": "The ARIA label for Algolia mention" + }, + "theme.SearchPage.noResultsText": { + "message": "No results were found", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Fetching new results...", + "description": "The paragraph for fetching new search results" + }, + "theme.IdealImageMessage.loading": { + "message": "Loading...", + "description": "When the full-scale image is loading" + }, + "theme.IdealImageMessage.load": { + "message": "Click to load{sizeMessage}", + "description": "To prompt users to load the full image. sizeMessage is a parenthesized size figure." + }, + "theme.IdealImageMessage.offline": { + "message": "Your browser is offline. Image not loaded", + "description": "When the user is viewing an offline document" + }, + "theme.IdealImageMessage.404error": { + "message": "404. Image not found", + "description": "When the image is not found" + }, + "theme.IdealImageMessage.error": { + "message": "Error. Click to reload", + "description": "When the image fails to load for unknown error" + }, + "theme.PwaReloadPopup.info": { + "message": "New version available", + "description": "The text for PWA reload popup" + }, + "theme.PwaReloadPopup.refreshButtonText": { + "message": "Refresh", + "description": "The text for PWA reload button" + }, + "theme.PwaReloadPopup.closeButtonAriaLabel": { + "message": "Close", + "description": "The ARIA label for close button of PWA reload popup" + }, + "theme.Playground.result": { + "message": "Result", + "description": "The result label of the live codeblocks" + }, + "theme.Playground.liveEditor": { + "message": "Live Editor", + "description": "The live editor label of the live codeblocks" + } +} diff --git a/home/i18n/en/docusaurus-plugin-content-blog/options.json b/home/i18n/en/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000..9239ff7 --- /dev/null +++ b/home/i18n/en/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "Blog", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "Blog", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "Recent posts", + "description": "The label for the left sidebar" + } +} diff --git a/home/i18n/en/docusaurus-plugin-content-docs/current.json b/home/i18n/en/docusaurus-plugin-content-docs/current.json new file mode 100644 index 0000000..ae155ff --- /dev/null +++ b/home/i18n/en/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,22 @@ +{ + "version.label": { + "message": "Next", + "description": "The label for version current" + }, + "sidebar.docs.category.Guides": { + "message": "Guides", + "description": "The label for category Guides in sidebar docs" + }, + "sidebar.docs.category.Advanced": { + "message": "Advanced", + "description": "The label for category Advanced in sidebar docs" + }, + "sidebar.docs.category.Integrate": { + "message": "Integrate", + "description": "The label for category Integrate in sidebar docs" + }, + "sidebar.docs.category.Others": { + "message": "Others", + "description": "The label for category Others in sidebar docs" + } +} diff --git a/home/i18n/en/docusaurus-theme-classic/footer.json b/home/i18n/en/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000..f41d701 --- /dev/null +++ b/home/i18n/en/docusaurus-theme-classic/footer.json @@ -0,0 +1,62 @@ +{ + "link.title.About Sureness": { + "message": "About Sureness", + "description": "The title of the footer links column with title=About Sureness in the footer" + }, + "link.title.Community": { + "message": "Community", + "description": "The title of the footer links column with title=Community in the footer" + }, + "link.title.More": { + "message": "More", + "description": "The title of the footer links column with title=More in the footer" + }, + "link.item.label.Github": { + "message": "Github", + "description": "The label of footer link with label=Github linking to https://github.com/dromara/sureness" + }, + "link.item.label.Gitee": { + "message": "Gitee", + "description": "The label of footer link with label=Gitee linking to https://gitee.com/dromara/sureness" + }, + "link.item.label.High Performance": { + "message": "High Performance", + "description": "The label of footer link with label=High Performance linking to https://github.com/tomsun28/sureness-shiro-spring-security-benchmark" + }, + "link.item.label.Dashboard": { + "message": "Dashboard", + "description": "The label of footer link with label=Dashboard linking to https://github.com/dromara/sureness/projects/1" + }, + "link.item.label.Dromara": { + "message": "Dromara", + "description": "The label of footer link with label=Dromara linking to https://dromara.org" + }, + "link.item.label.Github Discussion": { + "message": "Github Discussion", + "description": "The label of footer link with label=Github Discussion linking to https://github.com/dromara/sureness/discussions" + }, + "link.item.label.Gitter Channel": { + "message": "Gitter Channel", + "description": "The label of footer link with label=Gitter Channel linking to https://gitter.im/usthe/sureness" + }, + "link.item.label.QQ Group - 390083213": { + "message": "QQ Group - 390083213", + "description": "The label of footer link with label=QQ Group - 390083213 linking to https://qm.qq.com/cgi-bin/qm/qr?k=3IpzQjFOztJe464_eMBmDHfT0YTWK5Qa&jump_from=webapi" + }, + "link.item.label.Tom Blog": { + "message": "Tom Blog", + "description": "The label of footer link with label=Tom Blog linking to https://blog.usthe.com" + }, + "link.item.label.USTHE": { + "message": "USTHE", + "description": "The label of footer link with label=USTHE linking to https://github.com/usthe" + }, + "link.item.label.Tom": { + "message": "Tom", + "description": "The label of footer link with label=Tom linking to https://github.com/tomsun28" + }, + "copyright": { + "message": "Apache License 2.0 | Copyright © 2022", + "description": "The footer copyright" + } +} diff --git a/home/i18n/en/docusaurus-theme-classic/navbar.json b/home/i18n/en/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000..b6bef2a --- /dev/null +++ b/home/i18n/en/docusaurus-theme-classic/navbar.json @@ -0,0 +1,54 @@ +{ + "title": { + "message": " ", + "description": "The title in the navbar" + }, + "item.label.Document": { + "message": "Document", + "description": "Navbar item with label Document" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Dashboard": { + "message": "Dashboard", + "description": "Navbar item with label Dashboard" + }, + "item.label.High Performance": { + "message": "High Performance", + "description": "Navbar item with label High Performance" + }, + "item.label.Discuss": { + "message": "Discuss", + "description": "Navbar item with label Discuss" + }, + "item.label.Other": { + "message": "Other", + "description": "Navbar item with label Other" + }, + "item.label.Github Discussion": { + "message": "Github Discussion", + "description": "Navbar item with label Github Discussion" + }, + "item.label.Gitter Channel": { + "message": "Gitter Channel", + "description": "Navbar item with label Gitter Channel" + }, + "item.label.QQ Group - 390083213": { + "message": "QQ Group - 390083213", + "description": "Navbar item with label QQ Group - 390083213" + }, + "item.label.Design": { + "message": "Design", + "description": "Navbar item with label Design" + }, + "item.label.Contributing": { + "message": "Contributing", + "description": "Navbar item with label Contributing" + }, + "item.label.Sponsor": { + "message": "Sponsor", + "description": "Navbar item with label Sponsor" + } +} diff --git a/home/i18n/zh-cn/code.json b/home/i18n/zh-cn/code.json index e8df934..d8f109e 100644 --- a/home/i18n/zh-cn/code.json +++ b/home/i18n/zh-cn/code.json @@ -125,7 +125,7 @@ }, "theme.docs.versions.latestVersionSuggestionLabel": { "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", - "description": "The label userd to tell the user that he's browsing an unmaintained doc version" + "description": "The label used to tell the user to check the latest version" }, "theme.docs.versions.latestVersionLinkLabel": { "message": "latest version", @@ -270,5 +270,230 @@ }, "Media Partners": { "message": "合作媒体" + }, + "sponsor": { + "message": "特别赞助" + }, + "theme.ErrorPageContent.title": { + "message": "页面已崩溃。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "重试", + "description": "The label of the button to try again when the page crashed" + }, + "theme.admonition.note": { + "message": "备注", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "提示", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.danger": { + "message": "危险", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "信息", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.caution": { + "message": "警告", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到顶部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "历史博文", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "历史博文", + "description": "The page & hero description of the blog archive page" + }, + "theme.colorToggle.ariaLabel": { + "message": "切换浅色/暗黑模式(当前为{mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "暗黑模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "浅色模式", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.home": { + "message": "主页面", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "页面路径", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} 个项目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} 篇文档带有标签", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged}「{tagName}」", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "选择版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近博文导航", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切换自动换行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { + "message": "打开/收起侧边栏菜单「{label}」", + "description": "The ARIA label to toggle the collapsible sidebar category" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "选择语言", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "本页总览", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMoreLabel": { + "message": "阅读 {title} 的全文", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← 回到主菜单", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.SearchBar.seeAll": { + "message": "查看全部 {count} 个结果" + }, + "theme.SearchModal.searchBox.resetButtonTitle": { + "message": "清除查询", + "description": "The label and ARIA label for search box reset button" + }, + "theme.SearchModal.searchBox.cancelButtonText": { + "message": "取消", + "description": "The label and ARIA label for search box cancel button" + }, + "theme.SearchModal.startScreen.recentSearchesTitle": { + "message": "最近搜索", + "description": "The title for recent searches" + }, + "theme.SearchModal.startScreen.noRecentSearchesText": { + "message": "没有最近搜索", + "description": "The text when no recent searches" + }, + "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { + "message": "保存这个搜索", + "description": "The label for save recent search button" + }, + "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { + "message": "从历史记录中删除这个搜索", + "description": "The label for remove recent search button" + }, + "theme.SearchModal.startScreen.favoriteSearchesTitle": { + "message": "收藏", + "description": "The title for favorite searches" + }, + "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { + "message": "从收藏列表中删除这个搜索", + "description": "The label for remove favorite search button" + }, + "theme.SearchModal.errorScreen.titleText": { + "message": "无法获取结果", + "description": "The title for error screen of search modal" + }, + "theme.SearchModal.errorScreen.helpText": { + "message": "你可能需要检查网络连接。", + "description": "The help text for error screen of search modal" + }, + "theme.SearchModal.footer.selectText": { + "message": "选中", + "description": "The explanatory text of the action for the enter key" + }, + "theme.SearchModal.footer.selectKeyAriaLabel": { + "message": "Enter 键", + "description": "The ARIA label for the Enter key button that makes the selection" + }, + "theme.SearchModal.footer.navigateText": { + "message": "导航", + "description": "The explanatory text of the action for the Arrow up and Arrow down key" + }, + "theme.SearchModal.footer.navigateUpKeyAriaLabel": { + "message": "向上键", + "description": "The ARIA label for the Arrow up key button that makes the navigation" + }, + "theme.SearchModal.footer.navigateDownKeyAriaLabel": { + "message": "向下键", + "description": "The ARIA label for the Arrow down key button that makes the navigation" + }, + "theme.SearchModal.footer.closeText": { + "message": "关闭", + "description": "The explanatory text of the action for Escape key" + }, + "theme.SearchModal.footer.closeKeyAriaLabel": { + "message": "Esc 键", + "description": "The ARIA label for the Escape key button that close the modal" + }, + "theme.SearchModal.footer.searchByText": { + "message": "搜索提供", + "description": "The text explain that the search is making by Algolia" + }, + "theme.SearchModal.noResultsScreen.noResultsText": { + "message": "没有结果:", + "description": "The text explains that there are no results for the following search" + }, + "theme.SearchModal.noResultsScreen.suggestedQueryText": { + "message": "试试搜索", + "description": "The text for the suggested query when no results are found for the following search" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsText": { + "message": "认为这个查询应该有结果?", + "description": "The text for the question where the user thinks there are missing results" + }, + "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { + "message": "请告知我们。", + "description": "The text for the link to report missing results" + }, + "theme.SearchModal.placeholder": { + "message": "搜索文档", + "description": "The placeholder of the input of the DocSearch pop-up modal" + }, + "theme.IdealImageMessage.loading": { + "message": "加载中……", + "description": "When the full-scale image is loading" + }, + "theme.IdealImageMessage.load": { + "message": "点击加载图片{sizeMessage}", + "description": "To prompt users to load the full image. sizeMessage is a parenthesized size figure." + }, + "theme.IdealImageMessage.offline": { + "message": "你的浏览器处于离线状态。图片未加载", + "description": "When the user is viewing an offline document" + }, + "theme.IdealImageMessage.404error": { + "message": "未找到图片", + "description": "When the image is not found" + }, + "theme.IdealImageMessage.error": { + "message": "出现错误,点击重试", + "description": "When the image fails to load for unknown error" } -} \ No newline at end of file +} diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current.json b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current.json index 1219707..946b180 100644 --- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current.json +++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current.json @@ -19,4 +19,4 @@ "message": "其它", "description": "The label for category Others in sidebar docs" } -} \ No newline at end of file +} diff --git a/home/i18n/zh-cn/docusaurus-theme-classic/footer.json b/home/i18n/zh-cn/docusaurus-theme-classic/footer.json index 20f91fa..bb22193 100644 --- a/home/i18n/zh-cn/docusaurus-theme-classic/footer.json +++ b/home/i18n/zh-cn/docusaurus-theme-classic/footer.json @@ -59,4 +59,4 @@ "message": "Tom", "description": "The label of footer link with label=Tom linking to https://github.com/tomsun28" } -} \ No newline at end of file +} diff --git a/home/i18n/zh-cn/docusaurus-theme-classic/navbar.json b/home/i18n/zh-cn/docusaurus-theme-classic/navbar.json index a69ddd9..f83d926 100644 --- a/home/i18n/zh-cn/docusaurus-theme-classic/navbar.json +++ b/home/i18n/zh-cn/docusaurus-theme-classic/navbar.json @@ -51,4 +51,4 @@ "message": "赞助", "description": "Navbar item with label Sponsor" } -} \ No newline at end of file +} diff --git a/home/src/pages/components/Sponsor.js b/home/src/pages/components/Sponsor.js new file mode 100644 index 0000000..f51f1d6 --- /dev/null +++ b/home/src/pages/components/Sponsor.js @@ -0,0 +1,31 @@ +import React from 'react' +import styles from './Sponsor.module.css' +import "slick-carousel/slick/slick.css"; +import "slick-carousel/slick/slick-theme.css"; + +const iconCommonUrl = '/img/icons/' + +export default class Sponsor extends React.Component { + constructor (props) { + super(props) + } + + render () { + return ( + <> +

+

{this.props.headerTitle}

+
+ + {''}/ +
+

Postcat

+

开源API管理工具、接口文档、接口测试、Mock

+
+
+
+
+ + ) + } +} diff --git a/home/src/pages/components/Sponsor.module.css b/home/src/pages/components/Sponsor.module.css new file mode 100644 index 0000000..892b66e --- /dev/null +++ b/home/src/pages/components/Sponsor.module.css @@ -0,0 +1,68 @@ +.cardList { + margin: -0.35rem; + display: flex; + flex-wrap: wrap; + align-items: flex-start; + width: 100%; +} + +.cardItem { + width: calc(33.33333% - .7rem); + margin: 0.35rem; + background: var(--bodyBg); + border-radius: 3px; + color: var(--textColor); + display: flex; + box-shadow: 1px 1px 2px 0 rgb(0 0 0 / 6%); + transition: all .4s; + background-color: var(--wdio-dark-section-background-color); +} + +.cardItemTextBody { + flex: 1; + display: inline-block; + float: right; + padding: 1rem 0; +} + +.cardItem:hover img { + box-shadow: 3px 2px 7px rgb(0 0 0 / 15%); +} + +.name { + margin: 0.2rem 0 0.3rem; + padding: 0 1rem; + transition: text-shadow .4s; + text-align: center; + font-weight: bolder; +} + +.desc { + font-size: .8rem; + line-height: 1.1rem; + opacity: .8; + margin-bottom: 0.2rem; + padding: 0 1rem; + transition: text-shadow .4s; + text-align: center; +} + +.zoom { + width: 70px; + height: 70px; + border-radius: 50%; + border: 2px solid #fff; + margin: 1rem 0 1rem 1rem; + box-shadow: 3px 2px 5px rgb(0 0 0 / 8%); + transition: all .4s; +} + +.companyUsage { + width: 100%; +} + +.title { + font-size: large; + font-weight: bolder; + text-align: center; +} diff --git a/home/src/pages/index.js b/home/src/pages/index.js index 3f1cfce..300da0c 100644 --- a/home/src/pages/index.js +++ b/home/src/pages/index.js @@ -15,6 +15,7 @@ import cdnTransfer from '../CdnTransfer' import styles from './styles.module.css' import { features, SetupExample, SurenessIntegration, friendLinks, mediaPartners } from '../constants' +import Sponsor from "./components/Sponsor"; function Home() { const context = useDocusaurusContext() @@ -66,6 +67,9 @@ function Home() {
+
+ +
{features && features.length > 0 && (
{features.map((props, idx) => ( diff --git a/home/static/img/icons/eoapi_logo.jpg b/home/static/img/icons/eoapi_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75231f0e954aaa2492717769141b44acf0a0b296 GIT binary patch literal 45414 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 literal 0 HcmV?d00001 diff --git a/home/static/img/icons/postcat_logo.svg b/home/static/img/icons/postcat_logo.svg new file mode 100644 index 0000000..ba33c16 --- /dev/null +++ b/home/static/img/icons/postcat_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file -- GitLab