diff --git a/site/blog/authors.yml b/site/blog/authors.yml
new file mode 100644
index 00000000..e897630b
--- /dev/null
+++ b/site/blog/authors.yml
@@ -0,0 +1,6 @@
+vitonsky:
+ name: Robert Vitonsky
+ title: Founder of Linguist Translate
+ url: https://vitonsky.net
+ image_url: https://github.com/vitonsky.png
+ email: rob@vitonsky.net
diff --git a/site/blog/release/6.0.0.md b/site/blog/release/6.0.0.md
new file mode 100644
index 00000000..266620f2
--- /dev/null
+++ b/site/blog/release/6.0.0.md
@@ -0,0 +1,28 @@
+---
+title: Release 6.0.0
+description: Manifest V3 and sandboxed translators
+authors: [vitonsky]
+tags: [release]
+date: 2024-06-25T16:00
+---
+
+Key changes in [new release](https://github.com/translate-tools/linguist/releases/tag/v6.0.0).
+
+- Chrome extension moved to a Manifest v3
+- Custom translators code now run in sandboxed iframe with no access to addon API
+- New option to disable translation history recording https://github.com/translate-tools/linguist/issues/151
+- Minor bug fixes and improvements, see [milestone](https://github.com/translate-tools/linguist/milestone/7?closed=1)
+
+**Full Changelog**: https://github.com/translate-tools/linguist/compare/v5.0.17...6.0.0
+
+## Improved security
+
+Now custom translators executes in sandboxed context, so they no have access to addon API.
+
+Users now may use custom translators with lower trust level. Custom translator still may sent requests to any domains from your browser, and still may mine on your hardware as any other software, but custom translator can't inspect content on pages and do other things that browser extensions do.
+
+## Manifest V3
+
+A chrome [announced](https://developer.chrome.com/blog/resuming-the-transition-to-mv3/#the_phase-out_timeline) they will deprecate and disable extensions with manifest v2 soon. So Linguist migrate to manifest v3 on Chrome and stay on manifest v2 on Firefox.
+
+Due to some limitations of Manifest V3, Linguist may not work on too old browsers like Chrome 109 and older.
\ No newline at end of file
diff --git a/site/docusaurus.config.ts b/site/docusaurus.config.ts
index b1078452..ea76ae61 100644
--- a/site/docusaurus.config.ts
+++ b/site/docusaurus.config.ts
@@ -3,7 +3,7 @@ import type { Config } from '@docusaurus/types';
const config: Config = {
title: 'Linguist Translate',
tagline: 'Privacy focused translation',
- favicon: 'favicon.svg',
+ favicon: 'favicon.ico',
// Set the production url of your site here
url: 'https://linguister.io',
@@ -20,10 +20,46 @@ const config: Config = {
// path: '../docs',
// include: ['*.md', '*.mdx'],
// },
- blog: false,
+ blog: {
+ blogTitle: 'Linguist Translate blog',
+ blogDescription:
+ 'A blog of Linguist Translate, the privacy focused translation in your browser',
+ postsPerPage: 'ALL',
+ blogSidebarCount: 0,
+ },
},
],
],
+
+ themeConfig: {
+ image: '/screenshots/page-translation.png',
+ colorMode: {
+ defaultMode: 'light',
+ disableSwitch: true,
+ respectPrefersColorScheme: true,
+ },
+ navbar: {
+ logo: {
+ alt: 'Linguist Translate',
+ src: '/logo.svg',
+ srcDark: 'img/logo_dark.svg',
+ href: '/',
+ target: '_self',
+ width: 100,
+ },
+ items: [
+ {
+ href: 'https://github.com/translate-tools/linguist',
+ label: 'GitHub',
+ position: 'right',
+ target: '_blank',
+ },
+ ],
+ },
+ footer: {
+ copyright: `Copyright © ${new Date().getFullYear()} FluidMinds team. Built with Docusaurus.`,
+ },
+ },
} satisfies Config;
export default config;
diff --git a/site/src/components/Analytics/AnalyticsProvider.tsx b/site/src/components/Analytics/AnalyticsProvider.tsx
index c31fcec6..c596459a 100644
--- a/site/src/components/Analytics/AnalyticsProvider.tsx
+++ b/site/src/components/Analytics/AnalyticsProvider.tsx
@@ -1,14 +1,23 @@
import React, { PropsWithChildren, useCallback, useEffect, useState } from 'react';
import Plausible from 'plausible-tracker';
import { PlausibleInitOptions } from 'plausible-tracker/build/main/lib/tracker';
+import Head from '@docusaurus/Head';
import { analyticsContext, IAnalyticsContext } from './useAnalyticsContext';
+export type AnalyticsProviderProps = PropsWithChildren<{
+ plausible: PlausibleInitOptions;
+ googleAnalytics: {
+ tagId: string;
+ };
+}>;
+
export const AnalyticsProvider = ({
- options,
+ plausible: plausibleOptions,
+ googleAnalytics,
children,
-}: PropsWithChildren<{ options: PlausibleInitOptions }>) => {
- const [plausible] = useState(() => Plausible(options));
+}: AnalyticsProviderProps) => {
+ const [plausible] = useState(() => Plausible(plausibleOptions));
const trackEvent: IAnalyticsContext['trackEvent'] = useCallback(
(eventName, props) => {
@@ -51,6 +60,25 @@ export const AnalyticsProvider = ({
return (
+
+
+
+
{children}
);
diff --git a/site/src/components/Landing/Landing.tsx b/site/src/components/Landing/Landing.tsx
index c7ab0dd9..22b42685 100644
--- a/site/src/components/Landing/Landing.tsx
+++ b/site/src/components/Landing/Landing.tsx
@@ -75,6 +75,9 @@ export const Landing = ({ baseUrl }: { baseUrl: string }) => {
{t('navigation.features.content')}
+
+ {t('navigation.blog.content')}
+
= ({ children }) => {
@@ -12,32 +11,9 @@ export const PageLayout: FC = ({ children }) => {
-
-
-
- {children}
-
+
+ {children}
);
};
diff --git a/site/src/theme/Root.tsx b/site/src/theme/Root.tsx
new file mode 100644
index 00000000..ddde2bba
--- /dev/null
+++ b/site/src/theme/Root.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+
+import { AnalyticsProvider } from '../components/Analytics/AnalyticsProvider';
+
+export default function Root({ children }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/site/static/favicon.ico b/site/static/favicon.ico
new file mode 100644
index 00000000..1b3eea6d
Binary files /dev/null and b/site/static/favicon.ico differ
diff --git a/site/static/logo.svg b/site/static/logo.svg
new file mode 100644
index 00000000..0adb2b22
--- /dev/null
+++ b/site/static/logo.svg
@@ -0,0 +1,19 @@
+
+