mirror of
				https://github.com/owncast/owncast.git
				synced 2025-10-31 18:18:06 +08:00 
			
		
		
		
	 cb387d88be
			
		
	
	cb387d88be
	
	
	
		
			
			* First pass at configuring localization * Add CI job for translations * Update CI job * Update default value * Update parser config * Update defaults again * try to fix the multiple parsing of a file * Update crowdlin config * Update configs * New Crowdin translations by GitHub Action (#3448) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Point to updated translated files * Tooltip i18n * Run translation job when web components are updated * Commit updated translations * Translations update (#3453) * Update source file strings.json Updated translations * New translations strings.json (French) Updated translations * New translations strings.json (Spanish) Updated translations * New translations strings.json (German) Updated translations * New translations strings.json (English, United States) Updated translations * Commit updated translations * New Crowdin translations by GitHub Action (#3452) Co-authored-by: Owncast <owncast@owncast.online> * chore(deps): update to next config to address build errors * New Crowdin translations by GitHub Action (#3455) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Translations update (#3456) * New translations strings.json (Arabic) Updated translations * New translations strings.json (German) Updated translations * New translations strings.json (Greek) Updated translations * New translations strings.json (Irish) Updated translations * New translations strings.json (Italian) Updated translations * New translations strings.json (Japanese) Updated translations * New translations strings.json (Korean) Updated translations * New translations strings.json (Dutch) Updated translations * New translations strings.json (Norwegian) Updated translations * New translations strings.json (Punjabi) Updated translations * New translations strings.json (Russian) Updated translations * New translations strings.json (Swedish) Updated translations * New translations strings.json (Chinese Traditional) Updated translations * New translations strings.json (Vietnamese) Updated translations * New translations strings.json (Bengali) Updated translations * New translations strings.json (Thai) Updated translations * New translations strings.json (Croatian) Updated translations * New translations strings.json (Hindi) Updated translations * New translations strings.json (Malay) Updated translations * New Crowdin translations by GitHub Action (#3457) * New translations strings.json (Arabic) Updated translations * New translations strings.json (German) Updated translations * New translations strings.json (Greek) Updated translations * New translations strings.json (Irish) Updated translations * New translations strings.json (Italian) Updated translations * New translations strings.json (Japanese) Updated translations * New translations strings.json (Korean) Updated translations * New translations strings.json (Dutch) Updated translations * New translations strings.json (Norwegian) Updated translations * New translations strings.json (Punjabi) Updated translations * New translations strings.json (Russian) Updated translations * New translations strings.json (Swedish) Updated translations * New translations strings.json (Chinese Traditional) Updated translations * New translations strings.json (Vietnamese) Updated translations * New translations strings.json (Bengali) Updated translations * New translations strings.json (Thai) Updated translations * New translations strings.json (Croatian) Updated translations * New translations strings.json (Hindi) Updated translations * New translations strings.json (Malay) Updated translations * New Crowdin translations by GitHub Action --------- Co-authored-by: Gabe Kangas <gabek@real-ity.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Commit updated API documentation * Update translations job * New Crowdin translations by GitHub Action (#3698) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Update Crowdin configuration file * Translations update (#3700) * New translations strings.json (French) Updated translations * New translations strings.json (Italian) Updated translations * Translations update (#3699) * New translations strings.json (French) Updated translations * New translations strings.json (Spanish) Updated translations * New translations strings.json (Italian) Updated translations * New translations strings.json (Japanese) Updated translations * New translations strings.json (Polish) Updated translations * New translations strings.json (Russian) Updated translations * New translations strings.json (Portuguese, Brazilian) Updated translations * Commit updated API documentation --------- Co-authored-by: Owncast <owncast@owncast.online> * New Crowdin translations by GitHub Action (#3701) * New translations strings.json (French) Updated translations * New translations strings.json (Spanish) Updated translations * New translations strings.json (Italian) Updated translations * New translations strings.json (Japanese) Updated translations * New translations strings.json (Polish) Updated translations * New translations strings.json (Russian) Updated translations * New translations strings.json (Portuguese, Brazilian) Updated translations * New Crowdin translations by GitHub Action --------- Co-authored-by: Gabe Kangas <gabek@real-ity.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Draft: Mark strings for translation. (#3458) * Mark strings for translation. * Mark up strings for translation * fix(web): fix linter warnings --------- Co-authored-by: Le fractal <17422-fractal@users.noreply.framagit.org> Co-authored-by: Gabe Kangas <gabek@real-ity.com> * do not pull from cowdin via workflow * Commit updated translations * feat: add translations support to admin pages and components (#3977) * feat: add translations support to admin pages and components Added translations support admin main page and its components, help page, handware-info page. Added translations support for LogTable, NewsFeed and StreamHealthOverview components. * update package.json * fix rendering issue * Commit updated API documentation --------- Co-authored-by: Owncast <owncast@owncast.online> Co-authored-by: Gabe Kangas <gabek@real-ity.com> * Offline banner i18n formatting (#3997) * Fix "Last live ago" string formatting with i18n interpolation * Change some base translation jsons to use i18n interpolation * Linting fix * chore(js): ignore i18n pkgs in knip * fix(test): fix browser ui test * fix(js): remove unused var --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Owncast <owncast@owncast.online> Co-authored-by: taintedcypher <119351153+taintedcypher@users.noreply.github.com> Co-authored-by: Le fractal <17422-fractal@users.noreply.framagit.org> Co-authored-by: Sufyaan Khateeb <81009832+SufyaanKhateeb@users.noreply.github.com> Co-authored-by: mahmed2000 <mahmad2000@protonmail.com>
		
			
				
	
	
		
			181 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { useTranslation } from 'next-export-i18n';
 | |
| import { Card, Col, Row, Typography } from 'antd';
 | |
| import Link from 'next/link';
 | |
| import { FC, useContext } from 'react';
 | |
| import dynamic from 'next/dynamic';
 | |
| import { LogTable } from './LogTable';
 | |
| import { OwncastLogo } from '../common/OwncastLogo/OwncastLogo';
 | |
| import { NewsFeed } from './NewsFeed';
 | |
| import { ConfigDetails } from '../../types/config-section';
 | |
| import { ServerStatusContext } from '../../utils/server-status-context';
 | |
| 
 | |
| const { Paragraph, Text } = Typography;
 | |
| 
 | |
| const { Title } = Typography;
 | |
| const { Meta } = Card;
 | |
| 
 | |
| // Lazy loaded components
 | |
| 
 | |
| const BookTwoTone = dynamic(() => import('@ant-design/icons/BookTwoTone'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| const MessageTwoTone = dynamic(() => import('@ant-design/icons/MessageTwoTone'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| const PlaySquareTwoTone = dynamic(() => import('@ant-design/icons/PlaySquareTwoTone'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| const ProfileTwoTone = dynamic(() => import('@ant-design/icons/ProfileTwoTone'), {
 | |
|   ssr: false,
 | |
| });
 | |
| 
 | |
| function generateStreamURL(serverURL, rtmpServerPort) {
 | |
|   return `rtmp://${serverURL.replace(/(^\w+:|^)\/\//, '')}:${rtmpServerPort}/live`;
 | |
| }
 | |
| 
 | |
| export type OfflineProps = {
 | |
|   logs: any[];
 | |
|   config: ConfigDetails;
 | |
| };
 | |
| 
 | |
| export const Offline: FC<OfflineProps> = ({ logs = [], config }) => {
 | |
|   const serverStatusData = useContext(ServerStatusContext);
 | |
| 
 | |
|   const { t } = useTranslation();
 | |
|   const { serverConfig } = serverStatusData || {};
 | |
|   const { rtmpServerPort, streamKeyOverridden } = serverConfig;
 | |
|   const instanceUrl = global.window?.location.hostname || '';
 | |
| 
 | |
|   let rtmpURL;
 | |
|   if (instanceUrl && rtmpServerPort) {
 | |
|     rtmpURL = generateStreamURL(instanceUrl, rtmpServerPort);
 | |
|   }
 | |
| 
 | |
|   const data = [
 | |
|     {
 | |
|       icon: <BookTwoTone twoToneColor="#6f42c1" />,
 | |
|       title: t('Use your broadcasting software'),
 | |
|       content: (
 | |
|         <div>
 | |
|           <a
 | |
|             href="https://owncast.online/docs/broadcasting/?source=admin"
 | |
|             target="_blank"
 | |
|             rel="noopener noreferrer"
 | |
|           >
 | |
|             {t(
 | |
|               'Learn how to point your existing software to your new server and start streaming your content.',
 | |
|             )}
 | |
|           </a>
 | |
|           <div className="stream-info-container">
 | |
|             <Text strong className="stream-info-label">
 | |
|               {t('Streaming URL:')}
 | |
|             </Text>
 | |
|             {rtmpURL && (
 | |
|               <Paragraph className="stream-info-box" copyable>
 | |
|                 {rtmpURL}
 | |
|               </Paragraph>
 | |
|             )}
 | |
|             <Text strong className="stream-info-label">
 | |
|               {t('Streaming Keys:')}
 | |
|             </Text>
 | |
|             <Text strong className="stream-info-box">
 | |
|               {!streamKeyOverridden ? (
 | |
|                 <Link href="/admin/config/server"> {t('View')} </Link>
 | |
|               ) : (
 | |
|                 <span style={{ paddingLeft: '10px', fontWeight: 'normal' }}>
 | |
|                   {t('Overridden via command line.')}
 | |
|                 </span>
 | |
|               )}
 | |
|             </Text>
 | |
|           </div>
 | |
|         </div>
 | |
|       ),
 | |
|     },
 | |
|     {
 | |
|       icon: <PlaySquareTwoTone twoToneColor="#f9826c" />,
 | |
|       title: t('Embed your video onto other sites'),
 | |
|       content: (
 | |
|         <div>
 | |
|           <a
 | |
|             href="https://owncast.online/docs/embed?source=admin"
 | |
|             target="_blank"
 | |
|             rel="noopener noreferrer"
 | |
|           >
 | |
|             {t('Learn how you can add your Owncast stream to other sites you control.')}
 | |
|           </a>
 | |
|         </div>
 | |
|       ),
 | |
|     },
 | |
|   ];
 | |
| 
 | |
|   if (!config?.chatDisabled) {
 | |
|     data.push({
 | |
|       icon: <MessageTwoTone twoToneColor="#0366d6" />,
 | |
|       title: t('Chat is disabled'),
 | |
|       content: <span>{t('Chat will continue to be disabled until you begin a live stream.')}</span>,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   if (!config?.yp?.enabled) {
 | |
|     data.push({
 | |
|       icon: <ProfileTwoTone twoToneColor="#D18BFE" />,
 | |
|       title: t('Find an audience on the Owncast Directory'),
 | |
|       content: (
 | |
|         <div>
 | |
|           {t('List yourself in the Owncast Directory and show off your stream. Enable it in')}{' '}
 | |
|           <Link href="/admin/config/general/">{t('settings.')}</Link>
 | |
|         </div>
 | |
|       ),
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   if (!config?.federation?.enabled) {
 | |
|     data.push({
 | |
|       icon: <img alt="fediverse" width="20px" src="/img/fediverse-color.png" />,
 | |
|       title: t('Add your Owncast instance to the Fediverse'),
 | |
|       content: (
 | |
|         <div>
 | |
|           <Link href="/admin/config-federation/">{t('Enable Owncast social features')}</Link>{' '}
 | |
|           {t(
 | |
|             'to have your instance join the Fediverse, allowing people to follow, share and engage with your live stream.',
 | |
|           )}
 | |
|         </div>
 | |
|       ),
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <Row>
 | |
|         <Col span={12} offset={6}>
 | |
|           <div className="offline-intro">
 | |
|             <span className="logo">
 | |
|               <OwncastLogo variant="simple" />
 | |
|             </span>
 | |
|             <div>
 | |
|               <Title level={2}>{t('No stream is active')}</Title>
 | |
|               <p>{t('You should start one.')}</p>
 | |
|             </div>
 | |
|           </div>
 | |
|         </Col>
 | |
|       </Row>
 | |
|       <Row gutter={[16, 16]} className="offline-content">
 | |
|         <Col span={12} xs={24} sm={24} md={24} lg={12} className="list-section">
 | |
|           {data.map(item => (
 | |
|             <Card key={item.title} size="small" bordered={false}>
 | |
|               <Meta avatar={item.icon} title={item.title} description={item.content} />
 | |
|             </Card>
 | |
|           ))}
 | |
|         </Col>
 | |
|         <Col span={12} xs={24} sm={24} md={24} lg={12}>
 | |
|           <NewsFeed />
 | |
|         </Col>
 | |
|       </Row>
 | |
|       <LogTable logs={logs} initialPageSize={5} />
 | |
|     </>
 | |
|   );
 | |
| };
 |