Compare commits

...

63 Commits
v2.3.13 ... 0.1

Author SHA1 Message Date
James Brooks
7c57ed65fa Don't use url helper 2015-04-18 16:51:18 +01:00
James Brooks
e0fd2db5ea Fixes #583, use 24H in PgSQL 2015-04-15 18:57:32 +01:00
James Brooks
7e1d0ebc75 Fixes #584, change the metrics display to include current hour values. 2015-04-15 18:56:29 +01:00
James Brooks
7f0a77ffa1 Fixes #585 - Multiple metrics under PgSql/SQLite would fail 2015-04-15 18:53:20 +01:00
James Brooks
a3f696e5b3 Fix CS 2015-04-15 09:10:42 +01:00
James Brooks
fe0cc779b9 Merge pull request #581 from silverxp/master
Added Dutch translation
2015-04-15 08:41:21 +01:00
Thom
02a240a172 Fixed indentation 2015-04-15 09:17:10 +02:00
Thom Spooren
47d0d4e007 Added Dutch translation 2015-04-12 22:29:21 +02:00
James Brooks
3e6a9fc77f Fix CS error 2015-04-11 19:15:41 +01:00
James Brooks
94d92aa6dc Do not use Lato anymore. Closes #578. 2015-04-11 19:14:02 +01:00
James Brooks
a35ea250da Fix poor metrics calculations. Closes #577 2015-04-11 19:10:42 +01:00
James Brooks
a1346deda9 Fix CS issues caused by new fixer settings. 2015-04-11 18:52:22 +01:00
James Brooks
07db5defb7 Merge pull request #580 from ApfelUser/patch-1
Fix typo
2015-04-11 18:49:31 +01:00
ApfelUser
f26d4c41c5 Fix typo
https://crowdin.com/translate/cachet/9/en-de#435
2015-04-10 13:57:01 +02:00
James Brooks
a88eadf79f Merge pull request #575 from bimlendu/sensu-handler
adding sensu handler info in README
2015-04-07 20:47:47 +01:00
Bimlendu Mishra
78eb149fc6 adding sensu handler info in README 2015-04-07 22:31:51 +05:30
James Brooks
dfa602f1f5 Merge pull request #570 from applelam/master
zh-Hant and zh-Hans Translation
2015-04-05 20:33:33 +01:00
James Brooks
352090d90f Closes #571 2015-04-05 20:31:40 +01:00
Apple Lam
bffb244506 zh-Hant and zh-Hans Translation
Translation for Chinese (Traditional) and Chinese (Simplified)
2015-04-06 02:48:26 +08:00
James Brooks
108a1fa0dd Make the RSS feed more valid. Still #547 2015-04-03 18:00:57 +01:00
James Brooks
647fb5a4d5 Update dependencies. 2015-04-03 17:53:15 +01:00
James Brooks
8dec726bc4 Closes #550 - Component Group feeds now work. 2015-04-03 17:52:18 +01:00
James Brooks
9f920634db Merge pull request #558 from urtho/master
Polish (PL-pl) translation
2015-03-31 16:07:33 +01:00
Paweł Pierścionek
2934f9be67 PL Translation 2015-03-31 15:01:34 +00:00
James Brooks
6756c037c9 Fix #544 2015-03-31 08:48:49 +01:00
James Brooks
83e979cc25 Order Atom & RSS feed by reversed creation date 2015-03-26 12:21:16 +00:00
James Brooks
438964c1dd Merge pull request #549 from cachethq/component-groups-feed
Feeds can now accept a component group id to filter. Closes #548
2015-03-26 09:00:38 +00:00
James Brooks
9a8e9a47c4 Merge pull request #545 from anarcat/fr
add maintenance translations
2015-03-26 09:00:22 +00:00
James Brooks
5e05b859ae Feeds can now accept a component group id to filter. Closes #548 2015-03-26 08:58:18 +00:00
James Brooks
4becca76f3 Make the Atom feed a little better. Part of #547 2015-03-26 08:46:17 +00:00
James Brooks
46578f9407 Update the RSS feed to be compliant. Part of #547 2015-03-26 08:44:04 +00:00
Antoine Beaupré
0a30a07c43 add maintenance translations 2015-03-25 16:26:06 -04:00
James Brooks
3e9b560640 Added property annotation 2015-03-25 12:10:22 +00:00
James Brooks
ca263d8b50 Don't display the template itself. Closes #541 2015-03-25 12:07:08 +00:00
James Brooks
6986ee95d3 List components within groups. Closes #542 2015-03-25 12:06:33 +00:00
James Brooks
fd429a6ea7 Merge pull request #539 from anarcat/patch-2
'composante' is feminine in french, also adjust other fr trans
2015-03-24 14:18:56 +00:00
Antoine Beaupré
59f69f6d99 'composante' is feminine in french, also adjust other fr trans
'Il s'est passé quelquechose...' doesn't actually mean anything...
2015-03-24 10:17:01 -04:00
James Brooks
f5756ff4bf Commit changes to ComponentGroup for no longer soft deleting 2015-03-24 13:10:13 +00:00
James Brooks
5e907ba04f Component groups are now properly removed. Closes #535 2015-03-24 08:52:28 +00:00
James Brooks
d12748a49d Merge pull request #537 from anarcat/patch-2
add more fr translation
2015-03-23 23:03:22 +00:00
anarcat
eeaa4cbc91 add more fr translation
this especially gets rid of the english word "Cool" but also translates a few more items
2015-03-23 16:38:25 -04:00
James Brooks
2f8db16161 Merge pull request #536 from anarcat/patch-1
more precise french translation for "watching"
2015-03-23 20:26:29 +00:00
anarcat
96d90aff65 more precise french translation for "watching"
`Analyse en cours` means `Under analysis`, which is basically the same as status `1` (`Investigating`), so a little misleading. I chose `Sous surveillance` (litterally `Under surveillance`) because it is more explicit. `Surveillé` (litterally `surveilled`) seemed a bit weird.
2015-03-23 13:57:17 -04:00
James Brooks
1b60d00bba Merge pull request #531 from matejkramny/feature/readme-addons
Add Addons section
2015-03-22 14:43:08 +00:00
Matej Kramny
b0049611af Add Addons section 2015-03-22 12:46:55 +00:00
James Brooks
95bbb955aa Fix #528 - Status value for scheduled statuses. 2015-03-21 11:19:19 +00:00
James Brooks
ad414a11e0 Fallback for $queryTypes 2015-03-21 07:28:15 +00:00
James Brooks
f76e9bab06 Better condition for showing the break item 2015-03-20 22:42:29 +00:00
James Brooks
9aa5972040 Only display the break item if we have ungrouped-components 2015-03-20 22:41:43 +00:00
James Brooks
11b1125cf8 Show components within groups on the status page. Closes #393. 2015-03-20 12:03:18 +00:00
James Brooks
2467d24702 Metric descriptions are no longer required, so make the form know that. 2015-03-20 11:39:50 +00:00
James Brooks
a62860fda3 Use the more appropriate collection method 2015-03-20 11:35:54 +00:00
James Brooks
c91344f79c CS changes 2015-03-20 11:23:17 +00:00
James Brooks
a4819099eb Track setups (pass and fails) 2015-03-20 11:20:55 +00:00
James Brooks
99d599e1c7 Split the new list up a little 2015-03-20 11:03:31 +00:00
James Brooks
77d1a45538 List users who have not enabled two-factor authentication. 2015-03-20 11:03:12 +00:00
James Brooks
b5ca990ae5 Fix responsive positioning of action buttons. 2015-03-20 10:53:16 +00:00
James Brooks
9d6ef75597 Reset the group_id for components if a group is deleted. 2015-03-20 10:49:58 +00:00
James Brooks
5299d9ea16 Show the number of components a group has in it. 2015-03-20 10:48:42 +00:00
James Brooks
d6a55a6540 Fix relationship of ComponentGroup and Components. 2015-03-20 10:48:03 +00:00
James Brooks
38a4fb710f Show the group a component is in, on the dashboard component index. 2015-03-20 10:45:44 +00:00
James Brooks
6496f8c928 Make sure we have a segment write key before we try tracking 2015-03-20 10:34:53 +00:00
James Brooks
c20f1ac785 Don't throw errors if we have no connection. 2015-03-20 10:32:07 +00:00
95 changed files with 3334 additions and 874 deletions

View File

@@ -40,6 +40,15 @@ The following extra dependencies are required to develop Cachet.
You can now find our documentation at [https://docs.cachethq.io](https://docs.cachethq.io) or, directly at [http://cachet.readme.io](http://cachet.readme.io) if the first link fails to load. [Cachet Demo](https://demo.cachethq.io)
### Demo Account
To test out the demo, you may login to the [Dashboard](https://demo.cachethq.io/dashboard) with the following:
- **Username:** test@test.com
- **Password:** test123
The demo is reset every half past the hour.
## What Cachet is not
Here is a list of things that Cachet is not or does not do:
@@ -77,6 +86,11 @@ Now go to `http://<ipdockerisboundto>/setup` and have fun!
Note: When running in production you should ensure that you enable SSL.
This is commonly achieved by running Nginx with your certificates on your Docker host, service or load balancers in-front of the running container, or by adding your custom SSL certificates and configuration to the supplied Nginx configuration.
## Addons
- [cachet-monitor](https://github.com/castawaylabs/cachet-monitor) - For url monitoring. Automatic incident updates
- [sensu-cachet](https://github.com/bimlendu/sensu-cachethq) - Sensu handler for updating CachetHQ.
## Read more about Cachet
For more information on why I started developing Cachet, check out my [Cachet articles on my blog](https://james-brooks.uk/tag/cachet/?utm_source=github&utm_medium=readme&utm_campaign=github-cachet).

View File

@@ -1,5 +1,5 @@
body.status-page {
font-family: 'Open Sans', 'Helevetic Neue', Arial, sans-serif;
font-family: $base-font-family;
background-color: #F0F3F4;
color: #333333;
font-size: 1.4em;
@@ -263,6 +263,10 @@ body.status-page {
font-size: 1.1em;
padding: 15px 15px;
a {
font-weight: 400;
}
h4 {
margin: 0;
font-weight: 400;
@@ -273,6 +277,28 @@ body.status-page {
margin-bottom: 0;
line-height: 1.3em;
}
&.group-name {
font-size: 1.2em;
background-color: $cachet_gray_light;
padding: {
top: 0.6em;
bottom: 0.6em;
}
}
&.sub-component {
&:before {
@extend .ion;
content: $ionicon-var-ios-plus-outline;
margin-right: 10px;
}
}
&.break {
padding: 1px;
background-color: $cachet_gray_light;
}
}
&.components {

View File

@@ -15,7 +15,7 @@ $tooltip-bg: #333 !default;
$tooltip-opacity: .9 !default;
$base-background-color: #f1f1f1;
$base-font-family: "Lato", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
$base-font-family: "Open Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
$base-font-weight: 400;
$base-letter-spacing: 0.08em;
$base-font-size: 15px;

View File

@@ -2,10 +2,14 @@
return [
// Enabled langs
'en-UD' => 'CrowdIn - InContext Localization',
'de' => 'Deutsch',
'en' => 'English',
'es' => 'Español',
'fr' => 'Français',
'pt-BR' => 'Portuguese, Brazilian',
'en-UD' => 'CrowdIn - InContext Localization',
'de' => 'Deutsch',
'en' => 'English',
'pl' => 'Polski',
'es' => 'Español',
'fr' => 'Français',
'nl' => 'Nederlands',
'pt-BR' => 'Portuguese, Brazilian',
'zh-Hant' => 'Chinese (Traditional)',
'zh-Hans' => 'Chinese (Simplified)',
];

View File

@@ -1,4 +1,5 @@
<?php
return [
/*

View File

@@ -17,7 +17,6 @@ class CreateComponentGroupsTable extends Migration
$table->increments('id');
$table->string('name');
$table->timestamps();
$table->softDeletes();
});
}

View File

@@ -17,37 +17,37 @@ class ComponentTableSeeder extends Seeder
$defaultComponents = [
[
"name" => "API",
"description" => "Used by third-parties to connect to us",
"status" => 2,
"user_id" => 1,
"order" => 0,
"group_id" => 0,
"link" => "",
'name' => 'API',
'description' => 'Used by third-parties to connect to us',
'status' => 2,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => '',
], [
"name" => "Documentation",
"description" => "Kindly powered by Readme.io",
"status" => 1,
"user_id" => 1,
"order" => 0,
"group_id" => 0,
"link" => "https://docs.cachethq.io",
'name' => 'Documentation',
'description' => 'Kindly powered by Readme.io',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://docs.cachethq.io',
], [
"name" => "Website",
"description" => "",
"status" => 1,
"user_id" => 1,
"order" => 0,
"group_id" => 0,
"link" => "https://cachethq.io",
'name' => 'Website',
'description' => '',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://cachethq.io',
], [
"name" => "Blog",
"description" => "The Cachet HQ blog.",
"status" => 1,
"user_id" => 1,
"order" => 0,
"group_id" => 0,
"link" => "https://blog.cachethq.io",
'name' => 'Blog',
'description' => 'The Cachet HQ blog.',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://blog.cachethq.io',
],
];

View File

@@ -17,35 +17,35 @@ class IncidentTableSeeder extends Seeder
$defaultIncidents = [
[
"name" => "Awesome",
"message" => "We totally nailed the fix.",
"status" => 4,
"component_id" => 0,
"user_id" => 1,
"scheduled_at" => null,
'name' => 'Awesome',
'message' => 'We totally nailed the fix.',
'status' => 4,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
"name" => "Monitoring the fix",
"message" => "We're checking that our fix will first work.",
"status" => 3,
"component_id" => 0,
"user_id" => 1,
"scheduled_at" => null,
'name' => 'Monitoring the fix',
'message' => "We're checking that our fix will first work.",
'status' => 3,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
"name" => "Update",
"message" => "We've found the problem, so we're looking at it.",
"status" => 2,
"component_id" => 0,
"user_id" => 1,
"scheduled_at" => null,
'name' => 'Update',
'message' => "We've found the problem, so we're looking at it.",
'status' => 2,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
"name" => "Test Incident",
"message" => "Something went wrong, oh noes.",
"component_id" => 0,
"user_id" => 1,
"scheduled_at" => null,
'name' => 'Test Incident',
'message' => 'Something went wrong, oh noes.',
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
];

View File

@@ -17,36 +17,36 @@ class SettingsTableSeeder extends Seeder
$defaultSettings = [
[
"name" => "app_name",
"value" => "Cachet Demo",
'name' => 'app_name',
'value' => 'Cachet Demo',
],
[
"name" => "app_domain",
"value" => "https://demo.cachethq.io",
'name' => 'app_domain',
'value' => 'https://demo.cachethq.io',
],
[
"name" => "show_support",
"value" => "1",
'name' => 'show_support',
'value' => '1',
],
[
"name" => "app_locale",
"value" => "en",
'name' => 'app_locale',
'value' => 'en',
],
[
"name" => "app_timezone",
"value" => "Europe/London",
'name' => 'app_timezone',
'value' => 'Europe/London',
],
[
"name" => "app_track",
"value" => "1",
'name' => 'app_track',
'value' => '1',
],
[
"name" => "app_incident_days",
"value" => "7",
'name' => 'app_incident_days',
'value' => '7',
],
[
"name" => "app_analytics",
"value" => "UA-58442674-3",
'name' => 'app_analytics',
'value' => 'UA-58442674-3',
],
];

View File

@@ -17,11 +17,11 @@ class UsersTableSeeder extends Seeder
$users = [
[
"username" => "test",
"password" => "test123",
"email" => "test@test.com",
"level" => 1,
"api_key" => "9yMHsdioQosnyVK4iCVR",
'username' => 'test',
'password' => 'test123',
'email' => 'test@test.com',
'level' => 1,
'api_key' => '9yMHsdioQosnyVK4iCVR',
],
];

View File

@@ -19,6 +19,7 @@ return [
'next_week' => 'nächste Woche',
'none' => 'keine Vorfälle',
'status' => [
0 => '',
1 => 'Untersuchung läuft',
2 => 'Problem identifiziert',
3 => 'Problem unter Beobachtung',

View File

@@ -80,8 +80,8 @@ return [
'about-this-page' => 'Über diese Seite',
'days-of-incidents' => 'Wie viele (vergangene) Tage sollen angezeigt werden?',
'banner' => 'Banner-Bild',
'banner-help' => "Wählen Sie möglichst ein Bild mit 930 px Breite.",
'google-analytics' => "Google Analytics Code",
'banner-help' => 'Wählen Sie möglichst ein Bild mit 930 px Breite.',
'google-analytics' => 'Google Analytics Code',
],
'security' => [
'allowed-domains' => 'Erlaubte Domains',

View File

@@ -13,65 +13,65 @@ return [
|
*/
"accepted" => "<em>:attribute</em> muss akzeptiert werden.",
"active_url" => "<em>:attribute</em> ist keine valide URL.",
"after" => "<em>:attribute</em> muss nach :date liegen.",
"alpha" => "<em>:attribute</em> darf nur Buchstaben enthalten.",
"alpha_dash" => "<em>:attribute</em> darf nur Nummern, Buchstaben und Slashes enthalten.",
"alpha_num" => "<em>:attribute</em> darf nur Nummern und Buchstaben enthalten.",
"array" => "<em>:attribute</em> muss ein Array sein.",
"before" => "<em>:attribute</em> muss vor :date liegen.",
"between" => [
"numeric" => "<em>:attribute</em> muss zwichen :min und :max liegen.",
"file" => "<em>:attribute</em> muss zwischen :min und :max kilobyte liegen.",
"string" => "<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.",
"array" => "<em>:attribute</em> muss zwischen :min und :max Werte enthalten.",
'accepted' => '<em>:attribute</em> muss akzeptiert werden.',
'active_url' => '<em>:attribute</em> ist keine valide URL.',
'after' => '<em>:attribute</em> muss nach :date liegen.',
'alpha' => '<em>:attribute</em> darf nur Buchstaben enthalten.',
'alpha_dash' => '<em>:attribute</em> darf nur Nummern, Buchstaben und Slashes enthalten.',
'alpha_num' => '<em>:attribute</em> darf nur Nummern und Buchstaben enthalten.',
'array' => '<em>:attribute</em> muss ein Array sein.',
'before' => '<em>:attribute</em> muss vor :date liegen.',
'between' => [
'numeric' => '<em>:attribute</em> muss zwichen :min und :max liegen.',
'file' => '<em>:attribute</em> muss zwischen :min und :max kilobyte liegen.',
'string' => '<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.',
'array' => '<em>:attribute</em> muss zwischen :min und :max Werte enthalten.',
],
"boolean" => "<em>:attribute</em> Feld muss 'true' oder 'false' sein.",
"confirmed" => "Die Bestätigung/Wiederholung von <em>:attribute</em> stimmt nicht überein.",
"date" => "<em>:attribute</em> ist kein valides Datum.",
"date_format" => "<em>:attribute</em> passt nicht zu folgendem Format :format.",
"different" => "<em>:attribute</em> und :other müssen sich unterscheiden.",
"digits" => "<em>:attribute</em> muss :digits Zeichen lang sein.",
"digits_between" => "<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.",
"email" => "<em>:attribute</em> muss eine valide E-Mail-Adresse sein.",
"exists" => "Das gewählte <em>:attribute</em> ist nicht korrekt.",
"image" => "<em>:attribute</em> muss ein Bild sein.",
"in" => "Das ausgewählte <em>:attribute</em> ist nicht korrekt.",
"integer" => "<em>:attribute</em> muss eine Zahl sein.",
"ip" => "<em>:attribute</em> muss eine valide IP sein.", # IPv4?
"max" => [
"numeric" => "<em>:attribute</em> darf nicht größer als :max sein.",
"file" => "<em>:attribute</em> darf nicht größer als :max kilobyte sein.",
"string" => "<em>:attribute</em> darf nicht mehr als :max Zeichen lang sein.",
"array" => "<em>:attribute</em> darf nicht mehr als :max Werte enthalten.",
'boolean' => "<em>:attribute</em> Feld muss 'true' oder 'false' sein.",
'confirmed' => 'Die Bestätigung/Wiederholung von <em>:attribute</em> stimmt nicht überein.',
'date' => '<em>:attribute</em> ist kein valides Datum.',
'date_format' => '<em>:attribute</em> passt nicht zu folgendem Format :format.',
'different' => '<em>:attribute</em> und :other müssen sich unterscheiden.',
'digits' => '<em>:attribute</em> muss :digits Zeichen lang sein.',
'digits_between' => '<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.',
'email' => '<em>:attribute</em> muss eine valide E-Mail-Adresse sein.',
'exists' => 'Das gewählte <em>:attribute</em> ist nicht korrekt.',
'image' => '<em>:attribute</em> muss ein Bild sein.',
'in' => 'Das ausgewählte <em>:attribute</em> ist nicht korrekt.',
'integer' => '<em>:attribute</em> muss eine Zahl sein.',
'ip' => '<em>:attribute</em> muss eine valide IP sein.', # IPv4?
'max' => [
'numeric' => '<em>:attribute</em> darf nicht größer als :max sein.',
'file' => '<em>:attribute</em> darf nicht größer als :max kilobyte sein.',
'string' => '<em>:attribute</em> darf nicht mehr als :max Zeichen lang sein.',
'array' => '<em>:attribute</em> darf nicht mehr als :max Werte enthalten.',
],
"mimes" => "<em>:attribute</em> muss eine Datei vom Typ :values sein.",
"min" => [
"numeric" => "<em>:attribute</em> muss mindestens :min sein.",
"file" => "<em>:attribute</em> muss mindestens :min kilobyte groß sein.",
"string" => "<em>:attribute</em> muss mindestens :min Zeichen lang sein.",
"array" => "<em>:attribute</em> muss mindestens :min Werte enthalten.",
'mimes' => '<em>:attribute</em> muss eine Datei vom Typ :values sein.',
'min' => [
'numeric' => '<em>:attribute</em> muss mindestens :min sein.',
'file' => '<em>:attribute</em> muss mindestens :min kilobyte groß sein.',
'string' => '<em>:attribute</em> muss mindestens :min Zeichen lang sein.',
'array' => '<em>:attribute</em> muss mindestens :min Werte enthalten.',
],
"not_in" => "Das ausgewählte <em>:attribute</em> ist nicht korrekt.",
"numeric" => "<em>:attribute</em> muss eine Nummer sein.",
"regex" => "Das Format von <em>:attribute</em> ist nicht korrekt.",
"required" => "<em>:attribute</em> wird benötigt.",
"required_if" => "<em>:attribute</em> wird benötigt wenn :other den Wert :value hat.",
"required_with" => "<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.",
"required_with_all" => "<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.",
"required_without" => "<em>:attribute</em> ist erforderlich wenn :values nicht vorhanden ist.",
"required_without_all" => "<em>:attribute</em> ist erforderlich wenn keines der Werte :values vorhanden sind.",
"same" => "<em>:attribute</em> und :other müssen übereinstimmen.",
"size" => [
"numeric" => "<em>:attribute</em> muss :size sein.",
"file" => "<em>:attribute</em> muss :size kilobyte groß sein.",
"string" => "<em>:attribute</em> muss :size Zeichen lang sein.",
"array" => "<em>:attribute</em> muss :size Werte enthalten.",
'not_in' => 'Das ausgewählte <em>:attribute</em> ist nicht korrekt.',
'numeric' => '<em>:attribute</em> muss eine Nummer sein.',
'regex' => 'Das Format von <em>:attribute</em> ist nicht korrekt.',
'required' => '<em>:attribute</em> wird benötigt.',
'required_if' => '<em>:attribute</em> wird benötigt wenn :other den Wert :value hat.',
'required_with' => '<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.',
'required_with_all' => '<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.',
'required_without' => '<em>:attribute</em> ist erforderlich wenn :values nicht vorhanden ist.',
'required_without_all' => '<em>:attribute</em> ist erforderlich wenn keines der Werte :values vorhanden sind.',
'same' => '<em>:attribute</em> und :other müssen übereinstimmen.',
'size' => [
'numeric' => '<em>:attribute</em> muss :size sein.',
'file' => '<em>:attribute</em> muss :size kilobyte groß sein.',
'string' => '<em>:attribute</em> muss :size Zeichen lang sein.',
'array' => '<em>:attribute</em> muss :size Werte enthalten.',
],
"unique" => "<em>:attribute</em> wurde beirets gewählt.",
"url" => "Das Format von <em>:attribute</em> ist nicht korrekt.",
"timezone" => "<em>:attribute</em> muss eine valide Zeitzone sein.",
'unique' => '<em>:attribute</em> wurde beirets gewählt.',
'url' => 'Das Format von <em>:attribute</em> ist nicht korrekt.',
'timezone' => '<em>:attribute</em> muss eine valide Zeitzone sein.',
/*
|--------------------------------------------------------------------------

View File

@@ -80,8 +80,8 @@ return [
'about-this-page' => 'crwdns402:0crwdne402:0',
'days-of-incidents' => 'crwdns403:0crwdne403:0',
'banner' => 'crwdns404:0crwdne404:0',
'banner-help' => "crwdns405:0crwdne405:0",
'google-analytics' => "crwdns406:0crwdne406:0",
'banner-help' => 'crwdns405:0crwdne405:0',
'google-analytics' => 'crwdns406:0crwdne406:0',
],
'security' => [
'allowed-domains' => 'crwdns407:0crwdne407:0',

View File

@@ -13,65 +13,65 @@ return [
|
*/
"accepted" => "crwdns96:0crwdne96:0",
"active_url" => "crwdns97:0crwdne97:0",
"after" => "crwdns98:0crwdne98:0",
"alpha" => "crwdns99:0crwdne99:0",
"alpha_dash" => "crwdns100:0crwdne100:0",
"alpha_num" => "crwdns101:0crwdne101:0",
"array" => "crwdns102:0crwdne102:0",
"before" => "crwdns103:0crwdne103:0",
"between" => [
"numeric" => "crwdns104:0crwdne104:0",
"file" => "crwdns418:0crwdne418:0",
"string" => "crwdns419:0crwdne419:0",
"array" => "crwdns420:0crwdne420:0",
'accepted' => 'crwdns96:0crwdne96:0',
'active_url' => 'crwdns97:0crwdne97:0',
'after' => 'crwdns98:0crwdne98:0',
'alpha' => 'crwdns99:0crwdne99:0',
'alpha_dash' => 'crwdns100:0crwdne100:0',
'alpha_num' => 'crwdns101:0crwdne101:0',
'array' => 'crwdns102:0crwdne102:0',
'before' => 'crwdns103:0crwdne103:0',
'between' => [
'numeric' => 'crwdns104:0crwdne104:0',
'file' => 'crwdns418:0crwdne418:0',
'string' => 'crwdns419:0crwdne419:0',
'array' => 'crwdns420:0crwdne420:0',
],
"boolean" => "crwdns108:0crwdne108:0",
"confirmed" => "crwdns109:0crwdne109:0",
"date" => "crwdns110:0crwdne110:0",
"date_format" => "crwdns111:0crwdne111:0",
"different" => "crwdns112:0crwdne112:0",
"digits" => "crwdns113:0crwdne113:0",
"digits_between" => "crwdns114:0crwdne114:0",
"email" => "crwdns115:0crwdne115:0",
"exists" => "crwdns116:0crwdne116:0",
"image" => "crwdns117:0crwdne117:0",
"in" => "crwdns118:0crwdne118:0",
"integer" => "crwdns119:0crwdne119:0",
"ip" => "crwdns120:0crwdne120:0",
"max" => [
"numeric" => "crwdns121:0crwdne121:0",
"file" => "crwdns421:0crwdne421:0",
"string" => "crwdns422:0crwdne422:0",
"array" => "crwdns423:0crwdne423:0",
'boolean' => 'crwdns108:0crwdne108:0',
'confirmed' => 'crwdns109:0crwdne109:0',
'date' => 'crwdns110:0crwdne110:0',
'date_format' => 'crwdns111:0crwdne111:0',
'different' => 'crwdns112:0crwdne112:0',
'digits' => 'crwdns113:0crwdne113:0',
'digits_between' => 'crwdns114:0crwdne114:0',
'email' => 'crwdns115:0crwdne115:0',
'exists' => 'crwdns116:0crwdne116:0',
'image' => 'crwdns117:0crwdne117:0',
'in' => 'crwdns118:0crwdne118:0',
'integer' => 'crwdns119:0crwdne119:0',
'ip' => 'crwdns120:0crwdne120:0',
'max' => [
'numeric' => 'crwdns121:0crwdne121:0',
'file' => 'crwdns421:0crwdne421:0',
'string' => 'crwdns422:0crwdne422:0',
'array' => 'crwdns423:0crwdne423:0',
],
"mimes" => "crwdns125:0crwdne125:0",
"min" => [
"numeric" => "crwdns126:0crwdne126:0",
"file" => "crwdns424:0crwdne424:0",
"string" => "crwdns425:0crwdne425:0",
"array" => "crwdns426:0crwdne426:0",
'mimes' => 'crwdns125:0crwdne125:0',
'min' => [
'numeric' => 'crwdns126:0crwdne126:0',
'file' => 'crwdns424:0crwdne424:0',
'string' => 'crwdns425:0crwdne425:0',
'array' => 'crwdns426:0crwdne426:0',
],
"not_in" => "crwdns130:0crwdne130:0",
"numeric" => "crwdns131:0crwdne131:0",
"regex" => "crwdns132:0crwdne132:0",
"required" => "crwdns133:0crwdne133:0",
"required_if" => "crwdns134:0crwdne134:0",
"required_with" => "crwdns135:0crwdne135:0",
"required_with_all" => "crwdns136:0crwdne136:0",
"required_without" => "crwdns137:0crwdne137:0",
"required_without_all" => "crwdns138:0crwdne138:0",
"same" => "crwdns139:0crwdne139:0",
"size" => [
"numeric" => "crwdns140:0crwdne140:0",
"file" => "crwdns427:0crwdne427:0",
"string" => "crwdns428:0crwdne428:0",
"array" => "crwdns429:0crwdne429:0",
'not_in' => 'crwdns130:0crwdne130:0',
'numeric' => 'crwdns131:0crwdne131:0',
'regex' => 'crwdns132:0crwdne132:0',
'required' => 'crwdns133:0crwdne133:0',
'required_if' => 'crwdns134:0crwdne134:0',
'required_with' => 'crwdns135:0crwdne135:0',
'required_with_all' => 'crwdns136:0crwdne136:0',
'required_without' => 'crwdns137:0crwdne137:0',
'required_without_all' => 'crwdns138:0crwdne138:0',
'same' => 'crwdns139:0crwdne139:0',
'size' => [
'numeric' => 'crwdns140:0crwdne140:0',
'file' => 'crwdns427:0crwdne427:0',
'string' => 'crwdns428:0crwdne428:0',
'array' => 'crwdns429:0crwdne429:0',
],
"unique" => "crwdns144:0crwdne144:0",
"url" => "crwdns145:0crwdne145:0",
"timezone" => "crwdns146:0crwdne146:0",
'unique' => 'crwdns144:0crwdne144:0',
'url' => 'crwdns145:0crwdne145:0',
'timezone' => 'crwdns146:0crwdne146:0',
/*
|--------------------------------------------------------------------------

View File

@@ -62,6 +62,7 @@ return [
'components' => [
'components' => 'Components',
'component_statuses' => 'Component Statuses',
'listed_group' => 'Grouped under :name',
'add' => [
'title' => 'Add a component',
'message' => 'You should add a component.',
@@ -132,7 +133,8 @@ return [
'too-big' => 'The file you uploaded is too big. Upload an image smaller than :size',
],
'security' => [
'security' => 'Security',
'security' => 'Security',
'two-factor' => 'Users without two-factor authentication',
],
'stylesheet' => [
'stylesheet' => 'Stylesheet',
@@ -177,7 +179,7 @@ return [
'customize' => 'Customize',
'team' => 'Add users',
'api' => 'Generate API token',
'two-factor' => 'Two Factor Authetication',
'two-factor' => 'Two Factor Authentication',
],
],

View File

@@ -84,7 +84,7 @@ return [
'days-of-incidents' => 'How many days of incidents to show?',
'banner' => 'Banner Image',
'banner-help' => "It's recommended that you upload files no bigger than 930px wide .",
'google-analytics' => "Google Analytics code",
'google-analytics' => 'Google Analytics code',
],
'security' => [
'allowed-domains' => 'Allowed domains',

View File

@@ -13,65 +13,65 @@ return [
|
*/
"accepted" => "The :attribute must be accepted.",
"active_url" => "The :attribute is not a valid URL.",
"after" => "The :attribute must be a date after :date.",
"alpha" => "The :attribute may only contain letters.",
"alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
"alpha_num" => "The :attribute may only contain letters and numbers.",
"array" => "The :attribute must be an array.",
"before" => "The :attribute must be a date before :date.",
"between" => [
"numeric" => "The :attribute must be between :min and :max.",
"file" => "The :attribute must be between :min and :max kilobytes.",
"string" => "The :attribute must be between :min and :max characters.",
"array" => "The :attribute must have between :min and :max items.",
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
"boolean" => "The :attribute field must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"date" => "The :attribute is not a valid date.",
"date_format" => "The :attribute does not match the format :format.",
"different" => "The :attribute and :other must be different.",
"digits" => "The :attribute must be :digits digits.",
"digits_between" => "The :attribute must be between :min and :max digits.",
"email" => "The :attribute must be a valid email address.",
"exists" => "The selected :attribute is invalid.",
"image" => "The :attribute must be an image.",
"in" => "The selected :attribute is invalid.",
"integer" => "The :attribute must be an integer.",
"ip" => "The :attribute must be a valid IP address.",
"max" => [
"numeric" => "The :attribute may not be greater than :max.",
"file" => "The :attribute may not be greater than :max kilobytes.",
"string" => "The :attribute may not be greater than :max characters.",
"array" => "The :attribute may not have more than :max items.",
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
"mimes" => "The :attribute must be a file of type: :values.",
"min" => [
"numeric" => "The :attribute must be at least :min.",
"file" => "The :attribute must be at least :min kilobytes.",
"string" => "The :attribute must be at least :min characters.",
"array" => "The :attribute must have at least :min items.",
'mimes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
"not_in" => "The selected :attribute is invalid.",
"numeric" => "The :attribute must be a number.",
"regex" => "The :attribute format is invalid.",
"required" => "The :attribute field is required.",
"required_if" => "The :attribute field is required when :other is :value.",
"required_with" => "The :attribute field is required when :values is present.",
"required_with_all" => "The :attribute field is required when :values is present.",
"required_without" => "The :attribute field is required when :values is not present.",
"required_without_all" => "The :attribute field is required when none of :values are present.",
"same" => "The :attribute and :other must match.",
"size" => [
"numeric" => "The :attribute must be :size.",
"file" => "The :attribute must be :size kilobytes.",
"string" => "The :attribute must be :size characters.",
"array" => "The :attribute must contain :size items.",
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
"unique" => "The :attribute has already been taken.",
"url" => "The :attribute format is invalid.",
"timezone" => "The :attribute must be a valid zone.",
'unique' => 'The :attribute has already been taken.',
'url' => 'The :attribute format is invalid.',
'timezone' => 'The :attribute must be a valid zone.',
/*
|--------------------------------------------------------------------------

View File

@@ -19,6 +19,7 @@ return [
'next_week' => 'Siguiente semana',
'none' => 'No hay ninguna incidencia reportada.',
'status' => [
0 => '',
1 => 'Investigando',
2 => 'Identificado',
3 => 'Observando',

View File

@@ -81,8 +81,8 @@ return [
'about-this-page' => 'Sobre esta página',
'days-of-incidents' => '¿Cuántos días de incidentes mostrar?',
'banner' => 'Imagen de inicio',
'banner-help' => "Se recomienda subir una imagen no más grande de 930px de ancho .",
'google-analytics' => "Código de Google Analytics",
'banner-help' => 'Se recomienda subir una imagen no más grande de 930px de ancho .',
'google-analytics' => 'Código de Google Analytics',
],
'security' => [
'allowed-domains' => 'Dominios permitidos',

View File

@@ -13,65 +13,65 @@ return [
|
*/
"accepted" => "El :attribute debe ser aceptado.",
"active_url" => "El :attribute no es un enlace válido.",
"after" => "El :attribute debe ser una fecha después de :date.",
"alpha" => "El :attribute sólo puede contener letras.",
"alpha_dash" => "El :attribute sólo puede contener letras, números y guiones.",
"alpha_num" => "El :attribute sólo puede contener letras y números.",
"array" => "El :attribute debe ser una matriz.",
"before" => "El :attribute debe ser una fecha antes de :date.",
"between" => [
"numeric" => "El :attribute debe ser entre :min y :max.",
"file" => "El :attribute debe ser entre :min y :max kilobytes.",
"string" => "El :attribute debe tener entre :min y :max caracteres.",
"array" => "El :attribute debe tener entre :min y :max objetos.",
'accepted' => 'El :attribute debe ser aceptado.',
'active_url' => 'El :attribute no es un enlace válido.',
'after' => 'El :attribute debe ser una fecha después de :date.',
'alpha' => 'El :attribute sólo puede contener letras.',
'alpha_dash' => 'El :attribute sólo puede contener letras, números y guiones.',
'alpha_num' => 'El :attribute sólo puede contener letras y números.',
'array' => 'El :attribute debe ser una matriz.',
'before' => 'El :attribute debe ser una fecha antes de :date.',
'between' => [
'numeric' => 'El :attribute debe ser entre :min y :max.',
'file' => 'El :attribute debe ser entre :min y :max kilobytes.',
'string' => 'El :attribute debe tener entre :min y :max caracteres.',
'array' => 'El :attribute debe tener entre :min y :max objetos.',
],
"boolean" => "El campo del :attribute debe ser verdadero o falso.",
"confirmed" => "La confirmación del :attribute no coincide.",
"date" => "El :attribute no es una fecha válida.",
"date_format" => "El :attribute no cumple el formato :format.",
"different" => ":attribute y :other deben ser diferentes.",
"digits" => "El :attribute debe tener :digits dígitos.",
"digits_between" => "El :attribute debe tener entre: min y :max dígitos.",
"email" => "El :attribute debe ser una dirección de email válida.",
"exists" => "El :attribute seleccionado es inválido.",
"image" => "El :attribute debe ser una imagen.",
"in" => "El :attribute seleccionado es inválido.",
"integer" => "El :attribute debe ser un número entero.",
"ip" => "El :attribute debe ser una dirección IP válida.",
"max" => [
"numeric" => "El :attribute no puede tener más de :max.",
"file" => "El :attribute no puede tener más de :max kilobytes.",
"string" => "El :attribute no puede tener más de :max caracteres.",
"array" => "El :attribute no puede tener más de :max objetos.",
'boolean' => 'El campo del :attribute debe ser verdadero o falso.',
'confirmed' => 'La confirmación del :attribute no coincide.',
'date' => 'El :attribute no es una fecha válida.',
'date_format' => 'El :attribute no cumple el formato :format.',
'different' => ':attribute y :other deben ser diferentes.',
'digits' => 'El :attribute debe tener :digits dígitos.',
'digits_between' => 'El :attribute debe tener entre: min y :max dígitos.',
'email' => 'El :attribute debe ser una dirección de email válida.',
'exists' => 'El :attribute seleccionado es inválido.',
'image' => 'El :attribute debe ser una imagen.',
'in' => 'El :attribute seleccionado es inválido.',
'integer' => 'El :attribute debe ser un número entero.',
'ip' => 'El :attribute debe ser una dirección IP válida.',
'max' => [
'numeric' => 'El :attribute no puede tener más de :max.',
'file' => 'El :attribute no puede tener más de :max kilobytes.',
'string' => 'El :attribute no puede tener más de :max caracteres.',
'array' => 'El :attribute no puede tener más de :max objetos.',
],
"mimes" => "El :attribute debe ser un archivo de tipo: :values.",
"min" => [
"numeric" => "El :attribute debe tener al menos :min.",
"file" => "El :attribute debe tener al menos :min kilobytes.",
"string" => "El :attribute debe tener al menos :min characters.",
"array" => "El :attribute debe tener al menos :min objetos.",
'mimes' => 'El :attribute debe ser un archivo de tipo: :values.',
'min' => [
'numeric' => 'El :attribute debe tener al menos :min.',
'file' => 'El :attribute debe tener al menos :min kilobytes.',
'string' => 'El :attribute debe tener al menos :min characters.',
'array' => 'El :attribute debe tener al menos :min objetos.',
],
"not_in" => "El :attribute seleccionado es inválido.",
"numeric" => "El :attribute sebe ser un número.",
"regex" => "El formato del :attribute es inválido.",
"required" => "El campo del :attribute es requerido.",
"required_if" => "El campo del :attribute se requiere cuando :other es :value.",
"required_with" => "El campo del :attribute se requiere cuando :values es presente.",
"required_with_all" => "El campo del :attribute se requiere cuando :values es presente.",
"required_without" => "El campo del :attribute se requiere cuando :values no es presente.",
"required_without_all" => "El campo del :attribute se requiere cuando ninguno de los :values son presentes.",
"same" => "Los :attribute y :other deben coincidir.",
"size" => [
"numeric" => "El :attribute debe ser :size.",
"file" => "El :attribute debe ser :size kilobytes.",
"string" => "El :attribute debe tener :size caracteres.",
"array" => "El :attribute debe contener :size objetos.",
'not_in' => 'El :attribute seleccionado es inválido.',
'numeric' => 'El :attribute sebe ser un número.',
'regex' => 'El formato del :attribute es inválido.',
'required' => 'El campo del :attribute es requerido.',
'required_if' => 'El campo del :attribute se requiere cuando :other es :value.',
'required_with' => 'El campo del :attribute se requiere cuando :values es presente.',
'required_with_all' => 'El campo del :attribute se requiere cuando :values es presente.',
'required_without' => 'El campo del :attribute se requiere cuando :values no es presente.',
'required_without_all' => 'El campo del :attribute se requiere cuando ninguno de los :values son presentes.',
'same' => 'Los :attribute y :other deben coincidir.',
'size' => [
'numeric' => 'El :attribute debe ser :size.',
'file' => 'El :attribute debe ser :size kilobytes.',
'string' => 'El :attribute debe tener :size caracteres.',
'array' => 'El :attribute debe contener :size objetos.',
],
"unique" => "El :attribute ya ha sido usado.",
"url" => "El formato :attribute es inválido.",
"timezone" => "El :attribute debe ser una zona válida.",
'unique' => 'El :attribute ya ha sido usado.',
'url' => 'El formato :attribute es inválido.',
'timezone' => 'El :attribute debe ser una zona válida.',
/*
|--------------------------------------------------------------------------

View File

@@ -18,10 +18,13 @@ return [
'previous_week' => 'Semaine précédente',
'next_week' => 'Semaine suivante',
'none' => 'Rien à reporter',
'scheduled' => 'Maintenance planifiée',
'scheduled_at' => ', prévue à :timestamp',
'status' => [
0 => '',
1 => 'Enquête en cours',
2 => 'Identifié',
3 => 'Analyse en cours',
3 => 'Sous surveillance',
4 => 'Corrigé',
],
],
@@ -37,6 +40,15 @@ return [
'revoke' => 'Révoquer cette clé d\'API',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => 'Par heure',
'daily' => 'Par jour',
'monthly' => 'Par mois',
],
],
// Other
'powered_by' => ':app Status Page est propulsé par <a href="https://cachethq.github.io">Cachet</a>.',
'about_this_site' => 'À propos de ce site',

View File

@@ -13,12 +13,12 @@ return [
'add' => [
'title' => 'Ajouter un incident',
'success' => 'Incident ajouté.',
'failure' => 'Il s\'est passé quelque chose avec cet incident.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de cet incident.',
],
'edit' => [
'title' => 'Éditer un incident',
'success' => 'Incident mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose avec cet incident.',
'failure' => 'Une erreur s\'est produite lors de la mise à jour de cet incident.',
],
// Incident templates
@@ -26,7 +26,7 @@ return [
'add' => [
'title' => 'Créer un modèle d\'incident',
'success' => 'Modèle créé.',
'failure' => 'Il s\'est passé quelque chose avec ce modèle d\'incident.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de ce modèle d\'incident.',
],
'edit' => [
'title' => 'Modifier un modèle',
@@ -36,34 +36,54 @@ return [
],
],
// Components
'components' => [
'components' => 'Composant|Composants',
'component_statuses' => 'Statut des composants',
'add' => [
'title' => 'Créer un composant',
'message' => 'Commencez par ajouter un composant.',
'success' => 'Composant créé.',
'failure' => 'Il s\'est passé quelque chose avec ce composant.',
// Incident Maintenance
'schedule' => [
'schedule' => 'Maintenance planifiée',
'scheduled_at' => 'Prévue à :timestamp',
'add' => [
'title' => 'Ajouter une maintenance planifiée',
'success' => 'Maintenance ajoutée.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de la maintenance.',
],
'edit' => [
'title' => 'Éditer un composant',
'title' => 'Éditer la maintenance',
'success' => 'Maintenance mise à jour!',
'failure' => 'Une erreur s\'est produite lors de la modification de la maintenance.',
],
'delete' => [
'success' => 'La maintenance a été effacée et ne s\'affihera plus..',
'failure' => 'La maintenance n\'a pu être effacée. Veuillez essayez de nouveau.',
],
],
// Components
'components' => [
'components' => 'Composantes',
'component_statuses' => 'Statut des composantes',
'add' => [
'title' => 'Créer une composante',
'message' => 'Commencez par ajouter une composante.',
'success' => 'Composante créée.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de cette composante.',
],
'edit' => [
'title' => 'Éditer une composante',
'success' => 'Composant mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose avec ce composant.',
'failure' => 'Une erreur s\'est produite lors de la mise à jour de cette composante.',
],
// Component groups
'groups' => [
'groups' => 'Groupe de composants|Groupes de composants',
'groups' => 'Groupe de composantes',
'add' => [
'title' => 'Ajouter un group de composants',
'success' => 'Groupe de composants ajouté.',
'failure' => 'Il s\'est passé quelque chose avec ce composantgroupe de composants.',
'title' => 'Ajouter un group de composantes',
'success' => 'Groupe de composantes ajouté.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de ce groupe de composantes.',
],
'edit' => [
'title' => 'Edit a component group',
'success' => 'Component group updated.',
'failure' => 'Something went wrong with the component group.',
'title' => 'Éditer un groupe de composantes',
'success' => 'Groupe de composantes mis-à-jour.',
'failure' => 'Une erreur s\'est produite lors de la mise à jour de ce groupe de composantes.',
],
],
],
@@ -77,9 +97,9 @@ return [
'failure' => 'Il s\'est passé quelque chose avec ce point de mesure.',
],
'edit' => [
'title' => 'Edit a metric',
'success' => 'Metric updated.',
'failure' => 'Something went wrong with the metric.',
'title' => 'Éditer un point de mesure',
'success' => 'Point de mesure mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose avec ce point de mesure.',
],
],
@@ -88,16 +108,16 @@ return [
'team' => 'Équipe',
'member' => 'Membre',
'profile' => 'Profil',
'description' => 'Les membres de l\'équipe pourrons ajouter, modifier &amp; éditer les composants et incidents.',
'description' => 'Les membres de l\'équipe pourrons ajouter, modifier &amp; éditer les composantes et incidents.',
'add' => [
'title' => 'Ajouter un membre à l\'équipe',
'success' => 'Membre ajouté.',
'failure' => 'Il s\'est passé quelque chose avec ce membre.',
'failure' => 'Une erreur s\'est produite lors de l\'ajout de ce membre.',
],
'edit' => [
'title' => 'Mettre à jour le profil',
'success' => 'Profil mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose en mettant à jour le profil.',
'failure' => 'Une erreur s\'est produite lors de la mise à jour du le profil.',
],
],
@@ -127,9 +147,9 @@ return [
// Login
'login' => [
'login' => 'Connexion',
'logged_in' => "Vous êtes connecté.",
'logged_in' => 'Vous êtes connecté.',
'welcome' => 'Re-bonjour !',
'two-factor' => 'Please enter your token.',
'two-factor' => 'Entrez votre jeton d\'identification.',
],
// Sidebar footer
@@ -140,22 +160,22 @@ return [
// Notifications
'notifications' => [
'notifications' => 'Notifications',
'awesome' => 'Cool.',
'awesome' => 'Super.',
'whoops' => 'Oups.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Welcome to Cachet',
'message' => 'Your status page is almost ready! You might want to configure these extra settings',
'close' => 'Just go straight to my dashboard',
'welcome' => 'Bienvenue dans Cachet',
'message' => 'Votre page d\'état est presque prête! Vous voudrez probablement configurer ces réglages supplémentaires',
'close' => 'Aller directement au tableau de bord',
'steps' => [
'component' => 'Create components',
'incident' => 'Create incidents',
'customize' => 'Customize your Cachet Status Page.',
'team' => 'Add users to your team.',
'api' => 'Generate API token.',
'two-factor' => 'Enable Two Factor Authetication.',
'component' => 'Créer une composante',
'incident' => 'Créer un incident',
'customize' => 'Configurer votre Cachet.',
'team' => 'Ajouter des utilisateurs à votre équipe.',
'api' => 'Générer un jeton d\'identification API.',
'two-factor' => 'Activer l\'identification à deux étapes.',
],
],

View File

@@ -80,8 +80,8 @@ return [
'about-this-page' => 'À propos de cette page',
'days-of-incidents' => 'Nombre de jours à afficher ?',
'banner' => 'Bannière',
'banner-help' => "Il est recommandé de télécharger des fichiers de moins de 930 pixels de large.",
'google-analytics' => "Google Analytics code",
'banner-help' => 'Il est recommandé de télécharger des fichiers de moins de 930 pixels de large.',
'google-analytics' => 'Google Analytics code',
],
'security' => [
'allowed-domains' => 'Domaines autorisés. <small class="help-block"></small>',

View File

@@ -13,63 +13,63 @@ return [
|
*/
"accepted" => "Le champ :attribute doit être accepté.",
"active_url" => "Le champ :attribute n'est pas une URL valide.",
"after" => "Le champ :attribute doit être une date postérieure à :date.",
"alpha" => "Le champ :attribute ne peut contenir que des lettres.",
"alpha_dash" => "Le champ :attribute ne peut contenir que des lettres, chiffres et tirets.",
"alpha_num" => "Le champ :attribute ne peut contenir que des lettres ou des chiffres.",
"array" => "Le champ :attribute doit être un tableau.",
"before" => "Le champ :attribute doit être une date antérieure à :date.",
"between" => [
"numeric" => "Le champ :attribute doit être entre :min et :max.",
"file" => "Le champ :attribute doit être entre :min et :max kilobytes.",
"string" => "Le champ :attribute doit contenir entre :min et :max caractères.",
"array" => "Le champ :attribute doit avoir entre :min et :max objets.",
'accepted' => 'Le champ :attribute doit être accepté.',
'active_url' => "Le champ :attribute n'est pas une URL valide.",
'after' => 'Le champ :attribute doit être une date postérieure à :date.',
'alpha' => 'Le champ :attribute ne peut contenir que des lettres.',
'alpha_dash' => 'Le champ :attribute ne peut contenir que des lettres, chiffres et tirets.',
'alpha_num' => 'Le champ :attribute ne peut contenir que des lettres ou des chiffres.',
'array' => 'Le champ :attribute doit être un tableau.',
'before' => 'Le champ :attribute doit être une date antérieure à :date.',
'between' => [
'numeric' => 'Le champ :attribute doit être entre :min et :max.',
'file' => 'Le champ :attribute doit être entre :min et :max kilobytes.',
'string' => 'Le champ :attribute doit contenir entre :min et :max caractères.',
'array' => 'Le champ :attribute doit avoir entre :min et :max objets.',
],
"confirmed" => "Le champ :attribute confirmation ne correspond pas.",
"date" => "Le champ :attribute n'est pas une date valide.",
"date_format" => "Le champ :attribute ne correspond pas au format :format.",
"different" => "Le champ :attribute et :other doivent être différents.",
"digits" => "Le champ :attribute doit être composé de :digits chiffres.",
"digits_between" => "Le champ :attribute doit être composé de :min jusqu'à :max chiffres.",
"email" => "Le champ :attribute doit être une adresse email valide.",
"exists" => "Le champ selected :attribute est invalide.",
"image" => "Le champ :attribute doit être une image.",
"in" => "Le champ selected :attribute est invalide.",
"integer" => "Le champ :attribute doit être un entier.",
"ip" => "Le champ :attribute doit être une adresse IP valide.",
"max" => [
"numeric" => "Le champ :attribute ne doit pas être supérieure à :max.",
"file" => "Le champ :attribute ne doit pas être supérieure à :max kilobytes.",
"string" => "Le champ :attribute ne doit pas être supérieure à :max caractères.",
"array" => "Le champ :attribute ne doit pas avoir plus de :max objets.",
'confirmed' => 'Le champ :attribute confirmation ne correspond pas.',
'date' => "Le champ :attribute n'est pas une date valide.",
'date_format' => 'Le champ :attribute ne correspond pas au format :format.',
'different' => 'Le champ :attribute et :other doivent être différents.',
'digits' => 'Le champ :attribute doit être composé de :digits chiffres.',
'digits_between' => "Le champ :attribute doit être composé de :min jusqu'à :max chiffres.",
'email' => 'Le champ :attribute doit être une adresse email valide.',
'exists' => 'Le champ selected :attribute est invalide.',
'image' => 'Le champ :attribute doit être une image.',
'in' => 'Le champ selected :attribute est invalide.',
'integer' => 'Le champ :attribute doit être un entier.',
'ip' => 'Le champ :attribute doit être une adresse IP valide.',
'max' => [
'numeric' => 'Le champ :attribute ne doit pas être supérieure à :max.',
'file' => 'Le champ :attribute ne doit pas être supérieure à :max kilobytes.',
'string' => 'Le champ :attribute ne doit pas être supérieure à :max caractères.',
'array' => 'Le champ :attribute ne doit pas avoir plus de :max objets.',
],
"mimes" => "Le champ :attribute doit être un fichier de type : :values.",
"min" => [
"numeric" => "Le champ :attribute doit être supérieur à :min.",
"file" => "Le champ :attribute doit être supérieur à :min kilobytes.",
"string" => "Le champ :attribute doit être supérieur à :min caractères.",
"array" => "Le champ :attribute doit avoir au moins :min objets.",
'mimes' => 'Le champ :attribute doit être un fichier de type : :values.',
'min' => [
'numeric' => 'Le champ :attribute doit être supérieur à :min.',
'file' => 'Le champ :attribute doit être supérieur à :min kilobytes.',
'string' => 'Le champ :attribute doit être supérieur à :min caractères.',
'array' => 'Le champ :attribute doit avoir au moins :min objets.',
],
"not_in" => "Le champ sélectionné :attribute est invalide.",
"numeric" => "Le champ :attribute doit être un nombre.",
"regex" => "Le format du champ :attribute est invalide.",
"required" => "Le champ :attribute est obligatoire.",
"required_if" => "Le champ :attribute est obligatoire quand :other est :value.",
"required_with" => "Le champ :attribute est obligatoire quand :values est présent.",
"required_with_all" => "Le champ :attribute est obligatoire quand :values est présent.",
"required_without" => "Le champ :attribute est obligatoire quand :values n'est pas présent.",
"required_without_all" => "Le champ :attribute est obligatoire quand aucun des champs :values n'est présent.",
"same" => "Le champ :attribute et :other doivent être identiques.",
"size" => [
"numeric" => "La taille du champ :attribute doit être de :size.",
"file" => "Le poids du champ :attribute doit être de :size kilobytes.",
"string" => "Le nombre de caractères du champ :attribute doit être de :size caractères.",
"array" => "Le champ :attribute doit contenir :size objets.",
'not_in' => 'Le champ sélectionné :attribute est invalide.',
'numeric' => 'Le champ :attribute doit être un nombre.',
'regex' => 'Le format du champ :attribute est invalide.',
'required' => 'Le champ :attribute est obligatoire.',
'required_if' => 'Le champ :attribute est obligatoire quand :other est :value.',
'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.',
'required_with_all' => 'Le champ :attribute est obligatoire quand :values est présent.',
'required_without' => "Le champ :attribute est obligatoire quand :values n'est pas présent.",
'required_without_all' => "Le champ :attribute est obligatoire quand aucun des champs :values n'est présent.",
'same' => 'Le champ :attribute et :other doivent être identiques.',
'size' => [
'numeric' => 'La taille du champ :attribute doit être de :size.',
'file' => 'Le poids du champ :attribute doit être de :size kilobytes.',
'string' => 'Le nombre de caractères du champ :attribute doit être de :size caractères.',
'array' => 'Le champ :attribute doit contenir :size objets.',
],
"unique" => "Le champ :attribute est déjà utilisé.",
"url" => "Le format du champ :attribute est invalide.",
'unique' => 'Le champ :attribute est déjà utilisé.',
'url' => 'Le format du champ :attribute est invalide.',
/*
|--------------------------------------------------------------------------
@@ -99,6 +99,6 @@ return [
|
*/
'attributes' => [ ],
'attributes' => [],
];

59
app/lang/nl/cachet.php Normal file
View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Online',
2 => 'Verminderde prestaties',
3 => 'Gedeeltelijke storing',
4 => 'Grote storing',
],
],
// Incidents
'incidents' => [
'none' => 'Geen incidenten gemeld.',
'past' => 'Eerdere incidenten',
'previous_week' => 'Vorige week',
'next_week' => 'Volgende week',
'none' => 'Niets te melden.',
'scheduled' => 'Gepland onderhoud',
'scheduled_at' => ', gepland :timestamp',
'status' => [
0 => 'Gepland', // TODO: Hopefully remove this.
1 => 'Onderzoeken',
2 => 'Geïdentificeerd',
3 => 'Bekijken',
4 => 'Opgelost',
],
],
// Service Status
'service' => [
'good' => 'Alle systemen zijn online',
'bad' => 'Sommige systemen hebben problemen',
],
'api' => [
'regenerate' => 'API-sleutel hergenereren',
'revoke' => 'API-sleutel intrekken',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => 'Elk uur',
'daily' => 'Dagelijks',
'monthly' => 'Maandelijks',
],
],
// Other
'powered_by' => 'De statuspagina van :app is mogelijk gemaakt door <a href="https://cachethq.io">Cachet</a>.',
'about_this_site' => 'Over deze site',
'rss-feed' => 'RSS-feed',
'atom-feed' => 'Atom-feed',
'feed' => 'Statusfeed',
];

186
app/lang/nl/dashboard.php Normal file
View File

@@ -0,0 +1,186 @@
<?php
return [
'dashboard' => 'Dashboard',
// Incidents
'incidents' => [
'title' => 'Incidenten &amp; planning',
'incidents' => 'Incidenten',
'logged' => '{0} Er zijn geen incidenten, goed werk.|Je hebt één incident gemeld.|Je hebt <strong>:count</strong> incidenten gemeld.',
'incident-create-template' => 'Sjabloon aanmaken',
'incident-templates' => 'Incidentsjablonen',
'add' => [
'title' => 'Incident toevoegen',
'success' => 'Incident toegevoegd.',
'failure' => 'Er ging iets mis met het incident.',
],
'edit' => [
'title' => 'Incident bewerken',
'success' => 'Incident bijwerken.',
'failure' => 'Er ging iets mis met het incident.',
],
// Incident templates
'templates' => [
'title' => 'Incidentsjablonen',
'add' => [
'title' => 'Incidentsjabloon aanmaken',
'success' => 'Sjabloon aangemaakt.',
'failure' => 'Er ging iets mis met het incidentsjabloon.',
],
'edit' => [
'title' => 'Sjabloon bewerken',
'success' => 'Sjabloon is bijgewerkt!',
'failure' => 'Er ging iets mis bij het bijwerken van het incidentsjabloon.',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => 'Gepland onderhoud',
'scheduled_at' => 'Gepland op :timestamp',
'add' => [
'title' => 'Gepland onderhoud toevoegen',
'success' => 'Planning toegevoegd.',
'failure' => 'Er ging iets mis bij het toevoegen van de planning.',
],
'edit' => [
'title' => 'Gepland onderhoud bewerken',
'success' => 'Planning is bijgewerkt!',
'failure' => 'Er ging iets mis bij het bewerken van de planning.',
],
'delete' => [
'success' => 'De planning is verwijderd en zal niet worden getoond op je statuspagina.',
'failure' => 'De planning kon niet worden verwijderd. Probeer het nogmaals.',
],
],
// Components
'components' => [
'components' => 'Componenten',
'component_statuses' => 'Componentstatussen',
'listed_group' => 'Gegroepeerd onder :name',
'add' => [
'title' => 'Component toevoegen',
'message' => 'Je moet een component toevoegen.',
'success' => 'Component aangemaakt.',
'failure' => 'Er ging iets mis met de component.',
],
'edit' => [
'title' => 'Component bewerken',
'success' => 'Component bijgewerkt.',
'failure' => 'Er ging iets mis met de component.',
],
// Component groups
'groups' => [
'groups' => 'Componentgroep|Componentgroepen',
'add' => [
'title' => 'Componentgroep toevoegen',
'success' => 'Componentgroep toegevoegd.',
'failure' => 'Er ging iets mis met de componentgroep.',
],
'edit' => [
'title' => 'Componentgroep bewerken',
'success' => 'Componentgroep bijgewerkt.',
'failure' => 'Er ging iets mis met de componentgroep.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Metingen',
'add' => [
'title' => 'Meting aanmaken',
'success' => 'Meting aangemaakt.',
'failure' => 'Er ging iets mis met de meting.',
],
'edit' => [
'title' => 'Meting bewerken',
'success' => 'Meting bijgewerkt.',
'failure' => 'Er ging iets mis met de meting.',
],
],
// Team
'team' => [
'team' => 'Team',
'member' => 'Lid',
'profile' => 'Profiel',
'description' => 'Teamleden hebben de mogelijkheid om componenten en incidenten toe te voegen, aan te passen en te bewerken.',
'add' => [
'title' => 'Nieuw teamlid toevoegen',
'success' => 'Teamlid toegevoegd.',
'failure' => 'Er ging iets mis met de component.',
],
'edit' => [
'title' => 'Profiel bijwerken',
'success' => 'Profiel bijgewerkt.',
'failure' => 'Er ging iets mis met het bijwerken.',
],
],
// Settings
'settings' => [
'settings' => 'Instellingen',
'app-setup' => [
'app-setup' => 'Installatie applicatie',
'images-only' => 'Alleen afbeeldingen mogen worden geüpload.',
'too-big' => 'Het bestand dat je hebt geüpload is te groot. Upload een afbeelding kleinder dan :size',
],
'security' => [
'security' => 'Beveiliging',
'two-factor' => 'Gebruikers zonder authenticatie in twee stappen',
],
'stylesheet' => [
'stylesheet' => 'Stylesheet',
],
'theme' => [
'theme' => 'Thema',
],
'edit' => [
'success' => 'Instellingen opgeslagen.',
'failure' => 'Instellingen konden niet worden opgeslagen.',
],
],
// Login
'login' => [
'login' => 'Inloggen',
'logged_in' => 'Je bent ingelogd.',
'welcome' => 'Welkom terug!',
'two-factor' => 'Vul je token in.',
],
// Sidebar footer
'help' => 'Help',
'status_page' => 'Statuspagina',
'logout' => 'Uitloggen',
// Notifications
'notifications' => [
'notifications' => 'Meldingen',
'awesome' => 'Geweldig.',
'whoops' => 'Oeps.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Welkom bij Cachet',
'message' => 'Je statuspagina is bijna klaar! Je wilt misschien deze extra instellingen configureren',
'close' => 'Ga direct naar mijn dashboard',
'steps' => [
'component' => 'Componenten aanmaken',
'incident' => 'Incidenten aanmaken',
'customize' => 'Aanpassen',
'team' => 'Gebruikers toevoegen',
'api' => 'API-token genereren',
'two-factor' => 'Authenticatie in twee stappen',
],
],
];

16
app/lang/nl/errors.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'Die pagina is vermist geraakt!',
'message' => 'Sorry, maar de pagina die je zoekt is niet gevonden. Controleer de URL op fouten en probeer het nogmaals.',
'link' => 'Terug naar homepagina',
],
'unauthorized' => [
'code' => '401',
'title' => 'Ongeautoriseerd',
'message' => 'Sorry, maar je moet beheerdersrechten hebben om deze pagina te bekijken.',
'link' => 'Terug naar homepagina',
],
];

126
app/lang/nl/forms.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'E-mailadres',
'username' => 'Gebruikersnaam',
'password' => 'Wachtwoord',
'site_name' => 'Nama site',
'site_domain' => 'Domein site',
'site_timezone' => 'Selecteer je tijdzone',
'site_locale' => 'Selecteer je taal',
'enable_google2fa' => 'Google\'\s authenticatie in twee stappen inschakelen',
],
// Login form fields
'login' => [
'email' => 'E-mailadres',
'password' => 'Wachtwoord',
'2fauth' => 'Authenticatiecode',
'invalid' => 'Ongeldig e-mailadres of wachtwoord',
'invalid-token' => 'Ongeldige token',
],
// Incidents form fields
'incidents' => [
'name' => 'Naam',
'status' => 'Status',
'component' => 'Component',
'message' => 'Bericht',
'message-help' => 'Je mag ook Markdown gebruiken.',
'scheduled_at' => 'Voor wanneer is het onderhoud gepland?',
'templates' => [
'name' => 'Naam',
'template' => 'Sjabloon',
],
],
// Components form fields
'components' => [
'name' => 'Naam',
'status' => 'Status',
'group' => 'Groep',
'description' => 'Beschrijving',
'link' => 'Link',
'tags' => 'Tags',
'tags-help' => 'Komma gescheiden.',
'groups' => [
'name' => 'Naam',
],
],
// Metric form fields
'metrics' => [
'name' => 'Naam',
'suffix' => 'Achtervoegsel',
'description' => 'Beschrijving',
'description-help' => 'Je mag ook Markdown gebruiken.',
'display-chart' => 'Grafiek tonen op statuspagina?',
'default-value' => 'Standaardwaarde',
'calc_type' => 'Berekening van metingen',
'type_sum' => 'Som',
'type_avg' => 'Gemiddelde',
'points' => [
'value' => 'Waarde',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Naam site',
'site-url' => 'URL site',
'site-timezone' => 'Tijdzone site',
'site-locale' => 'Taal site',
'date-format' => 'Datumformaat',
'display-graphs' => 'Grafieken tonen op statuspagina?',
'about-this-page' => 'Over deze pagina',
'days-of-incidents' => 'Hoeveel dagen van incidenten tonen?',
'banner' => 'Bannerafbeelding',
'banner-help' => 'Het wordt aangeraden om geen bestanden groter dan 930px breed te uploaden.',
'google-analytics' => 'Google Analytics-code',
],
'security' => [
'allowed-domains' => 'Toegestane domeinen',
'allowed-domains-help' => 'Komma gescheiden. Het domein dat hierboven is ingesteld wordt standaard automatisch toegestaan.',
],
'stylesheet' => [
'custom-css' => 'Aangepaste stylesheet',
],
'theme' => [
'background-color' => 'Achtergrondkleur',
'text-color' => 'Tekstkleur',
],
],
'user' => [
'username' => 'Gebruikersnaam',
'email' => 'E-mailadres',
'password' => 'Wachtwoord',
'api-token' => 'API-token',
'api-token-help' => 'Het opnieuw genereren van je API-token zorgt ervoor dat bestaande applicaties geen toegang meer hebben tot Cachet.',
'2fa' => [
'help' => 'Het inschakelen van authenticatie in twee stappen verbetert de beveiliging van je account. Je zult <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google Authenticator</a> of een soortgelijke app op je mobiele apparaat moeten downloaden. Wanneer je inlogt, zal je worden gevraagd om een token op te geven die gegenereerd is door de app.',
],
],
// Buttons
'add' => 'Toevoegen',
'save' => 'Opslaan',
'update' => 'Bijwerken',
'create' => 'Aanmaken',
'edit' => 'Bewerken',
'delete' => 'Verwijderen',
'submit' => 'Versturen',
'cancel' => 'Annuleren',
'remove' => 'Verwijderen',
// Other
'optional' => '* Optioneel',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Vorige',
'next' => 'Volgende &raquo;',
];

22
app/lang/nl/reminders.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Wachtwoord moeten minimaal 6 tekens bevatten en overeenkomen met de bevestiging.',
'user' => 'We kunnen geen gebruiker vinden met dat e-mailadres.',
'token' => 'Dit wachtwoord-herstel-token is ongeldig.',
'sent' => 'Wachtwoordherinnering verstuurd!',
'reset' => 'Wachtwoord is hersteld!',
];

14
app/lang/nl/setup.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Installatie',
'title' => 'Installatie Cachet',
'service_details' => 'Servicedetails',
'status_page_setup' => 'Installatie statuspagina',
'show_support' => 'Steun voor Cachet tonen? <small>Plaatst een link in de footer naar Cachet.</small>',
'admin_account' => 'Beheerdersaccount',
'complete_setup' => 'Installatie voltooien',
'completed' => 'Cachet is met succes geconfigureerd!',
'finish_setup' => 'Ga naar dashboard',
'allow_tracking' => 'Anoniem gebruik tracken toestaan?',
];

106
app/lang/nl/validation.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'Het :attribute-veld moet true of false zijn.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'unique' => 'The :attribute has already been taken.',
'url' => 'Het :attribute-formaat is ongeldig.',
'timezone' => 'The :attribute must be a valid zone.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

59
app/lang/pl/cachet.php Normal file
View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Działa',
2 => 'Problemy wydajnościowe',
3 => 'Częściowa niedostępność',
4 => 'Poważna awaria',
],
],
// Incidents
'incidents' => [
'none' => 'Brak incydentów.',
'past' => 'Poprzednie incydenty',
'previous_week' => 'Poprzedni tydzień',
'next_week' => 'Następny tydzień',
'none' => 'Brak incydentów',
'scheduled' => 'Zapowiedziane prace',
'scheduled_at' => ', scheduled :timestamp',
'status' => [
0 => 'Planowy', // TODO: Hopefully remove this.
1 => 'Szukanie',
2 => 'Zidentyfikowany',
3 => 'Obserwacja',
4 => 'Naprawiony',
],
],
// Service Status
'service' => [
'good' => 'Wszystkie systemy sprawne.',
'bad' => 'Część systemów ma problemy.',
],
'api' => [
'regenerate' => 'Przegeneruj klucz API',
'revoke' => 'Odwołaj klucz API',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => 'Godzinowo',
'daily' => 'Dziennie',
'monthly' => 'Miesięcznie',
],
],
// Other
'powered_by' => ':app Status Page is powered by <a href="https://cachethq.io">Cachet</a>.',
'about_this_site' => 'O tej stronie',
'rss-feed' => 'RSS Feed',
'atom-feed' => 'Atom Feed',
'feed' => 'Status Feed',
];

186
app/lang/pl/dashboard.php Normal file
View File

@@ -0,0 +1,186 @@
<?php
return [
'dashboard' => 'Panel sterowania',
// Incidents
'incidents' => [
'title' => 'Incydenty i kalendarz',
'incidents' => 'Incydenty',
'logged' => '{0} Brak incydentów, gratulacje.| Zapisałeś jeden incydent.|Zapisałeś <strong>:count</strong> incydentów.',
'incident-create-template' => 'Utwórz szablon',
'incident-templates' => 'Szablony incydentów',
'add' => [
'title' => 'Dodaj incydent',
'success' => 'Incydent dodany.',
'failure' => 'Coś poszło nie tak z incydentem.',
],
'edit' => [
'title' => 'Aktualizuj incydent',
'success' => 'Incydent zaktualizowany.',
'failure' => 'Coś poszło nie tak z incydentem.',
],
// Incident templates
'templates' => [
'title' => 'Szablony incydentów',
'add' => [
'title' => 'Stwórz szablon incydentu.',
'success' => 'Szablon utworzony.',
'failure' => 'Coś poszło nie tak z szablonem incydentu.',
],
'edit' => [
'title' => 'Edytuj szablon',
'success' => 'Szablon został zaktualizowany!',
'failure' => 'Coś poszło nie tak przy aktualizacji szablonu.',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => 'Zaplanowana przerwa',
'scheduled_at' => 'Zaplanowana data :timestamp',
'add' => [
'title' => 'Dodaj planową przerwę',
'success' => 'Zaplanowana przerwa dodana.',
'failure' => 'Coś poszło nie tak przy dodawaniu przerwy.',
],
'edit' => [
'title' => 'Aktualizuj zaplanowaną przerwę',
'success' => 'Przerwa zaktualizowana!',
'failure' => 'Coś poszło nie tak przy aktualizacji przerwy.',
],
'delete' => [
'success' => 'Przerwa została skasowana i nie będzie pokazywana na stronie statusowej.',
'failure' => 'Nie można było skasować przerwy. Spróbuj ponownie.',
],
],
// Components
'components' => [
'components' => 'Komponenty',
'component_statuses' => 'Statusy komponentów',
'listed_group' => 'Zgrupowane pod :name',
'add' => [
'title' => 'Dodaj komponent',
'message' => 'Powinieneś doddać komponent.',
'success' => 'Komponent utworzony.',
'failure' => 'Coś poszło nie tak przy tworzeniu komponentu.',
],
'edit' => [
'title' => 'Edytuj komponent',
'success' => 'Komponent zaktualizowany.',
'failure' => 'Coś poszło nie tak przy aktualizacji komponent.',
],
// Component groups
'groups' => [
'groups' => 'Grupa komponenów|Grupy komponentów',
'add' => [
'title' => 'Dodaj grupę komponentów',
'success' => 'Grupa komponentów utworzona.',
'failure' => 'Coś poszło nie tak przy tworzeniu grupy.',
],
'edit' => [
'title' => 'Edytuj grupę komponentów',
'success' => 'Grupa komponentów zaktualizaowana.',
'failure' => 'Coś poszło nie tak przy aktualizacji grupy.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Metryki',
'add' => [
'title' => 'Utwórz metrykę',
'success' => 'Metryka utworzona.',
'failure' => 'Coś poszło nie tak z tworzeniem metryki.',
],
'edit' => [
'title' => 'Edytuj metrykę',
'success' => 'Metryka zaktualizowana.',
'failure' => 'Coś poszło nie tak przy aktualizacji metryki.',
],
],
// Team
'team' => [
'team' => 'Zespół',
'member' => 'Członek',
'profile' => 'Profil',
'description' => 'Członkowie zespołu będą mogli dodawać i modyfikować komponenty i incydenty.',
'add' => [
'title' => 'Dodaj nowego członka zespołu',
'success' => 'Dodano członka zespołu.',
'failure' => 'Coś poszło nie tak z dodawaniem do zespołu.',
],
'edit' => [
'title' => 'Aktualizuj profil',
'success' => 'Profil zaktualizowany.',
'failure' => 'Coś poszło nie tak przy aktualizacji.',
],
],
// Settings
'settings' => [
'settings' => 'Ustawienia',
'app-setup' => [
'app-setup' => 'Ustawienia aplikacji',
'images-only' => 'Można wgrywać tylko pliki graficzne.',
'too-big' => 'Wgrany plik jest zbyt duży. Wgraj plik mnijeszy niż :size',
],
'security' => [
'security' => 'Bezpieczeństwo',
'two-factor' => 'Użytkownicy bez autentykacji dwuetapowej',
],
'stylesheet' => [
'stylesheet' => 'Stylesheet',
],
'theme' => [
'theme' => 'Skórka',
],
'edit' => [
'success' => 'Ustawienia zapisane.',
'failure' => 'Ustawienia nie mogły być zapisane.',
],
],
// Login
'login' => [
'login' => 'Zaloguj',
'logged_in' => 'Jesteś zalogowany.',
'welcome' => 'Witam ponownie!',
'two-factor' => 'Wpisz swój kod.',
],
// Sidebar footer
'help' => 'Pomoc',
'status_page' => 'Strona statusu',
'logout' => 'Wyloguj',
// Notifications
'notifications' => [
'notifications' => 'Powiadomienia',
'awesome' => 'Super.',
'whoops' => 'Ojej.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Witamy w Cachet',
'message' => 'Twoja strona statusowa jest już prawie gotowa! Możesz skonfigurować dodatkowe ustawienia',
'close' => 'Przejdź do mojego panelu',
'steps' => [
'component' => 'Utwórz komponenty',
'incident' => 'Utwórz incydenty',
'customize' => 'Personalizacja',
'team' => 'Dodaj użytkowników',
'api' => 'Wygeneruj token API',
'two-factor' => 'Autentykacja dwuetapowa',
],
],
];

16
app/lang/pl/errors.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'That page went missing!',
'message' => 'Sorry, but the page you are looking for has not been found. Check the URL for errors and try again.',
'link' => 'Return to homepage',
],
'unauthorized' => [
'code' => '401',
'title' => 'Unauthorized',
'message' => 'Sorry, you need admin privileges to see this page.',
'link' => 'Return to homepage',
],
];

126
app/lang/pl/forms.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'Email',
'username' => 'Użytkownik',
'password' => 'Hasło',
'site_name' => 'Nazwa strony',
'site_domain' => 'Domena strony',
'site_timezone' => 'Wybierz swoją strefę czasową',
'site_locale' => 'Wybierz swól język',
'enable_google2fa' => 'Włącz dwuetapową autentykację Google',
],
// Login form fields
'login' => [
'email' => 'Email',
'password' => 'Hasło',
'2fauth' => 'Kod autentykacji',
'invalid' => 'Nieprawidłowy email lub hasło',
'invalid-token' => 'Nieprawidłowy kod',
],
// Incidents form fields
'incidents' => [
'name' => 'Nazwa',
'status' => 'Status',
'component' => 'Komponent',
'message' => 'Wiadomość',
'message-help' => 'Możesz skorzystać z Markdown.',
'scheduled_at' => 'Na kiedy zaplanować przerwę?',
'templates' => [
'name' => 'Nazwa',
'template' => 'Szablon',
],
],
// Components form fields
'components' => [
'name' => 'Nazwa',
'status' => 'Status',
'group' => 'Grupa',
'description' => 'Opis',
'link' => 'Link',
'tags' => 'Tagi',
'tags-help' => 'Rozdzielone przecinkiem.',
'groups' => [
'name' => 'Nazwa',
],
],
// Metric form fields
'metrics' => [
'name' => 'Nazwa',
'suffix' => 'Jednostka',
'description' => 'Opis',
'description-help' => 'Możesz skorzystać z Markdown.',
'display-chart' => 'Wyświetlać wykres na panelu głównym?',
'default-value' => 'Domyślna wartość',
'calc_type' => 'Sposób kalkulacji metryki',
'type_sum' => 'Suma',
'type_avg' => 'Średnia',
'points' => [
'value' => 'Wartość',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Nazwa strony',
'site-url' => 'Adres URL strony',
'site-timezone' => 'Strefa czasowa',
'site-locale' => 'Język',
'date-format' => 'Format daty',
'display-graphs' => 'Wyświetlać wykresy na panelu głównym?',
'about-this-page' => 'O tej stronie',
'days-of-incidents' => 'Ile dni incydentów pokazywać?',
'banner' => 'Obrazek z logo',
'banner-help' => 'Zaleca się wrzuać pliki nie szersze niż 930px.',
'google-analytics' => 'Kod Google Analytics',
],
'security' => [
'allowed-domains' => 'Dozwolone domenyw',
'allowed-domains-help' => 'Oddzielone przecinkiem. Domena ustawiona powyżej jest dozwolona domyślnie.',
],
'stylesheet' => [
'custom-css' => 'Własny Stylesheet',
],
'theme' => [
'background-color' => 'Kolor tła',
'text-color' => 'Kolor tekstu',
],
],
'user' => [
'username' => 'Nazwa użytkownika',
'email' => 'Email',
'password' => 'Hasło',
'api-token' => 'Klucz API',
'api-token-help' => 'Zregenerowanie twojego klucza API uniemożliwi dostęp istniejących aplikacji do Cachet.',
'2fa' => [
'help' => 'Aktywacja dwuetapowej autentykacji zwiększą bezpieczeństwo twojego konta. Musisz ściągnąć <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google Authenticator</a> lub podobną aplikację na swój telefon. Przy logowaniu będziesz proszony o podanie kodu wygenerowanego przez tą aplikację.',
],
],
// Buttons
'add' => 'Dodaj',
'save' => 'Zapisz',
'update' => 'Aktualizuj',
'create' => 'Swtórz',
'edit' => 'Edytuj',
'delete' => 'Skasuj',
'submit' => 'Wyślij',
'cancel' => 'Anuluj',
'remove' => 'Usuń',
// Other
'optional' => '* Opcjonalny',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Poprzednia',
'next' => 'Następna &raquo;',
];

22
app/lang/pl/reminders.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Hasła muszą mieć przynajmniej 6 znaków i być pasować do potwierdzenia.',
'user' => 'Nie możemy znaleźć użytkownia o tym adresie email.',
'token' => 'Token resetu hasła jest nieprawidłowyw.',
'sent' => 'Wysłano przypomnienie hasła!',
'reset' => 'Hasło zostało zresetowane!',
];

14
app/lang/pl/setup.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Konfiguracja',
'title' => 'Skonfiguruj Cachet',
'service_details' => 'Szczegóły serwisu',
'status_page_setup' => 'Konfiguracja strony statusowej',
'show_support' => 'Okaż wsparcie dla Cachet? <small>Umieść link w stopce wskazujący na Cachet.</small>',
'admin_account' => 'Konto administratora',
'complete_setup' => 'Konfiguracja zakończona',
'completed' => 'Cachet został skonfigurowany pomyślnie!',
'finish_setup' => 'Przejdź do panelu',
'allow_tracking' => 'Zezwolić na anonimowe śledzenie wykorzystania?',
];

106
app/lang/pl/validation.php Normal file
View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'unique' => 'The :attribute has already been taken.',
'url' => 'The :attribute format is invalid.',
'timezone' => 'The :attribute must be a valid zone.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -83,8 +83,8 @@ return [
'about-this-page' => 'Sobre esta página',
'days-of-incidents' => 'Quantos dias de incidentes para mostrar?',
'banner' => 'Imagem do banner',
'banner-help' => "É recomendável que você faça upload de arquivos menores que 930px .",
'google-analytics' => "Código do Google Analytics",
'banner-help' => 'É recomendável que você faça upload de arquivos menores que 930px .',
'google-analytics' => 'Código do Google Analytics',
],
'security' => [
'allowed-domains' => 'Domínios permitidos',

View File

@@ -13,65 +13,65 @@ return [
|
*/
"accepted" => "O campo :attribute deve ser aceito.",
"active_url" => "O campo :attribute não é uma URL válida.",
"after" => "O campo :attribute deverá conter uma data posterior a :date.",
"alpha" => "O campo :attribute deverá conter apenas letras.",
"alpha_dash" => "O campo :attribute só pode conter letras, números, e hifens.",
"alpha_num" => "O campo :attribute só pode conter letras e números.",
"array" => "O campo :attribute deve ser um vetor.",
"before" => "O campo :attribute deverá conter uma data anterior a :date.",
"between" => [
"numeric" => "O campo :attribute deverá ter um valor entre :min - :max.",
"file" => "O campo :attribute deverá ter um tamanho entre :min - :max kilobytes.",
"string" => "O campo :attribute deverá conter entre :min - :max caracteres.",
"array" => "O campo :attribute deve ter entre :min e :max itens.",
'accepted' => 'O campo :attribute deve ser aceito.',
'active_url' => 'O campo :attribute não é uma URL válida.',
'after' => 'O campo :attribute deverá conter uma data posterior a :date.',
'alpha' => 'O campo :attribute deverá conter apenas letras.',
'alpha_dash' => 'O campo :attribute só pode conter letras, números, e hifens.',
'alpha_num' => 'O campo :attribute só pode conter letras e números.',
'array' => 'O campo :attribute deve ser um vetor.',
'before' => 'O campo :attribute deverá conter uma data anterior a :date.',
'between' => [
'numeric' => 'O campo :attribute deverá ter um valor entre :min - :max.',
'file' => 'O campo :attribute deverá ter um tamanho entre :min - :max kilobytes.',
'string' => 'O campo :attribute deverá conter entre :min - :max caracteres.',
'array' => 'O campo :attribute deve ter entre :min e :max itens.',
],
"boolean" => "O campo :attribute deve ser verdadeiro ou falso.",
"confirmed" => "A confirmação para o campo :attribute não coincide.",
"date" => "O :attribute não é uma data válida.",
"date_format" => "O :attribute não corresponde ao formato :format.",
"different" => "O :attribute e :other devem ser diferentes.",
"digits" => "O campo :attribute deverá conter :digits dígitos.",
"digits_between" => "O :attribute deve ter entre :min e :max dígitos.",
"email" => "A: attribute deve ser um endereço de email válido.",
"exists" => "O :attribute selecionado é inválido.",
"image" => "O :attribute deve ser uma imagem.",
"in" => "O :attribute selecionado é inválido.",
"integer" => "O :attribute deve ser um número inteiro.",
"ip" => "O :attribute deve ser um endereço de IP válido.",
"max" => [
"numeric" => "O :attribute não pode ser maior do que :max.",
"file" => "O campo :attribute não deverá ter um tamanho superior a :max kilobytes.",
"string" => "O :attribute não pode ser maior do que :max caracteres.",
"array" => "A: atributo não pode ter mais de que :max itens.",
'boolean' => 'O campo :attribute deve ser verdadeiro ou falso.',
'confirmed' => 'A confirmação para o campo :attribute não coincide.',
'date' => 'O :attribute não é uma data válida.',
'date_format' => 'O :attribute não corresponde ao formato :format.',
'different' => 'O :attribute e :other devem ser diferentes.',
'digits' => 'O campo :attribute deverá conter :digits dígitos.',
'digits_between' => 'O :attribute deve ter entre :min e :max dígitos.',
'email' => 'A: attribute deve ser um endereço de email válido.',
'exists' => 'O :attribute selecionado é inválido.',
'image' => 'O :attribute deve ser uma imagem.',
'in' => 'O :attribute selecionado é inválido.',
'integer' => 'O :attribute deve ser um número inteiro.',
'ip' => 'O :attribute deve ser um endereço de IP válido.',
'max' => [
'numeric' => 'O :attribute não pode ser maior do que :max.',
'file' => 'O campo :attribute não deverá ter um tamanho superior a :max kilobytes.',
'string' => 'O :attribute não pode ser maior do que :max caracteres.',
'array' => 'A: atributo não pode ter mais de que :max itens.',
],
"mimes" => "O :attribute deve ser um arquivo do tipo: :values.",
"min" => [
"numeric" => "O :attribute deve ter pelo menos :min.",
"file" => "O :attribute deve ter pelo menos :min kilobytes.",
"string" => "O :attribute deve ter pelo menos :min caracteres.",
"array" => "O :attribute deve ter pelo menos :min itens.",
'mimes' => 'O :attribute deve ser um arquivo do tipo: :values.',
'min' => [
'numeric' => 'O :attribute deve ter pelo menos :min.',
'file' => 'O :attribute deve ter pelo menos :min kilobytes.',
'string' => 'O :attribute deve ter pelo menos :min caracteres.',
'array' => 'O :attribute deve ter pelo menos :min itens.',
],
"not_in" => "O :attribute selecionado é inválido.",
"numeric" => "O :attribute deve ser um número.",
"regex" => "O formato de :attribute é inválido.",
"required" => "O campo de :attribute é obrigatório.",
"required_if" => "O campo de :attribute é obrigatório quando :other é :value.",
"required_with" => "O campo :attribute é obrigatório quando :values está presente.",
"required_with_all" => "O campo :attribute é obrigatório quando :values está presente.",
"required_without" => "O campo de :attribute é obrigatório quando :values não está presente.",
"required_without_all" => "O campo de :attribute é obrigatório quando qualquer um dos :values estão presentes.",
"same" => "O :attribute e :other devem corresponder.",
"size" => [
"numeric" => "O :attribute deve ser :size.",
"file" => "O :attribute deve ter :size kilobytes.",
"string" => "O :attribute deve ter :size caracteres.",
"array" => "O :attribute deve ter :size itens.",
'not_in' => 'O :attribute selecionado é inválido.',
'numeric' => 'O :attribute deve ser um número.',
'regex' => 'O formato de :attribute é inválido.',
'required' => 'O campo de :attribute é obrigatório.',
'required_if' => 'O campo de :attribute é obrigatório quando :other é :value.',
'required_with' => 'O campo :attribute é obrigatório quando :values está presente.',
'required_with_all' => 'O campo :attribute é obrigatório quando :values está presente.',
'required_without' => 'O campo de :attribute é obrigatório quando :values não está presente.',
'required_without_all' => 'O campo de :attribute é obrigatório quando qualquer um dos :values estão presentes.',
'same' => 'O :attribute e :other devem corresponder.',
'size' => [
'numeric' => 'O :attribute deve ser :size.',
'file' => 'O :attribute deve ter :size kilobytes.',
'string' => 'O :attribute deve ter :size caracteres.',
'array' => 'O :attribute deve ter :size itens.',
],
"unique" => "O :attribute já existe.",
"url" => "O formato de :attribute é inválido.",
"timezone" => "O :attribute deve ser uma zona válida.",
'unique' => 'O :attribute já existe.',
'url' => 'O formato de :attribute é inválido.',
'timezone' => 'O :attribute deve ser uma zona válida.',
/*
|--------------------------------------------------------------------------

View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => '正常运行',
2 => '性能问题',
3 => '部分停止运作',
4 => '停止运作',
],
],
// Incidents
'incidents' => [
'none' => '沒有任何事件。',
'past' => '以前的事件',
'previous_week' => '上星期',
'next_week' => '下星期',
'none' => '沒有任何报告',
'scheduled' => '排程维护',
'scheduled_at' => ',於:timestamp',
'status' => [
0 => '排程中的维护', // TODO: Hopefully remove this.
1 => '调查中',
2 => '已辨明',
3 => '警戒中',
4 => '已修复',
],
],
// Service Status
'service' => [
'good' => '全部系统运作正常。',
'bad' => '部分系统出现异常。',
],
'api' => [
'regenerate' => '重新生成 API 密钥',
'revoke' => '撤销 API 密钥',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => '每小时',
'daily' => '每天',
'monthly' => '每月',
],
],
// Other
'powered_by' => ':app 状态页是由 <a href="https://cachethq.io">Cachet</a> 提供。',
'about_this_site' => '关于本站',
'rss-feed' => 'RSS 订阅',
'atom-feed' => 'Atom 订阅',
'feed' => 'Status 订阅',
];

View File

@@ -0,0 +1,186 @@
<?php
return [
'dashboard' => '仪表板',
// Incidents
'incidents' => [
'title' => '事件与排程',
'incidents' => '事件',
'logged' => '{0} 做得好,没有任何事件。|你记录了一个事件。|你回报了 <strong>:count</strong> 个事件。',
'incident-create-template' => '新增模板',
'incident-templates' => '事件模板',
'add' => [
'title' => '新增事件',
'success' => '事件新增成功。',
'failure' => '新增事件时遇到一些问题。',
],
'edit' => [
'title' => '修改事件',
'success' => '事件更新成功。',
'failure' => '更新事件时遇到一些问题。',
],
// Incident templates
'templates' => [
'title' => '事件模板',
'add' => [
'title' => '新增事件模板',
'success' => '事件模板新增成功。',
'failure' => '新增事件模板时遇到一些问题。',
],
'edit' => [
'title' => '修改事件模板',
'success' => '事件模板更新成功!',
'failure' => '更新事件模板时遇到一些问题。',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => '排程维护',
'scheduled_at' => '排程于 :timestamp',
'add' => [
'title' => '新增排程维护',
'success' => '排程维护新增成功。',
'failure' => '新增排程维护时遇到一些问题。',
],
'edit' => [
'title' => '修改排程维护',
'success' => '排程维护修改成功!',
'failure' => '修改排程维护时遇到一些问题。',
],
'delete' => [
'success' => '成功删除了排程维护!該排程维护將不會出現在状态页上。',
'failure' => '无法刪除該排程维护。请稍后再试。',
],
],
// Components
'components' => [
'components' => '组件',
'component_statuses' => '组件状态',
'listed_group' => '屬于:name组',
'add' => [
'title' => '新增组件',
'message' => '你应该先新增一个组件。',
'success' => '组件新增成功。',
'failure' => '新增组件时遇到一些问题。',
],
'edit' => [
'title' => '修改组件',
'success' => '组件修改成功。',
'failure' => '修改组件时遇到一些问题。',
],
// Component groups
'groups' => [
'groups' => '组件组|组件组',
'add' => [
'title' => '新增组件组',
'success' => '组件组新增成功。',
'failure' => '新增组件组时遇到一些问题。',
],
'edit' => [
'title' => '修改组件组',
'success' => '组件组修改成功。',
'failure' => '修改组件组时遇到一些问题。',
],
],
],
// Metrics
'metrics' => [
'metrics' => '指标',
'add' => [
'title' => '新增指标',
'success' => '指标新增成功。',
'failure' => '新增指标时遇到一些问题。',
],
'edit' => [
'title' => '修改指标',
'success' => '指标修改成功。',
'failure' => '修改指标时遇到一些问题。',
],
],
// Team
'team' => [
'team' => '团队',
'member' => '成员',
'profile' => '个人档案',
'description' => '团队成员可以新增、修改、或更新组件和事件。',
'add' => [
'title' => '新增团队成员',
'success' => '成功新增团队成员。',
'failure' => '新增团队成员时遇到一些问题。',
],
'edit' => [
'title' => '修改个人档案',
'success' => '成功修改个人档案。',
'failure' => '更新时遇到一些问题。',
],
],
// Settings
'settings' => [
'settings' => '设置',
'app-setup' => [
'app-setup' => '应用程序设置',
'images-only' => '你只能上载图片。',
'too-big' => '档案大小过大。请尝试上载一张大小小于 :size 的图片。',
],
'security' => [
'security' => '安全',
'two-factor' => '下列用户没有使用双重认证',
],
'stylesheet' => [
'stylesheet' => '样式表',
],
'theme' => [
'theme' => '主题',
],
'edit' => [
'success' => '设置已储存。',
'failure' => '设置储存失败。',
],
],
// Login
'login' => [
'login' => '登录',
'logged_in' => '你已经登录。',
'welcome' => '欢迎回来!',
'two-factor' => '请输入令牌。',
],
// Sidebar footer
'help' => '帮助',
'status_page' => '状态页',
'logout' => '退出',
// Notifications
'notifications' => [
'notifications' => '通知',
'awesome' => '太好了。',
'whoops' => '哎呀。',
],
// Welcome modal
'welcome' => [
'welcome' => '欢迎来到 Cachet',
'message' => '你的状态页快准备好了!不过你也许想先调整一下下列设置。',
'close' => '直接前往仪表板',
'steps' => [
'component' => '新增组件',
'incident' => '新增事件',
'customize' => '定制化',
'team' => '新增用戶',
'api' => '生成 API 密钥',
'two-factor' => '两步验证',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => '找不到页面',
'message' => '抱歉,你所请求的页面并不存在。请检查你的 URL 是否正确并再试一次。',
'link' => '回到主页',
],
'unauthorized' => [
'code' => '401',
'title' => '未经授权',
'message' => '抱歉,你需要管理员权限方可浏览本页面。',
'link' => '回到主页',
],
];

126
app/lang/zh-Hans/forms.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => '电邮地址',
'username' => '用戶名',
'password' => '密码',
'site_name' => '网站名称',
'site_domain' => '网站域名',
'site_timezone' => '选择你的时區',
'site_locale' => '选择你的语言',
'enable_google2fa' => '启用 Google 两步验证',
],
// Login form fields
'login' => [
'email' => '电邮地址',
'password' => '密码',
'2fauth' => '令牌',
'invalid' => '错误的电邮地址或密码',
'invalid-token' => '错误的令牌',
],
// Incidents form fields
'incidents' => [
'name' => '名称',
'status' => '状态',
'component' => '组件',
'message' => '信息',
'message-help' => '你可以使用 Markdown 。',
'scheduled_at' => '排期在什么时候進行维护?',
'templates' => [
'name' => '名称',
'template' => '模板',
],
],
// Components form fields
'components' => [
'name' => '名称',
'status' => '状态',
'group' => '组別',
'description' => '描述',
'link' => '连结',
'tags' => '标签',
'tags-help' => '请以半角逗号分隔。',
'groups' => [
'name' => '名称',
],
],
// Metric form fields
'metrics' => [
'name' => '名称',
'suffix' => '後綴',
'description' => '描述',
'description-help' => '你可以使用 Markdown 。',
'display-chart' => '在状态页上显示图表?',
'default-value' => '默认值',
'calc_type' => '指标的计算方法',
'type_sum' => '总和',
'type_avg' => '平均',
'points' => [
'value' => '值',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => '网站名称',
'site-url' => '网站 URL',
'site-timezone' => '网站时區',
'site-locale' => '网站语言',
'date-format' => '日期格式',
'display-graphs' => '在状态页上显示图片?',
'about-this-page' => '关于本站',
'days-of-incidents' => '显示多少天前的事件?',
'banner' => '图片横幅',
'banner-help' => '横幅宽度建议少于 930px 。',
'google-analytics' => 'Google Analytics 代码',
],
'security' => [
'allowed-domains' => '容许访问的域名',
'allowed-domains-help' => '请以半角逗号分隔。以上域名将会自动允许访问。',
],
'stylesheet' => [
'custom-css' => '自定义样式表',
],
'theme' => [
'background-color' => '背景颜色',
'text-color' => '文字颜色',
],
],
'user' => [
'username' => '用户名',
'email' => '电邮地址',
'password' => '密码',
'api-token' => 'API 密钥',
'api-token-help' => '重新生成 API 密钥将会导致现存的应用程式无法访问 Cachet 。',
'2fa' => [
'help' => '启用两步认证会使你的帐户更安全。您需要下载<a href="https://support.google.com/accounts/answer/1066447?hl=zh-hant">Google Authenticator</a> 或类似的应用程式到您的设备上。启用后,你需要提供由该应用程序生成的令牌方可登录。',
],
],
// Buttons
'add' => '增加',
'save' => '储存',
'update' => '更新',
'create' => '新增',
'edit' => '修改',
'delete' => '删除',
'submit' => '提交',
'cancel' => '取消',
'remove' => '删除',
// Other
'optional' => '* 可选项目',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; 前一页',
'next' => '后一页 &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => '密码必须至少有六个字符,而两次输入的密码也必须匹配。',
'user' => '无法找到拥有该电邮地址的用戶。',
'token' => '无效的密码重置令牌。',
'sent' => '已发送密码重置邮件。',
'reset' => '成功重置密码。',
];

View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => '安装',
'title' => '安裝 Cachet',
'service_details' => '服务详细信息',
'status_page_setup' => '設置状态页面',
'show_support' => '希望支持 Cachet 嗎? <small>在页面底部放置 Cachet 的连结。</small>',
'admin_account' => '管理员帳戶',
'complete_setup' => '完成安裝',
'completed' => '成功安裝 Cachet ',
'finish_setup' => '前往仪表板',
'allow_tracking' => '允许匿名统计?',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'unique' => 'The :attribute has already been taken.',
'url' => 'The :attribute format is invalid.',
'timezone' => 'The :attribute must be a valid zone.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => '正常運行',
2 => '效能問題',
3 => '部分停止運作',
4 => '停止運作',
],
],
// Incidents
'incidents' => [
'none' => '沒有任何事件。',
'past' => '以前的事件',
'previous_week' => '上星期',
'next_week' => '下星期',
'none' => '沒有任何報告',
'scheduled' => '排程維護',
'scheduled_at' => ',於:timestamp',
'status' => [
0 => '排程中的維護', // TODO: Hopefully remove this.
1 => '調查中',
2 => '已辨明',
3 => '警戒中',
4 => '已修復',
],
],
// Service Status
'service' => [
'good' => '全部系統運作正常。',
'bad' => '部分系統出現異常。',
],
'api' => [
'regenerate' => '重新生成 API 密鑰',
'revoke' => '撤銷 API 密鑰',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => '每小時',
'daily' => '每天',
'monthly' => '每月',
],
],
// Other
'powered_by' => ':app 狀態頁是由 <a href="https://cachethq.io">Cachet</a> 提供。',
'about_this_site' => '關於本站',
'rss-feed' => 'RSS 訂閱',
'atom-feed' => 'Atom 訂閱',
'feed' => 'Status 訂閱',
];

View File

@@ -0,0 +1,186 @@
<?php
return [
'dashboard' => '儀表板',
// Incidents
'incidents' => [
'title' => '事件與排程',
'incidents' => '事件',
'logged' => '{0} 做得好,沒有任何事件。|你記錄了一個事件。|你回報了 <strong>:count</strong> 個事件。',
'incident-create-template' => '新增模板',
'incident-templates' => '事件模板',
'add' => [
'title' => '新增事件',
'success' => '事件新增成功。',
'failure' => '新增事件時遇到一些問題。',
],
'edit' => [
'title' => '修改事件',
'success' => '事件更新成功。',
'failure' => '更新事件時遇到一些問題。',
],
// Incident templates
'templates' => [
'title' => '事件模板',
'add' => [
'title' => '新增事件模板',
'success' => '事件模板新增成功。',
'failure' => '新增事件模板時遇到一些問題。',
],
'edit' => [
'title' => '修改事件模板',
'success' => '事件模板更新成功!',
'failure' => '更新事件模板時遇到一些問題。',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => '排程維護',
'scheduled_at' => '排程於 :timestamp',
'add' => [
'title' => '新增排程維護',
'success' => '排程維護新增成功。',
'failure' => '新增排程維護時遇到一些問題。',
],
'edit' => [
'title' => '修改排程維護',
'success' => '排程維護修改成功!',
'failure' => '修改排程維護時遇到一些問題。',
],
'delete' => [
'success' => '成功删除了排程維護!該排程維護將不會出現在狀態頁上。',
'failure' => '無法刪除該排程維護。請稍後再試。',
],
],
// Components
'components' => [
'components' => '組件',
'component_statuses' => '組件狀態',
'listed_group' => '屬於:name組',
'add' => [
'title' => '新增組件',
'message' => '你應該先新增一個組件。',
'success' => '組件新增成功。',
'failure' => '新增組件時遇到一些問題。',
],
'edit' => [
'title' => '修改組件',
'success' => '組件修改成功。',
'failure' => '修改組件時遇到一些問題。',
],
// Component groups
'groups' => [
'groups' => '組件組|組件組',
'add' => [
'title' => '新增組件組',
'success' => '組件組新增成功。',
'failure' => '新增組件組時遇到一些問題。',
],
'edit' => [
'title' => '修改組件組',
'success' => '組件組修改成功。',
'failure' => '修改組件組時遇到一些問題。',
],
],
],
// Metrics
'metrics' => [
'metrics' => '指標',
'add' => [
'title' => '新增指標',
'success' => '指標新增成功。',
'failure' => '新增指標時遇到一些問題。',
],
'edit' => [
'title' => '修改指標',
'success' => '指標修改成功。',
'failure' => '修改指標時遇到一些問題。',
],
],
// Team
'team' => [
'team' => '團隊',
'member' => '成員',
'profile' => '個人檔案',
'description' => '團隊成員可以新增、修改、或更新組件和事件。',
'add' => [
'title' => '新增團隊成員',
'success' => '成功新增團隊成員。',
'failure' => '新增團隊成員時遇到一些問題。',
],
'edit' => [
'title' => '修改個人檔案',
'success' => '成功修改個人檔案。',
'failure' => '更新時遇到一些問題。',
],
],
// Settings
'settings' => [
'settings' => '設定',
'app-setup' => [
'app-setup' => '應用程式設定',
'images-only' => '你只能上載圖片。',
'too-big' => '檔案大小過大。請嘗試上載一張大小小於 :size 的圖片。',
],
'security' => [
'security' => '安全',
'two-factor' => '下列用戶未使用雙重認證',
],
'stylesheet' => [
'stylesheet' => '樣式表',
],
'theme' => [
'theme' => '主題',
],
'edit' => [
'success' => '設定已儲存。',
'failure' => '設定儲存失敗。',
],
],
// Login
'login' => [
'login' => '登錄',
'logged_in' => '你已經登錄。',
'welcome' => '歡迎回來!',
'two-factor' => '請輸入驗證碼。',
],
// Sidebar footer
'help' => '幫助',
'status_page' => '狀態頁',
'logout' => '登出',
// Notifications
'notifications' => [
'notifications' => '通知',
'awesome' => '太好了。',
'whoops' => '唉呀。',
],
// Welcome modal
'welcome' => [
'welcome' => '歡迎來到 Cachet',
'message' => '你的狀態頁快準備好了!不過你也許先想調整一下以下設定。',
'close' => '直接前往儀表板',
'steps' => [
'component' => '新增組件',
'incident' => '新增事件',
'customize' => '定制化',
'team' => '新增用戶',
'api' => '生成 API 密鑰',
'two-factor' => '兩步驗證',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => '找不到頁面',
'message' => '抱歉,你所請求的頁面並不存在。請檢查你的 URL 是否正確並再試一次。',
'link' => '返回主頁',
],
'unauthorized' => [
'code' => '401',
'title' => '未經授權',
'message' => '抱歉,你需要管理員權限方可瀏覽本頁面。',
'link' => '返回主頁',
],
];

126
app/lang/zh-Hant/forms.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => '電郵地址',
'username' => '用戶名',
'password' => '密碼',
'site_name' => '網站名稱',
'site_domain' => '網站域名',
'site_timezone' => '選擇你的時區',
'site_locale' => '選擇你的語言',
'enable_google2fa' => '啟用 Google 兩步驗證',
],
// Login form fields
'login' => [
'email' => '電郵地址',
'password' => '密碼',
'2fauth' => '驗證碼',
'invalid' => '錯誤的電郵地址或密碼',
'invalid-token' => '錯誤的驗證碼',
],
// Incidents form fields
'incidents' => [
'name' => '名稱',
'status' => '狀態',
'component' => '組件',
'message' => '信息',
'message-help' => '你可以使用 Markdown 。',
'scheduled_at' => '排期在什麼時候進行維護?',
'templates' => [
'name' => '名稱',
'template' => '模板',
],
],
// Components form fields
'components' => [
'name' => '名稱',
'status' => '狀態',
'group' => '組別',
'description' => '描述',
'link' => '連結',
'tags' => '標籤',
'tags-help' => '請以半角逗號分隔。',
'groups' => [
'name' => '名稱',
],
],
// Metric form fields
'metrics' => [
'name' => '名稱',
'suffix' => '後綴',
'description' => '描述',
'description-help' => '你可以使用 Markdown 。',
'display-chart' => '在狀態頁上顯示圖表?',
'default-value' => '默認值',
'calc_type' => '指標的計算方法',
'type_sum' => '總和',
'type_avg' => '平均',
'points' => [
'value' => '值',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => '網站名稱',
'site-url' => '網站 URL',
'site-timezone' => '網站時區',
'site-locale' => '網站語言',
'date-format' => '日期格式',
'display-graphs' => '在狀態頁上顯示圖片?',
'about-this-page' => '關於本站',
'days-of-incidents' => '顯示多少天前的事件?',
'banner' => '圖片橫幅',
'banner-help' => '橫幅寬度建議少於 930px 。',
'google-analytics' => 'Google Analytics 代碼',
],
'security' => [
'allowed-domains' => '容許訪問的域名',
'allowed-domains-help' => '請以半角逗號分隔。以上域名將會自動允許訪問。',
],
'stylesheet' => [
'custom-css' => '自定義樣式表',
],
'theme' => [
'background-color' => '背景顏色',
'text-color' => '文字顏色',
],
],
'user' => [
'username' => '用戶名',
'email' => '電郵地址',
'password' => '密碼',
'api-token' => 'API 密鑰',
'api-token-help' => '重新生成 API 密鑰將會導致現存的應用程序無法訪問 Cachet 。',
'2fa' => [
'help' => '啟用兩步認證會使得你的賬戶更加安全。您需要下載 <a href="https://support.google.com/accounts/answer/1066447?hl=zh-hant">Google Authenticator</a> 或類似的應用程序到您的設備上。啓用後,你需要提供由該應用程序生成的驗證碼方可登錄。',
],
],
// Buttons
'add' => '增加',
'save' => '儲存',
'update' => '更新',
'create' => '新增',
'edit' => '修改',
'delete' => '刪除',
'submit' => '提交',
'cancel' => '取消',
'remove' => '刪除',
// Other
'optional' => '* 可選項目',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; 前一頁',
'next' => '後一頁 &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => '密碼必須至少有六個字符,而兩次輸入的密碼也必須匹配。',
'user' => '無法找到擁有該電郵地址的用戶。',
'token' => '無效的密碼重置令牌。',
'sent' => '已發送密碼重置郵件。',
'reset' => '成功重置密碼。',
];

View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => '安裝',
'title' => '安裝 Cachet',
'service_details' => '服務詳細信息',
'status_page_setup' => '設置狀態頁面',
'show_support' => '希望支持 Cachet 嗎? <small>在頁面底部放置 Cachet 的連結。</small>',
'admin_account' => '管理員帳戶',
'complete_setup' => '完成安裝',
'completed' => '成功安裝 Cachet ',
'finish_setup' => '前往儀表板',
'allow_tracking' => '允許匿名統計?',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'unique' => 'The :attribute has already been taken.',
'url' => 'The :attribute format is invalid.',
'timezone' => 'The :attribute must be a valid zone.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -10,6 +10,6 @@ Route::group(['before' => 'has_setting:app_name', 'namespace' => 'CachetHQ\Cache
});
Route::group(['namespace' => 'CachetHQ\Cachet\Http\Controllers'], function () {
Route::get('/atom', 'AtomController@feedAction');
Route::get('/rss', 'RssController@feedAction');
Route::get('/atom/{component_group?}', 'AtomController@feedAction');
Route::get('/rss/{component_group?}', 'RssController@feedAction');
});

View File

@@ -63,7 +63,7 @@ App::missing(function ($exception) {
*/
App::down(function () {
return Response::make("Be right back!", 503);
return Response::make('Be right back!', 503);
});
/*

View File

@@ -19,10 +19,10 @@
<div class="col-sm-12 striped-list">
@forelse($groups as $group)
<div class="row striped-list-item">
<div class="col-md-8">
<strong>{{ $group->name }}</strong>
<div class="col-xs-6">
<strong>{{ $group->name }}</strong> <span class="label label-info">{{ $group->components->count() }}</span>
</div>
<div class="col-md-4 text-right">
<div class="col-xs-6 text-right">
<a href="{{ route('dashboard.components.groups.edit', [$group->id]) }}" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/components/groups/{{ $group->id }}/delete" class="btn btn-danger confirm-action" data-method="DELETE">{{ trans('forms.delete') }}</a>
</div>

View File

@@ -20,18 +20,21 @@
<div class="col-sm-12 striped-list" id="component-list">
@forelse($components as $component)
<div class="row striped-list-item">
<div class="col-md-8">
<div class="col-xs-6">
<h4>
@if($components->count() > 1)
<span class="drag-handle"><i class="ion-drag"></i></span>
@endif
{{ $component->name }} <small>{{ $component->humanStatus }}</small>
</h4>
@if($component->group)
<p><small>{{ trans('dashboard.components.listed_group', ['name' => $component->group->name]) }}</small></p>
@endif
@if($component->description)
<p><small>{{ $component->description }}</small></p>
<p>{{ $component->description }}</p>
@endif
</div>
<div class="col-md-4 text-right">
<div class="col-xs-6 text-right">
<a href="/dashboard/components/{{ $component->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/components/{{ $component->id }}/delete" class="btn btn-danger confirm-action" data-method="DELETE">{{ trans('forms.delete') }}</a>
</div>

View File

@@ -55,12 +55,19 @@
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
@if($components->count() > 0)
@if(!$componentsInGroups->isEmpty() || !$componentsOutGroups->isEmpty())
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>
<select name='incident[component_id]' class='form-control'>
<option value='0' selected></option>
@foreach($components as $component)
@foreach($componentsInGroups as $group)
<optgroup label="{{ $group->name }}">
@foreach($group->components as $component)
<option value='{{ $component->id }}'>{{ $component->name }}</option>
@endforeach
</optgroup>
@endforeach
@foreach($componentsOutGroups as $component)
<option value='{{ $component->id }}'>{{ $component->name }}</option>
@endforeach
</select>

View File

@@ -44,16 +44,23 @@
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
@if($components->count() > 0)
<div class='form-group'>
<label>{{ trans('forms.incidents.component') }}</label>
<select name='incident[component_id]' class='form-control'>
<option value='0' {{ $incident->id === 0 ? "selected" : null }}></option>
@foreach($components as $component)
<option value='{{ $component->id }}' {{ $incident->component_id === $component->id ? "selected" : null }}>{{ $component->name }}</option>
@endforeach
</select>
<span class='help-block'>{{ trans('forms.optional') }}</span>
@if(!$componentsInGroups->isEmpty() || !$componentsOutGroups->isEmpty())
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>
<select name='incident[component_id]' class='form-control'>
<option value='0' selected></option>
@foreach($componentsInGroups as $group)
<optgroup label="{{ $group->name }}">
@foreach($group->components as $component)
<option value='{{ $component->id }}'>{{ $component->name }}</option>
@endforeach
</optgroup>
@endforeach
@foreach($componentsOutGroups as $component)
<option value='{{ $component->id }}'>{{ $component->name }}</option>
@endforeach
</select>
<span class='help-block'>{{ trans('forms.optional') }}</span>
</div>
<div class="form-group {{ $incident->component_id === 0 ? 'hidden' : null }}" id='component-status'>
<div class="well">

View File

@@ -23,13 +23,13 @@
<div class="striped-list">
@foreach($incidents as $incident)
<div class="row striped-list-item">
<div class="col-md-6">
<div class="col-xs-6">
<i class="{{ $incident->icon }}"></i> <strong>{{ $incident->name }}</strong>
@if($incident->message)
<p><small>{{ Str::words($incident->message, 5) }}</small></p>
@endif
</div>
<div class="col-md-6 text-right">
<div class="col-xs-6 text-right">
<a href="/dashboard/incidents/{{ $incident->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/incidents/{{ $incident->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>

View File

@@ -18,11 +18,10 @@
<div class="striped-list">
@foreach($incidentTemplates as $template)
<div class="row striped-list-item">
<div class="col-md-6">
<div class="col-xs-6">
<strong>{{ $template->name }}</strong>
<p><small>{{ $template->template }}</small></p>
</div>
<div class="col-md-6 text-right">
<div class="col-xs-6 text-right">
<a href="/dashboard/templates/{{ $template->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/templates/{{ $template->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>

View File

@@ -28,7 +28,7 @@
<div class="form-group">
<label>{{ trans('forms.metrics.description') }}</label>
<div class='markdown-control'>
<textarea name="metric[description]" class="form-control" rows="5" required>{{ Input::old('metric.description') }}</textarea>
<textarea name="metric[description]" class="form-control" rows="5">{{ Input::old('metric.description') }}</textarea>
</div>
</div>
<div class="form-group">

View File

@@ -28,7 +28,7 @@
<div class="form-group">
<label>{{ trans('forms.metrics.description') }}</label>
<div class='markdown-control'>
<textarea name="metric[description]" class="form-control" rows="5" required>{{ $metric->description }}</textarea>
<textarea name="metric[description]" class="form-control" rows="5">{{ $metric->description }}</textarea>
</div>
</div>
<div class="form-group">

View File

@@ -22,7 +22,7 @@
<div class="striped-list">
@foreach($schedule as $incident)
<div class="row striped-list-item">
<div class="col-md-6">
<div class="col-xs-6">
<strong>{{ $incident->name }}</strong>
<br>
{{ trans('dashboard.schedule.scheduled_at', ['timestamp' => $incident->scheduled_at_iso]) }}
@@ -30,7 +30,7 @@
<p><small>{{ Str::words($incident->message, 5) }}</small></p>
@endif
</div>
<div class="col-md-6 text-right">
<div class="col-xs-6 text-right">
<a href="/dashboard/schedule/{{ $incident->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/schedule/{{ $incident->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>

View File

@@ -37,6 +37,22 @@
</div>
</div>
</div>
@if(! $unsecureUsers->isEmpty())
<hr>
<div class="panel panel-danger">
<div class="panel-heading">{{ trans('dashboard.settings.security.two-factor') }}</div>
<div class="list-group">
@foreach($unsecureUsers as $user)
<div class="list-group-item">
<strong>{{ $user->username }}</strong>
<span class="label label-danger pull-right"><i class="ion-ios-unlocked"></i></span>
</div>
@endforeach
</div>
</div>
@endif
</form>
</div>
</div>

View File

@@ -19,16 +19,16 @@
<!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading -->
<meta http-equiv="cleartype" content="on">
<link rel="icon" type="image/png" href="{{ url('img/favicon.ico') }}">
<link rel="shortcut icon" href="{{ url('img/favicon.png') }}" type="image/x-icon">
<link rel="icon" type="image/png" href="/img/favicon.ico">
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<link rel="apple-touch-icon" href="{{ url('img/apple-touch-icon.png') }}">
<link rel="apple-touch-icon" sizes="57x57" href="{{ url('img/apple-touch-icon-57x57.png') }}">
<link rel="apple-touch-icon" sizes="72x72" href="{{ url('img/apple-touch-icon-72x72.png') }}">
<link rel="apple-touch-icon" sizes="114x114" href="{{ url('img/apple-touch-icon-114x114.png') }}">
<link rel="apple-touch-icon" sizes="120x120" href="{{ url('img/apple-touch-icon-120x120.png') }}">
<link rel="apple-touch-icon" sizes="144x144" href="{{ url('img/apple-touch-icon-144x144.png') }}">
<link rel="apple-touch-icon" sizes="152x152" href="{{ url('img/apple-touch-icon-152x152.png') }}">
<link rel="apple-touch-icon" href="/img/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="57x57" href="/img/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="72x72" href="/img/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="/img/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/img/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/img/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/img/apple-touch-icon-152x152.png">
<title>{{ $pageTitle ?: Setting::get('app_name') }} Status</title>

View File

@@ -0,0 +1,15 @@
<li class="list-group-item {{ $component->group_id ? "sub-component" : "component" }}">
@if($component->link)
<a href="{{ $component->link }}" target="_blank">{{ $component->name }}</a>
@else
{{ $component->name }}
@endif
@if($component->description)
<i class="ion-ios-help-outline help-icon" data-toggle="tooltip" data-title="{{ $component->description }}"></i>
@endif
<div class="pull-right">
<small class="text-component-{{ $component->status }}">{{ $component->humanStatus }}</small>
</div>
</li>

View File

@@ -1,22 +1,22 @@
@if($components->count() > 0)
<ul class="list-group components">
@foreach($components as $component)
<li class="list-group-item component">
<strong>
@if($component->link)
<a href="{{ $component->link }}" target="_blank">{{ $component->name }}</a>
@else
{{ $component->name }}
@endif
@if($componentGroups->count() > 0)
@foreach($componentGroups as $componentGroup)
@if($componentGroup->components->count() > 0)
<li class="list-group-item group-name"><strong>{{ $componentGroup->name }}</strong></li>
@if($component->description)
<i class="ion-ios-help-outline help-icon" data-toggle="tooltip" data-title="{{ $component->description }}"></i>
@endif
</strong>
<div class="pull-right">
<small class="text-component-{{ $component->status }}">{{ $component->humanStatus }}</small>
</div>
</li>
@foreach($componentGroup->components as $component)
@include('partials.component', compact($component))
@endforeach
@endif
@endforeach
@if($ungroupedComponents->count() > 0)
<li class="list-group-item break"></li>
@endif
@endif
@if($ungroupedComponents->count() > 0)
@foreach($ungroupedComponents as $component)
@include('partials.component', compact($component))
@endforeach
@endif
</ul>
@endif

View File

@@ -2,7 +2,7 @@
<ul class="list-group metrics">
@foreach($metrics as $metric)
<?php
$points = range(0, 10);
$points = range(1, 11);
foreach($points as $hour) {
$points[$hour] = $metric->getValues($hour);
}

410
composer.lock generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

21
public/build/dist/css/all-5f5f09bd.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
{
"dist/css/all.css": "dist/css/all-0352fb47.css",
"dist/css/all.css": "dist/css/all-5f5f09bd.css",
"dist/js/all.js": "dist/js/all-d4baa2f5.js"
}

Binary file not shown.

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2014-12-3: Created.
2014-12-4: Created.
-->
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Wed Dec 3 12:38:33 2014
Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014
By Adam Bradley
Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net)
</metadata>
@@ -1046,19 +1046,16 @@ d="M103 243c11 0 19 -8 19 -19s-8 -19 -19 -19s-19 8 -19 19s8 19 19 19zM434 199c21
s43 136 88 149c10 3 18 4 26 4c28 0 47 -15 96 -15s68 15 96 15c8 0 16 -1 26 -4c45 -13 67 -61 88 -149zM103 184c22 0 39 18 39 40s-17 40 -39 40s-39 -18 -39 -40s17 -40 39 -40zM276 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 160
c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 248c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM364 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20z" />
<glyph glyph-name="ion-ios-gear-outline" unicode="&#xf43c;" horiz-adv-x="384"
d="M193 288c26 0 50 -10 68 -28s28 -42 28 -68s-10 -50 -28 -68s-42 -28 -68 -28s-50 10 -68 28s-28 42 -28 68s10 50 28 68s42 28 68 28zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM360 232c14 0 24 -11 24 -25v-15v-15
c0 -14 -10 -24 -24 -24h-15c-12 0 -23 -11 -23 -24c0 -6 3 -13 8 -17l10 -9c10 -10 10 -25 0 -35l-22 -22c-4 -4 -11 -7 -18 -7s-14 3 -18 7l-9 9c-5 5 -11 8 -17 8c-13 0 -23 -11 -23 -23v-15c0 -14 -11 -25 -25 -25h-30c-14 0 -25 11 -25 25v15c0 12 -10 23 -23 23
c-6 0 -13 -3 -17 -8l-10 -9c-4 -4 -10 -7 -17 -7s-14 3 -18 7l-22 22c-10 10 -10 25 0 35l9 9c5 4 8 11 8 17c0 13 -11 23 -23 23h-15c-14 0 -25 11 -25 25v15v15c0 14 11 25 25 25h15c12 0 23 10 23 23c0 6 -3 13 -8 17l-9 9c-10 10 -10 25 0 35l22 22c4 4 11 7 18 7
s13 -3 17 -7l10 -10c4 -5 11 -7 17 -7c13 0 23 11 23 23v15c0 14 11 25 25 25h30c14 0 24 -11 24 -25v-15c0 -12 11 -23 24 -23c6 0 13 3 17 8l9 9c4 4 11 7 18 7s14 -3 18 -7l22 -22c10 -10 10 -25 0 -35l-10 -9c-5 -4 -8 -11 -8 -17c0 -13 11 -23 23 -23h15zM368 192v15
c0 4 -3 9 -8 9h-15c-10 0 -20 4 -27 12s-12 17 -12 27c0 11 5 21 13 28l9 9c2 2 3 5 3 7s-1 4 -3 6l-22 22c-2 1 -4 2 -6 2s-4 0 -6 -2l-10 -9c-8 -8 -17 -13 -28 -13c-10 0 -20 4 -28 11s-12 18 -12 28v15c0 5 -4 9 -8 9h-30c-4 0 -9 -4 -9 -9v-15c0 -10 -4 -21 -12 -28
s-17 -11 -27 -11c-11 0 -21 4 -28 12l-10 10v0v0c-1 1 -4 2 -6 2s-4 0 -6 -2l-23 -22c-2 -2 -2 -5 -2 -6s0 -5 2 -7l9 -9c8 -8 13 -17 13 -28c0 -10 -4 -19 -11 -27s-18 -12 -28 -12h-15c-5 0 -9 -5 -9 -9v-15v-15c0 -4 4 -9 9 -9h15c10 0 21 -4 28 -12s11 -17 11 -27
c0 -11 -4 -21 -12 -29l-9 -8c-3 -3 -3 -10 0 -13l22 -22v0v0c1 -1 4 -2 6 -2s4 0 6 2l10 9c7 8 17 13 28 13c10 0 19 -4 27 -11s12 -18 12 -28v-15c0 -5 4 -9 9 -9h30c5 0 9 4 9 9v15c0 10 4 21 12 28s17 11 27 11c11 0 21 -5 29 -13l9 -9c2 -2 4 -2 6 -2s4 0 6 2l23 22
c3 3 3 10 0 13l-10 9c-8 7 -12 17 -12 28c0 10 4 20 11 28s18 12 28 12h15c5 0 7 4 7 8v15z" />
d="M193 288c26 0 50 -10 68 -28s28 -42 28 -68s-10 -50 -28 -68s-42 -28 -68 -28s-50 10 -68 28s-28 42 -28 68s10 50 28 68s42 28 68 28zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM138 365c-10 -3 -20 -7 -30 -12c2 -8 1 -16 0 -24
c-2 -13 -8 -25 -18 -35c-12 -12 -29 -19 -46 -19c-4 0 -9 0 -13 1c-5 -10 -9 -20 -12 -30c7 -4 12 -10 17 -17c8 -11 12 -24 12 -37s-4 -26 -12 -37c-5 -7 -10 -13 -17 -17c3 -10 7 -20 12 -30c4 1 9 1 13 1c17 0 34 -7 46 -19c10 -10 16 -22 18 -35c1 -8 2 -16 0 -24
c10 -5 20 -9 30 -12c4 7 10 12 17 17c11 8 24 12 37 12s26 -4 37 -12c7 -5 13 -10 17 -17c10 3 20 7 30 12c-2 8 -1 16 0 24c2 13 8 25 18 35c12 12 29 19 46 19c4 0 9 0 13 -1c5 10 9 20 12 30c-7 4 -12 10 -17 17c-8 11 -12 24 -12 37s4 26 12 37c5 7 10 13 17 17
c-3 10 -7 20 -12 30c-4 -1 -9 -1 -13 -1c-17 0 -34 7 -46 19c-10 10 -16 22 -18 35c-1 8 -2 16 0 24c-10 5 -20 9 -30 12c-4 -7 -10 -12 -17 -17c-11 -8 -24 -12 -37 -12s-26 4 -37 12c-7 5 -13 10 -17 17zM238 384v0c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55
c10 -10 22 -14 35 -14c7 0 14 1 20 4c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46s14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32
c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32z" />
<glyph glyph-name="ion-ios-gear" unicode="&#xf43d;" horiz-adv-x="384"
d="M360 232c14 0 24 -11 24 -25v-15v-15c0 -14 -10 -25 -24 -25h-15c-12 0 -23 -10 -23 -23c0 -6 3 -13 8 -17l10 -9c10 -10 10 -25 0 -35l-23 -22c-4 -4 -10 -7 -17 -7s-14 3 -18 7l-9 9c-5 5 -11 8 -17 8c-13 0 -24 -11 -24 -23v-15c0 -14 -10 -25 -24 -25h-30
c-14 0 -25 11 -25 25v15c0 12 -10 23 -23 23c-6 0 -13 -2 -17 -7l-10 -10c-4 -4 -10 -7 -17 -7s-14 3 -18 7l-22 22c-10 10 -10 25 0 35l9 9c5 4 8 11 8 17c0 13 -11 23 -23 23h-15c-14 0 -25 11 -25 25v15v15c0 14 11 25 25 25h15c12 0 23 10 23 23c0 6 -3 13 -8 17l-9 9
c-10 10 -10 25 0 35l22 22c4 4 11 7 18 7s14 -3 18 -7l9 -10c4 -5 11 -7 17 -7c13 0 23 11 23 23v15c0 14 11 25 25 25h30c14 0 25 -11 25 -25v-15c0 -12 10 -23 23 -23c6 0 13 3 17 8l9 9c4 4 11 7 18 7s14 -3 18 -7l22 -22c10 -10 10 -25 0 -35l-10 -10
c-5 -4 -8 -10 -8 -16c0 -13 11 -23 23 -23h15zM273 192v0c0 44 -36 80 -80 80s-80 -36 -80 -80v0v0c0 -44 36 -80 80 -80s80 36 80 80v0z" />
d="M352 192c0 -21 14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4
c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55c10 -10 22 -14 35 -14c7 0 14 1 20 4
c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
<glyph glyph-name="ion-ios-glasses-outline" unicode="&#xf43e;"
d="M433 201v0h15v-18h-15c-2 -22 -13 -43 -29 -58c-17 -16 -39 -25 -62 -25c-51 0 -92 41 -92 92v0v0c0 10 -12 22 -26 22s-26 -12 -26 -22v0v0c0 -51 -41 -92 -92 -92c-23 0 -45 9 -62 25c-16 15 -27 36 -29 58h-15v18h15c2 22 13 43 29 59c17 16 39 24 62 24
c42 0 78 -27 89 -67c7 7 18 12 29 12s22 -5 29 -12c11 40 47 67 89 67c23 0 45 -9 62 -25c16 -15 27 -36 29 -58zM342 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77zM106 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77z" />
@@ -1084,15 +1081,15 @@ c1 28 7 43 30 64c11 10 19 23 19 38c0 24 -19 40 -42 40c-32 0 -49 -16 -48 -46h-19c
d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM212 82c9 0 17 8 17 17s-8 17 -17 17s-17 -8 -17 -17s8 -17 17 -17zM246 197c15 14 26 29 26 51c0 34 -27 54 -60 54c-43 0 -68 -20 -68 -62h19c-1 30 16 46 48 46
c23 0 42 -15 42 -39c0 -15 -8 -29 -19 -39c-23 -21 -29 -36 -30 -64h19c1 26 0 31 23 53z" />
<glyph glyph-name="ion-ios-home-outline" unicode="&#xf447;" horiz-adv-x="384"
d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM336 16v184l-144 116l-144 -116v-184h80v128h128v-128h80zM192 384l192 -154v-20l-192 154l-192 -154v20l32 26v96h64v-45zM80 294v42h-32v-67z" />
d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM336 16v184l-144 116l-144 -116v-184h80v128h128v-128h80zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45zM80 294v42h-32v-67z" />
<glyph glyph-name="ion-ios-home" unicode="&#xf448;" horiz-adv-x="384"
d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM192 384l192 -154v-20l-192 154l-192 -154v20l32 26v96h64v-45z" />
<glyph glyph-name="ion-ios-infinite-outline" unicode="&#xf449;" horiz-adv-x="384"
d="M359 249c33 -31 33 -82 0 -113c-16 -15 -36 -24 -59 -24c-22 0 -44 9 -60 24l-108 102c-13 12 -30 18 -48 18s-35 -6 -48 -18c-26 -25 -26 -66 0 -91c13 -12 30 -19 48 -19s35 7 48 19l36 34l12 -11l-36 -34c-16 -15 -37 -24 -60 -24s-43 9 -59 24c-33 31 -33 82 0 113
c16 15 36 23 59 23c22 0 44 -8 60 -23l108 -102c13 -12 30 -19 48 -19s34 7 47 19c26 25 26 66 0 91c-13 12 -29 18 -47 18s-35 -6 -48 -18l-37 -35l-11 11l36 35c16 15 37 23 60 23s43 -8 59 -23z" />
<glyph glyph-name="ion-ios-infinite" unicode="&#xf44a;" horiz-adv-x="384"
d="M358 249c17 -15 26 -36 26 -57c0 -22 -9 -42 -26 -57s-39 -23 -63 -23s-45 8 -62 23l-103 93c-11 10 -26 15 -41 15s-30 -5 -41 -15s-16 -22 -16 -36s5 -26 16 -36s26 -15 41 -15s30 5 41 15l30 28l23 -20l-32 -29c-17 -15 -38 -23 -62 -23s-46 8 -63 23s-26 35 -26 57
s9 42 26 57s39 23 63 23s45 -8 62 -23l104 -93c11 -10 25 -15 40 -15s30 5 41 15s17 22 17 36s-6 26 -17 36s-26 15 -41 15s-29 -5 -40 -15l-31 -28l-23 20l32 29c17 15 38 23 62 23s46 -8 63 -23z" />
d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45z" />
<glyph glyph-name="ion-ios-infinite-outline" unicode="&#xf449;"
d="M419 260c19 -19 29 -43 29 -68s-10 -49 -29 -68c-19 -18 -44 -28 -70 -28s-50 10 -69 28l-126 123c-15 15 -35 22 -56 22s-40 -7 -55 -22c-31 -30 -31 -80 0 -110c15 -15 34 -22 55 -22s41 7 56 22l43 42l13 -14l-42 -41c-19 -18 -44 -28 -70 -28s-50 10 -69 28
c-19 19 -29 43 -29 68s10 49 29 68c19 18 43 28 69 28s51 -10 70 -28l126 -123c15 -15 34 -22 55 -22s41 7 56 22c31 30 31 80 0 110c-15 15 -35 22 -56 22s-40 -7 -55 -22l-43 -42l-13 14l42 41c19 18 44 28 70 28s50 -10 69 -28z" />
<glyph glyph-name="ion-ios-infinite" unicode="&#xf44a;" horiz-adv-x="464"
d="M433 266c20 -20 31 -46 31 -74s-11 -54 -31 -74s-48 -30 -76 -30s-55 10 -75 30l-125 123c-13 13 -32 20 -51 20s-37 -7 -50 -20s-21 -31 -21 -49c0 -19 8 -36 21 -49s31 -20 50 -20s38 7 51 20l39 38l25 -25l-39 -38c-20 -20 -48 -30 -76 -30s-55 10 -75 30
s-31 46 -31 74s11 54 31 74s47 30 75 30s56 -10 76 -30l125 -123c13 -13 31 -20 50 -20s38 7 51 20s20 31 20 49c0 19 -7 36 -20 49s-32 20 -51 20s-37 -7 -50 -20l-39 -38l-25 25l39 38c20 20 48 30 76 30s55 -10 75 -30z" />
<glyph glyph-name="ion-ios-information-empty" unicode="&#xf44b;" horiz-adv-x="64"
d="M8 276c0 13 7 20 20 20s20 -7 20 -20s-7 -20 -20 -20s-20 7 -20 20zM48 104h16v-8h-64v8h16v120h-16v8h48v-128z" />
<glyph glyph-name="ion-ios-information-outline" unicode="&#xf44c;" horiz-adv-x="416"
@@ -1128,11 +1125,11 @@ s-16 5 -16 16zM64 96c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16z"
<glyph glyph-name="ion-ios-list" unicode="&#xf454;" horiz-adv-x="384"
d="M0 384h384v-384h-384v384zM80 80c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 176c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 272c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM320 88v16h-192v-16h192zM320 184v16
h-192v-16h192zM320 280v16h-192v-16h192z" />
<glyph glyph-name="ion-ios-location-outline" unicode="&#xf455;" horiz-adv-x="268"
d="M134 416c74 0 134 -59 134 -133c0 -17 -3 -34 -9 -50l-1 -1c0 -1 -1 -3 -1 -4l-1 -1l-122 -259l-122 260c0 1 -2 3 -2 4v0v1v0c-6 16 -10 34 -10 50c0 74 60 133 134 133zM243 239c6 14 9 29 9 44c0 65 -53 117 -118 117s-118 -52 -118 -117c0 -15 3 -31 9 -45
c0 -1 1 -1 1 -2l1 -2l107 -227l107 227l1 2c0 1 1 1 1 2v1zM134 352c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM134 241c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
<glyph glyph-name="ion-ios-location" unicode="&#xf456;" horiz-adv-x="268"
d="M134 416c74 0 134 -59 134 -133c0 -17 -3 -34 -9 -50l-1 -1c0 -1 -1 -3 -1 -4l-1 -1l-122 -259l-122 260c0 1 -2 3 -2 4v1v0c-6 16 -10 34 -10 50c0 74 60 133 134 133zM134 241c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
<glyph glyph-name="ion-ios-location-outline" unicode="&#xf455;" horiz-adv-x="288"
d="M144 400c-34 0 -67 -13 -91 -37s-37 -57 -37 -91c0 -43 24 -107 70 -186c22 -38 44 -72 58 -91c14 19 36 53 58 91c46 79 70 143 70 186c0 34 -13 67 -37 91s-57 37 -91 37zM144 416v0c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304
c0 80 64 144 144 144zM144 336c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
<glyph glyph-name="ion-ios-location" unicode="&#xf456;" horiz-adv-x="288"
d="M144 416c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304c0 80 64 144 144 144zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
<glyph glyph-name="ion-ios-locked-outline" unicode="&#xf457;" horiz-adv-x="320"
d="M264 224h56v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-72zM72 296v-72h176v72c0 49 -39 88 -88 88s-88 -39 -88 -88zM304 0v208h-288v-208h288zM160 160c18 0 32 -14 32 -32c0 -15 -10 -27 -24 -31v-33h-16v33c-14 4 -24 16 -24 31c0 18 14 32 32 32z
M160 112c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
@@ -1268,12 +1265,10 @@ d="M64 320h384v-320h-384v320zM432 16v288h-352v-288h352zM0 384h384v-48h-16v32h-35
<glyph glyph-name="ion-ios-photos" unicode="&#xf482;"
d="M64 320h384v-320h-384v320zM384 384v-48h-336v-272h-48v320h384z" />
<glyph glyph-name="ion-ios-pie-outline" unicode="&#xf483;"
d="M32 176h208v208c5 0 11 -1 16 -1c17 -1 33 -4 49 -9c24 -8 46 -21 65 -36c47 -38 78 -96 78 -162c0 -115 -93 -208 -208 -208c-66 0 -124 31 -162 78c-15 19 -28 41 -36 65c-5 16 -8 32 -9 49c0 5 -1 11 -1 16zM49 160c2 -20 6 -40 14 -59c7 -16 15 -30 26 -44
c5 -6 10 -12 15 -17c12 -12 24 -22 38 -30c7 -4 15 -8 23 -11c24 -10 49 -15 75 -15s51 5 75 15c23 10 43 23 61 41s31 38 41 61c10 24 15 49 15 75s-5 51 -15 75c-3 8 -8 15 -12 22c-8 14 -17 27 -29 39c-5 5 -11 10 -17 15c-14 11 -28 19 -44 26c-19 8 -39 12 -59 14v-191
v-16h-16h-191zM0 208c0 115 93 208 208 208c5 0 11 -1 16 -1v-207v-16h-16h-207c0 5 -1 11 -1 16zM16 208h192v192c-26 0 -51 -5 -75 -15c-23 -10 -43 -23 -61 -41s-31 -38 -41 -61c-10 -24 -15 -49 -15 -75z" />
d="M256 367v0v-207v-12l-12 -4l-180 -45c6 -13 13 -25 21 -36c12 -16 25 -30 41 -42c33 -24 73 -37 114 -37c26 0 51 5 75 15c23 10 43 23 61 41s31 38 41 61c10 24 15 49 15 75c0 51 -20 100 -56 136c-32 32 -75 51 -120 55zM240 384v0c115 0 208 -93 208 -208
s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM208 400c-31 -1 -60 -7 -85 -18c-24 -11 -44 -26 -61 -46c-29 -34 -46 -80 -46 -127v0v0c0 -13 3 -46 12 -70l180 46v215zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
<glyph glyph-name="ion-ios-pie" unicode="&#xf484;"
d="M32 176h208v208c5 0 11 -1 16 -1c17 -1 33 -4 49 -9c24 -8 46 -21 65 -36c47 -38 78 -96 78 -162c0 -115 -93 -208 -208 -208c-66 0 -124 31 -162 78c-15 19 -28 41 -36 65c-5 16 -8 32 -9 49c0 5 -1 11 -1 16zM0 208c0 115 93 208 208 208c5 0 11 -1 16 -1v-207v-16h-16
h-207c0 5 -1 11 -1 16z" />
d="M240 384v0c115 0 208 -93 208 -208s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
<glyph glyph-name="ion-ios-pint-outline" unicode="&#xf485;" horiz-adv-x="224"
d="M224 278c0 -98 -32 -101 -32 -181c0 -40 16 -71 16 -99c0 -27 -9 -30 -32 -30h-128c-23 0 -32 2 -32 29c0 28 16 60 16 100c0 80 -32 83 -32 181c0 21 1 89 19 125c4 9 13 13 32 13h122c19 0 28 -4 32 -13c18 -36 19 -104 19 -125zM34 396c-8 -16 -14 -43 -17 -76h190
c-3 33 -9 60 -17 76c-1 2 -1 1 -2 2c-2 1 -6 2 -15 2h-122c-9 0 -13 -1 -15 -2c-1 -1 -1 0 -2 -2zM191 -15c0 1 1 5 1 13c0 11 -4 23 -7 37c-4 18 -9 39 -9 62c0 41 8 64 16 86c8 23 16 46 16 95c0 9 -1 18 -1 26h-190c0 -8 -1 -17 -1 -26c0 -49 8 -72 16 -95
@@ -1392,13 +1387,16 @@ c-8 -9 -18 -15 -30 -19c-4 -1 -9 0 -10 4s1 10 5 11c8 3 15 6 21 12l-29 16c-4 2 -5
s8 -4 8 -8v-33c8 2 15 7 21 12c3 3 8 2 11 -1s2 -8 -1 -11c-9 -8 -20 -13 -31 -16v-73l64 36c-3 11 -4 24 -2 36c1 4 6 7 10 6s7 -6 6 -10c-2 -8 -1 -15 1 -23l29 16c4 2 9 1 11 -3s1 -9 -3 -11l-29 -16c6 -6 13 -10 21 -13c4 -1 6 -6 5 -10s-6 -6 -10 -5
c-12 4 -23 10 -31 19l-64 -36l64 -36c8 8 19 15 31 19c4 1 9 -1 10 -5s-1 -9 -5 -10c-8 -3 -15 -7 -21 -13z" />
<glyph glyph-name="ion-ios-speedometer-outline" unicode="&#xf4af;"
d="M448 163v0v0c0 -63 -27 -120 -70 -160l-2 -3l-37 37l11 11l26 -25c16 17 28 36 38 57c10 23 17 47 18 72h-32v16h32c-1 26 -6 51 -16 75c-9 22 -22 42 -38 59l-28 -28l-6 6l-5 5v0h-1l28 28c-18 17 -38 30 -61 40s-48 14 -73 15v-37h-16v37c-25 -1 -50 -5 -73 -15
s-43 -23 -61 -40l27 -28v0v0l-5 -5l-6 -6l-28 28c-16 -17 -29 -37 -38 -59c-10 -24 -15 -49 -16 -75h32v-16h-32c1 -25 8 -49 18 -72c9 -21 22 -40 38 -57l25 25l12 -11l-37 -37v1c-44 40 -72 97 -72 161v1v0c0 122 100 221 224 221v0v0h1c124 0 223 -99 223 -221zM208 193
l110 68l10 -11l-82 -94l-1 -1c-5 -6 -13 -10 -21 -10c-15 0 -27 11 -27 26c0 8 4 15 9 20z" />
d="M224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12l-10 10l-1 2c-19 18 -41 33 -65 43c-26 11 -53 16 -81 16s-55 -5 -81 -16c-24 -10 -46 -25 -65 -43l-1 -2l-10 -10c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224z
M416 79c10 23 15 48 16 73h-32v16h32c-1 25 -6 50 -16 73c-9 22 -23 42 -39 60l-27 -27l-6 6l-5 5v0h-1l27 27c-18 17 -38 31 -60 40c-23 10 -48 15 -74 16v-38h-16v38c-25 -1 -49 -6 -72 -16c-22 -10 -43 -23 -61 -40l27 -27v0v0l-6 -6l-5 -5l-27 27
c-16 -18 -30 -38 -39 -60c-10 -23 -15 -49 -16 -74h32v-16h-32c1 -25 6 -49 16 -72c9 -20 20 -39 35 -56c40 40 96 64 157 64s117 -24 157 -64c15 17 26 36 35 56zM336 273l2 -1l-75 -84c6 -8 9 -18 9 -28c0 -26 -22 -48 -48 -48c-10 0 -19 4 -27 9l-13 -12l-11 11l12 12
c-6 8 -9 18 -9 28c0 26 22 48 48 48c10 0 19 -3 27 -8zM224 128c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
<glyph glyph-name="ion-ios-speedometer" unicode="&#xf4b0;"
d="M224 384c124 0 224 -99 224 -221c0 -64 -28 -122 -72 -163h-304c-44 41 -72 99 -72 163c0 122 100 221 224 221zM246 156l82 94l-10 11l-110 -68l-2 -2c-5 -5 -9 -12 -9 -20c0 -15 12 -26 27 -26c8 0 16 4 21 10zM372 18c35 35 60 87 60 145v0v1c0 84 -52 157 -125 188
c-25 11 -54 16 -83 16v0v0v0c-29 0 -57 -5 -82 -16c-72 -30 -126 -104 -126 -188v0v-1c0 -50 21 -109 62 -146l1 -1l15 15l19 19l-11 10l-23 -23c-15 16 -23 31 -32 50c-10 21 -15 43 -16 67h29v15h-29c0 23 5 47 15 69c9 20 20 38 35 54l26 -26l5 5l5 5v0v0l-25 26
c17 16 36 28 57 37c22 9 44 13 68 14v-35h14v35c24 -1 46 -5 68 -14c21 -9 40 -21 57 -37l-26 -26h1v0l5 -5l5 -5l26 26c15 -16 26 -34 35 -54c10 -22 14 -46 15 -69h-29v-15h29c-1 -24 -6 -46 -16 -67c-9 -19 -17 -34 -32 -50l-23 24l-11 -11l19 -19l15 -15z" />
d="M385 169v-15h30c-1 -22 -6 -44 -15 -65c-8 -18 -19 -35 -32 -50c-39 37 -90 58 -144 58s-105 -21 -144 -58c-13 15 -24 32 -32 50c-9 21 -14 43 -15 65h28h1v16h-29c1 23 6 45 15 66c9 20 20 38 35 54l25 -24l10 10l1 1v0v0l-25 25c16 15 36 26 56 35c21 9 43 14 66 15
v-34h14h1v34c23 -1 46 -6 67 -15s39 -20 55 -35l-24 -25l11 -11l25 25c15 -16 26 -35 35 -55c9 -21 14 -43 15 -66h-30v-1zM272 160c0 10 -3 20 -9 28l63 76l-2 1l-73 -65c-8 5 -17 8 -27 8c-26 0 -48 -22 -48 -48c0 -10 3 -20 9 -28l-12 -12l11 -11l13 12c8 -5 17 -9 27 -9
c26 0 48 22 48 48zM224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12h-23c-32 39 -80 64 -134 64s-102 -25 -134 -64h-23c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224zM379 27c34 37 52 86 52 136c0 55 -22 106 -61 145
s-91 60 -146 60s-107 -21 -146 -60s-61 -90 -61 -145c0 -50 18 -99 52 -136l10 -10l1 -1v1l9 9l1 1v0c17 17 38 30 60 39c24 10 48 15 74 15s50 -5 74 -15c22 -9 43 -22 60 -39v0l1 -1l9 -9v-1l1 1zM192 160c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z
" />
<glyph glyph-name="ion-ios-star-half" unicode="&#xf4b1;"
d="M140 143l-140 98h171l53 159l53 -159h171l-140 -98l54 -159l-138 99l-138 -99zM224 347v-244l107 -76l-43 122l108 75h-131z" />
<glyph glyph-name="ion-ios-star-outline" unicode="&#xf4b2;"

Before

Width:  |  Height:  |  Size: 326 KiB

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,5 @@
<?php
/**
* Laravel - A PHP Framework For Web Artisans.
*

View File

@@ -3,9 +3,9 @@
namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Facades\Setting;
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Response;
use Roumen\Feed\Facades\Feed;
class AtomController extends Controller
@@ -13,9 +13,11 @@ class AtomController extends Controller
/**
* Generates an Atom feed of all incidents.
*
* @param \CachetHQ\Cachet\Models\ComponentGroup|null $group
*
* @return \Illuminate\Http\Response
*/
public function feedAction()
public function feedAction(ComponentGroup $group = null)
{
$feed = Feed::make();
$feed->title = Setting::get('app_name');
@@ -24,23 +26,37 @@ class AtomController extends Controller
$feed->setDateFormat('datetime');
Incident::get()->map(function ($incident) use ($feed) {
if ($incident->component) {
$componentName = $incident->component->name;
} else {
$componentName = null;
}
$feed->add(
$incident->name,
Setting::get('app_name'),
Setting::get('app_domain'),
$incident->created_at,
($componentName === null ? $incident->humanStatus : $componentName.' '.$incident->humanStatus),
$incident->message
);
});
if ($group) {
$group->components->map(function ($component) use ($feed) {
$component->incidents()->orderBy('created_at', 'desc')->get()->map(function ($incident) use ($feed) {
$this->feedAddItem($feed, $incident);
});
});
} else {
Incident::orderBy('created_at', 'desc')->get()->map(function ($incident) use ($feed) {
$this->feedAddItem($feed, $incident);
});
}
return $feed->render('atom');
}
/**
* Adds an item to the feed.
*
* @param \Thujohn\Rss\Rss $feed
* @param \CachetHQ\Cachet\Models\Incident $incident
*
* @return void
*/
private function feedAddItem(& $feed, $incident)
{
$feed->add(
$incident->name,
Setting::get('app_name'),
Setting::get('app_domain'),
$incident->created_at->toAtomString(),
$incident->message
);
}
}

View File

@@ -32,9 +32,10 @@ class DashComponentController extends Controller
],
];
View::share('subMenu', $this->subMenu);
View::share('subTitle', trans_choice('dashboard.components.components', 2));
View::share([
'subMenu' => $this->subMenu,
'subTitle' => trans_choice('dashboard.components.components', 2),
]);
}
/**
@@ -253,6 +254,12 @@ class DashComponentController extends Controller
'event' => 'Deleted Component Group',
]);
$group->components->map(function ($component) {
$component->update([
'group_id' => 0,
]);
});
$group->delete();
return Redirect::back();

View File

@@ -3,6 +3,7 @@
namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\IncidentTemplate;
use GrahamCampbell\Binput\Facades\Binput;
@@ -68,10 +69,14 @@ class DashIncidentController extends Controller
*/
public function showAddIncident()
{
$componentsInGroups = ComponentGroup::with('components')->get();
$componentsOutGroups = Component::where('group_id', 0)->get();
return View::make('dashboard.incidents.add')->with([
'pageTitle' => trans('dashboard.incidents.add.title').' - '.trans('dashboard.dashboard'),
'components' => Component::all(),
'incidentTemplates' => IncidentTemplate::all(),
'pageTitle' => trans('dashboard.incidents.add.title').' - '.trans('dashboard.dashboard'),
'componentsInGroups' => $componentsInGroups,
'componentsOutGroups' => $componentsOutGroups,
'incidentTemplates' => IncidentTemplate::all(),
]);
}
@@ -248,10 +253,14 @@ class DashIncidentController extends Controller
*/
public function showEditIncidentAction(Incident $incident)
{
$componentsInGroups = ComponentGroup::with('components')->get();
$componentsOutGroups = Component::where('group_id', 0)->get();
return View::make('dashboard.incidents.edit')->with([
'pageTitle' => trans('dashboard.incidents.edit.title').' - '.trans('dashboard.dashboard'),
'incident' => $incident,
'components' => Component::all(),
'pageTitle' => trans('dashboard.incidents.edit.title').' - '.trans('dashboard.dashboard'),
'incident' => $incident,
'componentsInGroups' => $componentsInGroups,
'componentsOutGroups' => $componentsOutGroups,
]);
}

View File

@@ -3,6 +3,7 @@
namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Models\Setting;
use CachetHQ\Cachet\Models\User;
use Exception;
use GrahamCampbell\Binput\Facades\Binput;
use Illuminate\Routing\Controller;
@@ -88,9 +89,12 @@ class DashSettingsController extends Controller
{
$this->subMenu['security']['active'] = true;
$unsecureUsers = User::whereNull('google_2fa_secret')->orWhere('google_2fa_secret', '')->get();
return View::make('dashboard.settings.security')->with([
'pageTitle' => 'Security - Dashboard',
'subMenu' => $this->subMenu,
'pageTitle' => 'Security - Dashboard',
'subMenu' => $this->subMenu,
'unsecureUsers' => $unsecureUsers,
]);
}

View File

@@ -4,6 +4,7 @@ namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Facades\Setting;
use CachetHQ\Cachet\Models\Component;
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
use CachetHQ\Cachet\Models\Metric;
use Carbon\Carbon;
@@ -23,20 +24,12 @@ class HomeController extends Controller
*/
public function showIndex()
{
segment_track('Status Page', [
'event' => 'Landed',
]);
$components = Component::orderBy('order')->orderBy('created_at')->get();
$allIncidents = [];
$incidentDays = Setting::get('app_incident_days') ?: 7;
$today = Carbon::now();
$startDate = Carbon::now();
$dateFormat = Setting::get('date_format') ?: 'jS F Y';
segment_track('Status Page', [
'event' => 'Landed',
]);
// Check if we have another starting date
if (Binput::has('start_date')) {
@@ -73,9 +66,12 @@ class HomeController extends Controller
$metrics = Metric::where('display_chart', 1)->get();
}
$scheduledMaintenance = Incident::scheduled()->orderBy('scheduled_at')->get();
$allIncidents = [];
$daysToShow = Setting::get('app_incident_days') ?: 7;
$incidentDays = range(0, $daysToShow);
$dateFormat = Setting::get('date_format') ?: 'jS F Y';
foreach (range(0, $incidentDays) as $i) {
foreach ($incidentDays as $i) {
$date = $startDate->copy()->subDays($i);
$incidents = Incident::notScheduled()->whereBetween('created_at', [
@@ -89,8 +85,17 @@ class HomeController extends Controller
];
}
// Scheduled maintenance code.
$scheduledMaintenance = Incident::scheduled()->orderBy('scheduled_at')->get();
// Component & Component Group lists.
$usedComponentGroups = Component::where('group_id', '>', 0)->groupBy('group_id')->lists('group_id');
$componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->get();
$ungroupedComponents = Component::where('group_id', 0)->orderBy('order')->orderBy('created_at')->get();
return View::make('index', [
'components' => $components,
'componentGroups' => $componentGroups,
'ungroupedComponents' => $ungroupedComponents,
'displayMetrics' => $displayMetrics,
'metrics' => $metrics,
'allIncidents' => $allIncidents,

View File

@@ -3,6 +3,7 @@
namespace CachetHQ\Cachet\Http\Controllers;
use CachetHQ\Cachet\Facades\Setting;
use CachetHQ\Cachet\Models\ComponentGroup;
use CachetHQ\Cachet\Models\Incident;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Response;
@@ -13,9 +14,11 @@ class RssController extends Controller
/**
* Generates an RSS feed of all incidents.
*
* @param \CachetHQ\Cachet\Models\ComponentGroup|null $group
*
* @return \Illuminate\Http\Response
*/
public function feedAction()
public function feedAction(ComponentGroup $group = null)
{
$feed = RssFacade::feed('2.0', 'UTF-8');
$feed->channel([
@@ -24,23 +27,36 @@ class RssController extends Controller
'link' => Setting::get('app_domain'),
]);
Incident::get()->map(function ($incident) use ($feed) {
if ($incident->component) {
$componentName = $incident->component->name;
} else {
$componentName = null;
}
$feed->item([
'title' => $incident->name,
'message' => $incident->message,
'component' => $componentName,
'status' => $incident->humanStatus,
'created_at' => $incident->created_at,
'updated_at' => $incident->updated_at,
]);
});
if ($group) {
$group->components->map(function ($component) use ($feed) {
$component->incidents()->orderBy('created_at', 'desc')->get()->map(function ($incident) use ($feed) {
$this->feedAddItem($feed, $incident);
});
});
} else {
Incident::orderBy('created_at', 'desc')->get()->map(function ($incident) use ($feed) {
$this->feedAddItem($feed, $incident);
});
}
return Response::make($feed, 200, ['Content-Type' => 'text/xml']);
}
/**
* Adds an item to the feed.
*
* @param \Thujohn\Rss\Rss $feed
* @param \CachetHQ\Cachet\Models\Incident $incident
*
* @return void
*/
private function feedAddItem(& $feed, $incident)
{
$feed->item([
'title' => $incident->name,
'description' => $incident->message,
'pubDate' => $incident->created_at->toRssString(),
'guid' => $incident->id,
]);
}
}

View File

@@ -60,9 +60,20 @@ class SetupController extends Controller
]);
if ($v->passes()) {
segment_track('Setup', [
'event' => 'Step 1',
'success' => true,
]);
return Response::json(['status' => 1]);
} else {
// No good, let's try that again.
segment_track('Setup', [
'event' => 'Step 1',
'success' => false,
]);
return Response::json(['errors' => $v->messages()], 400);
}
}
@@ -115,12 +126,22 @@ class SetupController extends Controller
Session::flash('setup.done', true);
segment_track('Setup', [
'event' => 'Step 2',
'success' => true,
]);
if (Request::ajax()) {
return Response::json(['status' => 1]);
}
return Redirect::to('dashboard');
} else {
segment_track('Setup', [
'event' => 'Step 2',
'success' => false,
]);
// No good, let's try that again.
if (Request::ajax()) {
return Response::json(['errors' => $v->messages()], 400);

View File

@@ -3,7 +3,6 @@
namespace CachetHQ\Cachet\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletingTrait;
use Watson\Validating\ValidatingTrait;
/**
@@ -11,11 +10,10 @@ use Watson\Validating\ValidatingTrait;
* @property string $name
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property \Carbon\Carbon $deleted_at
*/
class ComponentGroup extends Model
{
use SoftDeletingTrait, ValidatingTrait;
use ValidatingTrait;
/**
* The validation rules.
@@ -40,6 +38,6 @@ class ComponentGroup extends Model
*/
public function components()
{
return $this->hasMany('CachetHQ\Cachet\Models\Component', 'id', 'group_id');
return $this->hasMany('CachetHQ\Cachet\Models\Component', 'group_id', 'id');
}
}

View File

@@ -16,6 +16,8 @@ use Watson\Validating\ValidatingTrait;
* @property string $name
* @property string $suffix
* @property string $description
* @property float $default_value
* @property int $calc_type
* @property int $display_chart
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
@@ -81,21 +83,23 @@ class Metric extends Model implements TransformableInterface
$dateTime->sub(new DateInterval('PT'.$hour.'H'));
if (Config::get('database.default') === 'mysql') {
if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) {
$value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->sum('value');
} elseif ($this->calc_type === self::CALC_AVG) {
$value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->format('YmdH'))->whereRaw('HOUR(created_at) = HOUR(DATE_SUB(NOW(), INTERVAL '.$hour.' HOUR))')->groupBy(DB::raw('HOUR(created_at)'))->avg('value');
if (! isset($this->calc_type) || $this->calc_type == self::CALC_SUM) {
$value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->sub(new DateInterval('PT'.$hour.'H'))->format('YmdH'))->groupBy(DB::raw('HOUR(created_at)'))->sum('value');
} elseif ($this->calc_type == self::CALC_AVG) {
$value = (int) $this->points()->whereRaw('DATE_FORMAT(created_at, "%Y%m%e%H") = '.$dateTime->sub(new DateInterval('PT'.$hour.'H'))->format('YmdH'))->groupBy(DB::raw('HOUR(created_at)'))->avg('value');
}
} else {
// Default metrics calculations.
if (! isset($this->calc_type) || $this->calc_type === self::CALC_SUM) {
$queryType = "sum(metric_points.value)";
} elseif ($this->calc_type === self::CALC_AVG) {
$queryType = "avg(metric_points.value)";
if (! isset($this->calc_type) || $this->calc_type == self::CALC_SUM) {
$queryType = 'sum(metric_points.value)';
} elseif ($this->calc_type == self::CALC_AVG) {
$queryType = 'avg(metric_points.value)';
} else {
$queryType = 'sum(metric_points.value)';
}
$query = DB::select("select {$queryType} as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE to_char(metric_points.created_at, 'YYYYMMDDHH') = :timestamp AND to_char(metric_points.created_at, 'H') = to_char(now() - interval '{$hour} hour', 'H') GROUP BY to_char(metric_points.created_at, 'H')", [
'timestamp' => $dateTime->format('YmdH'),
$query = DB::select("select {$queryType} as aggregate FROM metrics JOIN metric_points ON metric_points.metric_id = metrics.id WHERE metric_points.metric_id = {$this->id} AND to_char(metric_points.created_at, 'YYYYMMDDHH24') = :timestamp GROUP BY to_char(metric_points.created_at, 'H')", [
'timestamp' => $dateTime->sub(new DateInterval('PT'.$hour.'H'))->format('YmdH'),
]);
if (isset($query[0])) {

View File

@@ -27,7 +27,11 @@ class LoadConfigServiceProvider extends ServiceProvider
// Set the Segment.com settings.
$segmentRepository = $this->app->make('CachetHQ\Cachet\Segment\RepositoryInterface');
$this->app->config->set('cachethq/segment::write_key', $segmentRepository->fetch());
try {
$this->app->config->set('cachethq/segment::write_key', $segmentRepository->fetch());
} catch (\GuzzleHttp\Exception\ConnectException $e) {
// We may not have any connection. Let's not cry about it.
}
// Override default app values.
$this->app->config->set('app.url', $appDomain ?: $this->app->config->get('app.url'));

View File

@@ -90,20 +90,22 @@ if (!function_exists('segment_identify')) {
*/
function segment_identify()
{
try {
if (Setting::get('app_track')) {
return Segment::identify([
'anonymousId' => Config::get('app.key'),
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
if (Config::get('cachethq/segment::write_key')) {
try {
if (Setting::get('app_track')) {
return Segment::identify([
'anonymousId' => Config::get('app.key'),
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
return false;
}
} catch (QueryException $e) {
return false;
}
} catch (QueryException $e) {
return false;
}
}
}
@@ -119,22 +121,24 @@ if (!function_exists('segment_track')) {
*/
function segment_track($event, array $properties)
{
try {
if (Setting::get('app_track')) {
return Segment::track([
'anonymousId' => Config::get('app.key'),
'event' => $event,
'properties' => $properties,
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
if (Config::get('cachethq/segment::write_key')) {
try {
if (Setting::get('app_track')) {
return Segment::track([
'anonymousId' => Config::get('app.key'),
'event' => $event,
'properties' => $properties,
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
return false;
}
} catch (QueryException $e) {
return false;
}
} catch (QueryException $e) {
return false;
}
}
}
@@ -149,21 +153,23 @@ if (!function_exists('segment_page')) {
*/
function segment_page($page)
{
try {
if (Setting::get('app_track')) {
return Segment::page([
'anonymousId' => Config::get('app.key'),
'page' => $page,
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
if (Config::get('cachethq/segment::write_key')) {
try {
if (Setting::get('app_track')) {
return Segment::page([
'anonymousId' => Config::get('app.key'),
'page' => $page,
'context' => [
'locale' => Config::get('app.locale'),
'timezone' => Setting::get('app_timezone'),
],
]);
} else {
return false;
}
} catch (QueryException $e) {
return false;
}
} catch (QueryException $e) {
return false;
}
}
}