Compare commits

..

58 Commits

Author SHA1 Message Date
Dan Brown
c4d2f741ab
Merge fd71c57aab into e65655594f 2024-09-30 19:20:12 +00:00
Dan Brown
fd71c57aab New translations common.php (Spanish) 2024-09-30 20:20:09 +01:00
Dan Brown
0be82b4f96 New translations common.php (German Informal) 2024-09-30 18:12:19 +01:00
Dan Brown
f83ec3a8b4 New translations common.php (Norwegian Bokmal) 2024-09-30 18:12:18 +01:00
Dan Brown
d00e2ed37c New translations common.php (Uzbek) 2024-09-30 18:12:17 +01:00
Dan Brown
1a963974d8 New translations common.php (Bosnian) 2024-09-30 18:12:16 +01:00
Dan Brown
7b9c67edc4 New translations common.php (Latvian) 2024-09-30 18:12:15 +01:00
Dan Brown
5655c93ea1 New translations common.php (Estonian) 2024-09-30 18:12:14 +01:00
Dan Brown
1db399d12d New translations common.php (Norwegian Nynorsk) 2024-09-30 18:12:13 +01:00
Dan Brown
29862b5323 New translations common.php (Croatian) 2024-09-30 18:12:12 +01:00
Dan Brown
409aa2541d New translations common.php (Spanish, Argentina) 2024-09-30 18:12:11 +01:00
Dan Brown
1a94e6033f New translations common.php (Persian) 2024-09-30 18:12:10 +01:00
Dan Brown
9162b1af83 New translations common.php (Indonesian) 2024-09-30 18:12:08 +01:00
Dan Brown
8ec45611e7 New translations common.php (Portuguese, Brazilian) 2024-09-30 18:12:07 +01:00
Dan Brown
ce03fbcb62 New translations common.php (Vietnamese) 2024-09-30 18:12:06 +01:00
Dan Brown
4a22febc70 New translations common.php (Chinese Traditional) 2024-09-30 18:12:05 +01:00
Dan Brown
b720b424da New translations common.php (Chinese Simplified) 2024-09-30 18:12:04 +01:00
Dan Brown
2a2e472dc4 New translations common.php (Ukrainian) 2024-09-30 18:12:04 +01:00
Dan Brown
c576aa3369 New translations common.php (Turkish) 2024-09-30 18:12:02 +01:00
Dan Brown
7affeea418 New translations common.php (Swedish) 2024-09-30 18:12:01 +01:00
Dan Brown
53f24492c8 New translations common.php (Serbian (Cyrillic)) 2024-09-30 18:12:00 +01:00
Dan Brown
4fade907f3 New translations common.php (Albanian) 2024-09-30 18:11:59 +01:00
Dan Brown
3af17dff7b New translations common.php (Slovenian) 2024-09-30 18:11:59 +01:00
Dan Brown
5aeee6f802 New translations common.php (Slovak) 2024-09-30 18:11:58 +01:00
Dan Brown
2632023981 New translations common.php (Russian) 2024-09-30 18:11:56 +01:00
Dan Brown
42e1f1a308 New translations common.php (Portuguese) 2024-09-30 18:11:56 +01:00
Dan Brown
6d875b7bb2 New translations common.php (Polish) 2024-09-30 18:11:54 +01:00
Dan Brown
1ef8faecac New translations common.php (Dutch) 2024-09-30 18:11:53 +01:00
Dan Brown
0ec731507e New translations common.php (Lithuanian) 2024-09-30 18:11:52 +01:00
Dan Brown
1e74f6f57d New translations common.php (Korean) 2024-09-30 18:11:51 +01:00
Dan Brown
68738e69a6 New translations common.php (Georgian) 2024-09-30 18:11:50 +01:00
Dan Brown
de53bbc13e New translations common.php (Japanese) 2024-09-30 18:11:49 +01:00
Dan Brown
b9352ef921 New translations common.php (Italian) 2024-09-30 18:11:48 +01:00
Dan Brown
9c10fdd431 New translations common.php (Hungarian) 2024-09-30 18:11:47 +01:00
Dan Brown
12bee9ca43 New translations common.php (Hebrew) 2024-09-30 18:11:46 +01:00
Dan Brown
f3e998389a New translations common.php (Finnish) 2024-09-30 18:11:45 +01:00
Dan Brown
972c44894a New translations common.php (Basque) 2024-09-30 18:11:44 +01:00
Dan Brown
8007008a78 New translations common.php (Greek) 2024-09-30 18:11:43 +01:00
Dan Brown
6e20d52c09 New translations common.php (German) 2024-09-30 18:11:42 +01:00
Dan Brown
ab84536c76 New translations common.php (Danish) 2024-09-30 18:11:41 +01:00
Dan Brown
5764425a89 New translations common.php (Czech) 2024-09-30 18:11:40 +01:00
Dan Brown
8d86682616 New translations common.php (Catalan) 2024-09-30 18:11:39 +01:00
Dan Brown
bb913d5809 New translations common.php (Bulgarian) 2024-09-30 18:11:38 +01:00
Dan Brown
55b963735a New translations common.php (Arabic) 2024-09-30 18:11:37 +01:00
Dan Brown
8c41fc086b New translations common.php (Spanish) 2024-09-30 18:11:36 +01:00
Dan Brown
df03d96800 New translations common.php (French) 2024-09-30 18:11:35 +01:00
Dan Brown
9ffd4fdac8 New translations common.php (Romanian) 2024-09-30 18:11:34 +01:00
Dan Brown
0b4488b62f New translations common.php (Welsh) 2024-09-30 18:11:33 +01:00
Dan Brown
e65655594f
Merge branch 'feature/opensearch' into development 2024-09-30 17:21:51 +01:00
Dan Brown
514db60617
Tests: Categorised up meta tests
Extracted robots.txt tests into its own file to fit into new folder.
Also tweaked open search tests a tad to specifically check long app
names.
2024-09-30 17:07:53 +01:00
Dan Brown
8bc6e75319
Code Blocks: Added SAS and R language options
For #5206
2024-09-30 16:47:55 +01:00
Maximilian Walter
2f74cfb42c
Add test for OpenSearch endpoint 2024-09-30 17:45:20 +02:00
Maximilian Walter
1302e3c959
Add missing XML declaration to OpenSearch endpoint 2024-09-30 17:45:20 +02:00
Maximilian Walter
a5b031f906
Translatable description for OpenSearch XML 2024-09-30 17:45:20 +02:00
Dan Brown
71e46c8c8e New translations activities.php (Danish) 2024-09-30 16:17:10 +01:00
Maximilian Walter
4f890c431c
Limit short-name for OpenSearch XML to 16 characters
The specification does not allow more than 16 characters.
2024-09-14 15:31:56 +02:00
Maximilian Walter
c110a97d8a
Remove unofficial method-attribute from OpenSearch-XML 2024-09-14 15:24:42 +02:00
Maximilian Walter
476c2be5a6
Add XML for OpenSearch 2024-09-09 22:54:33 +02:00
62 changed files with 263 additions and 35 deletions

View File

@ -64,4 +64,14 @@ class MetaController extends Controller
'jsLibData' => file_get_contents(base_path('dev/licensing/js-library-licenses.txt')), 'jsLibData' => file_get_contents(base_path('dev/licensing/js-library-licenses.txt')),
]); ]);
} }
/**
* Show the view for /opensearch.xml.
*/
public function opensearch()
{
return response()
->view('misc.opensearch')
->header('Content-Type', 'application/opensearchdescription+xml');
}
} }

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'سياسة الخصوصية', 'privacy_policy' => 'سياسة الخصوصية',
'terms_of_service' => 'اتفاقية شروط الخدمة', 'terms_of_service' => 'اتفاقية شروط الخدمة',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Политика за поверителност', 'privacy_policy' => 'Политика за поверителност',
'terms_of_service' => 'Условия на услугата', 'terms_of_service' => 'Условия на услугата',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Pravila o privatnosti', 'privacy_policy' => 'Pravila o privatnosti',
'terms_of_service' => 'Uslovi korištenja', 'terms_of_service' => 'Uslovi korištenja',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Política de privadesa', 'privacy_policy' => 'Política de privadesa',
'terms_of_service' => 'Condicions del servei', 'terms_of_service' => 'Condicions del servei',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Zásady ochrany osobních údajů', 'privacy_policy' => 'Zásady ochrany osobních údajů',
'terms_of_service' => 'Podmínky služby', 'terms_of_service' => 'Podmínky služby',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Polisi Preifatrwydd', 'privacy_policy' => 'Polisi Preifatrwydd',
'terms_of_service' => 'Telerau Gwasanaeth', 'terms_of_service' => 'Telerau Gwasanaeth',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -65,7 +65,7 @@ return [
'auth_login' => 'loggede ind', 'auth_login' => 'loggede ind',
'auth_register' => 'registered as new user', 'auth_register' => 'registered as new user',
'auth_password_reset_request' => 'requested user password reset', 'auth_password_reset_request' => 'requested user password reset',
'auth_password_reset_update' => 'reset user password', 'auth_password_reset_update' => 'nulstil adgangskode',
'mfa_setup_method' => 'configured MFA method', 'mfa_setup_method' => 'configured MFA method',
'mfa_setup_method_notification' => 'Multi-faktor metode konfigureret', 'mfa_setup_method_notification' => 'Multi-faktor metode konfigureret',
'mfa_remove_method' => 'removed MFA method', 'mfa_remove_method' => 'removed MFA method',
@ -85,8 +85,8 @@ return [
'webhook_delete_notification' => 'Webhooken blev slettet', 'webhook_delete_notification' => 'Webhooken blev slettet',
// Users // Users
'user_create' => 'created user', 'user_create' => 'opret bruger',
'user_create_notification' => 'User successfully created', 'user_create_notification' => 'Bruger oprettet korrekt',
'user_update' => 'updated user', 'user_update' => 'updated user',
'user_update_notification' => 'Brugeren blev opdateret', 'user_update_notification' => 'Brugeren blev opdateret',
'user_delete' => 'deleted user', 'user_delete' => 'deleted user',

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privatlivspolitik', 'privacy_policy' => 'Privatlivspolitik',
'terms_of_service' => 'Tjenestevilkår', 'terms_of_service' => 'Tjenestevilkår',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Datenschutzbestimmungen', 'privacy_policy' => 'Datenschutzbestimmungen',
'terms_of_service' => 'Allgemeine Geschäftsbedingungen', 'terms_of_service' => 'Allgemeine Geschäftsbedingungen',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Datenschutzerklärung', 'privacy_policy' => 'Datenschutzerklärung',
'terms_of_service' => 'Allgemeine Geschäftsbedingungen', 'terms_of_service' => 'Allgemeine Geschäftsbedingungen',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Πολιτική Απορρήτου', 'privacy_policy' => 'Πολιτική Απορρήτου',
'terms_of_service' => 'Όροι χρήσης', 'terms_of_service' => 'Όροι χρήσης',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privacy Policy', 'privacy_policy' => 'Privacy Policy',
'terms_of_service' => 'Terms of Service', 'terms_of_service' => 'Terms of Service',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Política de privacidad', 'privacy_policy' => 'Política de privacidad',
'terms_of_service' => 'Términos de Servicio', 'terms_of_service' => 'Términos de Servicio',
// OpenSearch
'opensearch_description' => 'Buscar :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Política de privacidad', 'privacy_policy' => 'Política de privacidad',
'terms_of_service' => 'Términos de Servicio', 'terms_of_service' => 'Términos de Servicio',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privaatsus', 'privacy_policy' => 'Privaatsus',
'terms_of_service' => 'Kasutustingimused', 'terms_of_service' => 'Kasutustingimused',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Pribatutasun politika', 'privacy_policy' => 'Pribatutasun politika',
'terms_of_service' => 'Zerbitzu-baldintzak', 'terms_of_service' => 'Zerbitzu-baldintzak',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'سیاست حفظ حریم خصوصی', 'privacy_policy' => 'سیاست حفظ حریم خصوصی',
'terms_of_service' => 'شرایط خدمات', 'terms_of_service' => 'شرایط خدمات',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Tietosuojaseloste', 'privacy_policy' => 'Tietosuojaseloste',
'terms_of_service' => 'Palvelun käyttöehdot', 'terms_of_service' => 'Palvelun käyttöehdot',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Politique de confidentialité', 'privacy_policy' => 'Politique de confidentialité',
'terms_of_service' => 'Conditions d\'utilisation', 'terms_of_service' => 'Conditions d\'utilisation',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'מדיניות הפרטיות', 'privacy_policy' => 'מדיניות הפרטיות',
'terms_of_service' => 'תנאי שימוש', 'terms_of_service' => 'תנאי שימוש',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Politika privatnosti', 'privacy_policy' => 'Politika privatnosti',
'terms_of_service' => 'Uvjeti korištenja', 'terms_of_service' => 'Uvjeti korištenja',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Adatvédelmi irányelvek', 'privacy_policy' => 'Adatvédelmi irányelvek',
'terms_of_service' => 'Felhasználási feltételek', 'terms_of_service' => 'Felhasználási feltételek',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Kebijakan Privasi', 'privacy_policy' => 'Kebijakan Privasi',
'terms_of_service' => 'Ketentuan Layanan', 'terms_of_service' => 'Ketentuan Layanan',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Norme sulla privacy', 'privacy_policy' => 'Norme sulla privacy',
'terms_of_service' => 'Condizioni del Servizio', 'terms_of_service' => 'Condizioni del Servizio',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'プライバシーポリシー', 'privacy_policy' => 'プライバシーポリシー',
'terms_of_service' => '利用規約', 'terms_of_service' => '利用規約',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privacy Policy', 'privacy_policy' => 'Privacy Policy',
'terms_of_service' => 'Terms of Service', 'terms_of_service' => 'Terms of Service',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => '개인 정보 처리 방침', 'privacy_policy' => '개인 정보 처리 방침',
'terms_of_service' => '서비스 이용 약관', 'terms_of_service' => '서비스 이용 약관',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privatumo politika', 'privacy_policy' => 'Privatumo politika',
'terms_of_service' => 'Paslaugų teikimo paslaugos', 'terms_of_service' => 'Paslaugų teikimo paslaugos',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privātuma politika', 'privacy_policy' => 'Privātuma politika',
'terms_of_service' => 'Pakalpojuma noteikumi', 'terms_of_service' => 'Pakalpojuma noteikumi',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Personvernregler', 'privacy_policy' => 'Personvernregler',
'terms_of_service' => 'Bruksvilkår', 'terms_of_service' => 'Bruksvilkår',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privacybeleid', 'privacy_policy' => 'Privacybeleid',
'terms_of_service' => 'Algemene voorwaarden', 'terms_of_service' => 'Algemene voorwaarden',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Personvernreglar', 'privacy_policy' => 'Personvernreglar',
'terms_of_service' => 'Bruksvilkår', 'terms_of_service' => 'Bruksvilkår',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Polityka prywatności', 'privacy_policy' => 'Polityka prywatności',
'terms_of_service' => 'Warunki usługi', 'terms_of_service' => 'Warunki usługi',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Política de Privacidade', 'privacy_policy' => 'Política de Privacidade',
'terms_of_service' => 'Termos de Utilização', 'terms_of_service' => 'Termos de Utilização',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Políticas de Privacidade', 'privacy_policy' => 'Políticas de Privacidade',
'terms_of_service' => 'Termos de Serviço', 'terms_of_service' => 'Termos de Serviço',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Politică de confidențialitate', 'privacy_policy' => 'Politică de confidențialitate',
'terms_of_service' => 'Termeni și condiții', 'terms_of_service' => 'Termeni și condiții',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Политика конфиденциальности', 'privacy_policy' => 'Политика конфиденциальности',
'terms_of_service' => 'Условия использования', 'terms_of_service' => 'Условия использования',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Zásady ochrany osobných údajov', 'privacy_policy' => 'Zásady ochrany osobných údajov',
'terms_of_service' => 'Podmienky používania', 'terms_of_service' => 'Podmienky používania',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Pravilnik o zasebnosti', 'privacy_policy' => 'Pravilnik o zasebnosti',
'terms_of_service' => 'Pogoji uporabe', 'terms_of_service' => 'Pogoji uporabe',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Privacy Policy', 'privacy_policy' => 'Privacy Policy',
'terms_of_service' => 'Terms of Service', 'terms_of_service' => 'Terms of Service',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Правила о приватности', 'privacy_policy' => 'Правила о приватности',
'terms_of_service' => 'Услови коришћења', 'terms_of_service' => 'Услови коришћења',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Integritetspolicy', 'privacy_policy' => 'Integritetspolicy',
'terms_of_service' => 'Användarvillkor', 'terms_of_service' => 'Användarvillkor',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Gizlilik Politikası', 'privacy_policy' => 'Gizlilik Politikası',
'terms_of_service' => 'Hizmet Şartları', 'terms_of_service' => 'Hizmet Şartları',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Політика приватності', 'privacy_policy' => 'Політика приватності',
'terms_of_service' => 'Умови використання', 'terms_of_service' => 'Умови використання',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Maxfiylik siyosati', 'privacy_policy' => 'Maxfiylik siyosati',
'terms_of_service' => 'Xizmat korsatish shartlari', 'terms_of_service' => 'Xizmat korsatish shartlari',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => 'Chính Sách Quyền Riêng Tư', 'privacy_policy' => 'Chính Sách Quyền Riêng Tư',
'terms_of_service' => 'Điều khoản Dịch vụ', 'terms_of_service' => 'Điều khoản Dịch vụ',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => '隐私政策', 'privacy_policy' => '隐私政策',
'terms_of_service' => '服务条款', 'terms_of_service' => '服务条款',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -107,4 +107,7 @@ return [
// Not directly used but available for convenience to users. // Not directly used but available for convenience to users.
'privacy_policy' => '隱私權政策', 'privacy_policy' => '隱私權政策',
'terms_of_service' => '服務條款', 'terms_of_service' => '服務條款',
// OpenSearch
'opensearch_description' => 'Search :appName',
]; ];

View File

@ -71,10 +71,12 @@ const modeMap = {
ocaml: () => legacyLoad('oCaml'), ocaml: () => legacyLoad('oCaml'),
py: () => legacyLoad('python'), py: () => legacyLoad('python'),
python: () => legacyLoad('python'), python: () => legacyLoad('python'),
r: () => legacyLoad('r'),
rb: () => legacyLoad('ruby'), rb: () => legacyLoad('ruby'),
rs: () => legacyLoad('rust'), rs: () => legacyLoad('rust'),
ruby: () => legacyLoad('ruby'), ruby: () => legacyLoad('ruby'),
rust: () => legacyLoad('rust'), rust: () => legacyLoad('rust'),
sas: () => legacyLoad('sas'),
scala: () => legacyLoad('scala'), scala: () => legacyLoad('scala'),
scheme: () => legacyLoad('scheme'), scheme: () => legacyLoad('scheme'),
shell: () => legacyLoad('shell'), shell: () => legacyLoad('shell'),

View File

@ -16,8 +16,10 @@ export {pascal} from '@codemirror/legacy-modes/mode/pascal';
export {powerShell} from '@codemirror/legacy-modes/mode/powershell'; export {powerShell} from '@codemirror/legacy-modes/mode/powershell';
export {properties} from '@codemirror/legacy-modes/mode/properties'; export {properties} from '@codemirror/legacy-modes/mode/properties';
export {python} from '@codemirror/legacy-modes/mode/python'; export {python} from '@codemirror/legacy-modes/mode/python';
export {r} from '@codemirror/legacy-modes/mode/r';
export {ruby} from '@codemirror/legacy-modes/mode/ruby'; export {ruby} from '@codemirror/legacy-modes/mode/ruby';
export {rust} from '@codemirror/legacy-modes/mode/rust'; export {rust} from '@codemirror/legacy-modes/mode/rust';
export {sas} from '@codemirror/legacy-modes/mode/sas';
export {scheme} from '@codemirror/legacy-modes/mode/scheme'; export {scheme} from '@codemirror/legacy-modes/mode/scheme';
export {shell} from '@codemirror/legacy-modes/mode/shell'; export {shell} from '@codemirror/legacy-modes/mode/shell';
export { export {

View File

@ -32,6 +32,9 @@
<link rel="manifest" href="{{ url('/manifest.json') }}"> <link rel="manifest" href="{{ url('/manifest.json') }}">
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<!-- OpenSearch -->
<link rel="search" type="application/opensearchdescription+xml" title="{{ setting('app-name') }}" href="{{ url('/opensearch.xml') }}">
@yield('head') @yield('head')
<!-- Custom Styles & Head Content --> <!-- Custom Styles & Head Content -->

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>{{ mb_strimwidth(setting('app-name'), 0, 16) }}</ShortName>
<Description>{{ trans('common.opensearch_description', ['appName' => setting('app-name')]) }}</Description>
<Image width="256" height="256" type="image/png">{{ setting('app-icon') ?: url('/icon.png') }}</Image>
<Image width="180" height="180" type="image/png">{{ setting('app-icon-180') ?: url('/icon-180.png') }}</Image>
<Image width="128" height="128" type="image/png">{{ setting('app-icon-128') ?: url('/icon-128.png') }}</Image>
<Image width="64" height="64" type="image/png">{{ setting('app-icon-64') ?: url('/icon-64.png') }}</Image>
<Image width="32" height="32" type="image/png">{{ setting('app-icon-32') ?: url('/icon-32.png') }}</Image>
<Url type="text/html" rel="results" template="{{ url('/search') }}?term={searchTerms}"/>
<Url type="application/opensearchdescription+xml" rel="self" template="{{ url('/opensearch.xml') }}"/>
</OpenSearchDescription>

View File

@ -26,7 +26,7 @@
'Bash', 'CSS', 'C', 'C++', 'C#', 'Clojure', 'Dart', 'Diff', 'Fortran', 'F#', 'Go', 'Haskell', 'HTML', 'INI', 'Bash', 'CSS', 'C', 'C++', 'C#', 'Clojure', 'Dart', 'Diff', 'Fortran', 'F#', 'Go', 'Haskell', 'HTML', 'INI',
'Java', 'JavaScript', 'JSON', 'Julia', 'Kotlin', 'LaTeX', 'Lua', 'MarkDown', 'MATLAB', 'MSSQL', 'MySQL', 'Java', 'JavaScript', 'JSON', 'Julia', 'Kotlin', 'LaTeX', 'Lua', 'MarkDown', 'MATLAB', 'MSSQL', 'MySQL',
'Nginx', 'OCaml', 'Octave', 'Pascal', 'Perl', 'PHP', 'PL/SQL', 'PostgreSQL', 'Powershell', 'Python', 'Nginx', 'OCaml', 'Octave', 'Pascal', 'Perl', 'PHP', 'PL/SQL', 'PostgreSQL', 'Powershell', 'Python',
'Ruby', 'Rust', 'Scala', 'Scheme', 'Shell', 'Smarty', 'SQL', 'SQLite', 'Swift', 'R', 'Ruby', 'Rust', 'SAS', 'Scala', 'Scheme', 'Shell', 'Smarty', 'SQL', 'SQLite', 'Swift',
'Twig', 'TypeScript', 'VBScript', 'VB.NET', 'XML', 'YAML', 'Twig', 'TypeScript', 'VBScript', 'VB.NET', 'XML', 'YAML',
]; ];
@endphp @endphp

View File

@ -23,6 +23,7 @@ Route::get('/robots.txt', [MetaController::class, 'robots']);
Route::get('/favicon.ico', [MetaController::class, 'favicon']); Route::get('/favicon.ico', [MetaController::class, 'favicon']);
Route::get('/manifest.json', [MetaController::class, 'pwaManifest']); Route::get('/manifest.json', [MetaController::class, 'pwaManifest']);
Route::get('/licenses', [MetaController::class, 'licenses']); Route::get('/licenses', [MetaController::class, 'licenses']);
Route::get('/opensearch.xml', [MetaController::class, 'opensearch']);
// Authenticated routes... // Authenticated routes...
Route::middleware('auth')->group(function () { Route::middleware('auth')->group(function () {

View File

@ -1,6 +1,8 @@
<?php <?php
namespace Tests; namespace Tests\Meta;
use Tests\TestCase;
class HelpTest extends TestCase class HelpTest extends TestCase
{ {

View File

@ -1,6 +1,8 @@
<?php <?php
namespace Tests; namespace Tests\Meta;
use Tests\TestCase;
class LicensesTest extends TestCase class LicensesTest extends TestCase
{ {

View File

@ -1,11 +1,12 @@
<?php <?php
namespace Tests; namespace Tests\Meta;
use BookStack\Entities\Repos\BaseRepo; use BookStack\Entities\Repos\BaseRepo;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Testing\TestResponse; use Illuminate\Testing\TestResponse;
use Tests\TestCase;
class OpenGraphTest extends TestCase class OpenGraphTest extends TestCase
{ {

View File

@ -0,0 +1,42 @@
<?php
namespace Tests\Meta;
use Tests\TestCase;
class OpensearchTest extends TestCase
{
public function test_opensearch_endpoint()
{
$appName = 'MyAppNameThatsReallyLongLikeThis';
setting()->put('app-name', $appName);
$resultUrl = url('/search') . '?term={searchTerms}';
$selfUrl = url('/opensearch.xml');
$resp = $this->get('/opensearch.xml');
$resp->assertOk();
$html = $this->withHtml($resp);
$html->assertElementExists('OpenSearchDescription > ShortName');
$html->assertElementContains('OpenSearchDescription > ShortName', mb_strimwidth($appName, 0, 16));
$html->assertElementNotContains('OpenSearchDescription > ShortName', $appName);
$html->assertElementExists('OpenSearchDescription > Description');
$html->assertElementContains('OpenSearchDescription > Description', "Search {$appName}");
$html->assertElementExists('OpenSearchDescription > Image');
$html->assertElementExists('OpenSearchDescription > Url[rel="results"][template="' . htmlspecialchars($resultUrl) . '"]');
$html->assertElementExists('OpenSearchDescription > Url[rel="self"][template="' . htmlspecialchars($selfUrl) . '"]');
}
public function test_opensearch_linked_to_from_home()
{
$appName = setting('app-name');
$endpointUrl = url('/opensearch.xml');
$resp = $this->asViewer()->get('/');
$html = $this->withHtml($resp);
$html->assertElementExists('head > link[rel="search"][type="application/opensearchdescription+xml"][title="' . htmlspecialchars($appName) . '"][href="' . htmlspecialchars($endpointUrl) . '"]');
}
}

View File

@ -1,6 +1,8 @@
<?php <?php
namespace Tests; namespace Tests\Meta;
use Tests\TestCase;
class PwaManifestTest extends TestCase class PwaManifestTest extends TestCase
{ {

35
tests/Meta/RobotsTest.php Normal file
View File

@ -0,0 +1,35 @@
<?php
namespace Tests\Meta;
use Tests\TestCase;
class RobotsTest extends TestCase
{
public function test_robots_effected_by_public_status()
{
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
$this->setSettings(['app-public' => 'true']);
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee('Disallow: /');
}
public function test_robots_effected_by_setting()
{
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
config()->set('app.allow_robots', true);
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee('Disallow: /');
// Check config overrides app-public setting
config()->set('app.allow_robots', false);
$this->setSettings(['app-public' => 'true']);
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
}
}

View File

@ -128,33 +128,6 @@ class PublicActionTest extends TestCase
$resp->assertDontSee($page->name); $resp->assertDontSee($page->name);
} }
public function test_robots_effected_by_public_status()
{
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
$this->setSettings(['app-public' => 'true']);
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee('Disallow: /');
}
public function test_robots_effected_by_setting()
{
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
config()->set('app.allow_robots', true);
$resp = $this->get('/robots.txt');
$resp->assertSee("User-agent: *\nDisallow:");
$resp->assertDontSee('Disallow: /');
// Check config overrides app-public setting
config()->set('app.allow_robots', false);
$this->setSettings(['app-public' => 'true']);
$this->get('/robots.txt')->assertSee("User-agent: *\nDisallow: /");
}
public function test_default_favicon_file_created_upon_access() public function test_default_favicon_file_created_upon_access()
{ {
$faviconPath = public_path('favicon.ico'); $faviconPath = public_path('favicon.ico');