diff --git a/app/controllers/concerns/localized.rb b/app/controllers/concerns/localized.rb
index 145549bcd..cefd374e7 100644
--- a/app/controllers/concerns/localized.rb
+++ b/app/controllers/concerns/localized.rb
@@ -20,7 +20,12 @@ module Localized
if ENV['DEFAULT_LOCALE'].present?
I18n.default_locale
else
- request_locale || I18n.default_locale
+ case request_locale
+ when /en\b/, nil
+ I18n.default_locale
+ else
+ request_locale
+ end
end
end
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 0e957e946..6808bb328 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -3,6 +3,7 @@
module SettingsHelper
HUMAN_LOCALES = {
en: 'English',
+ 'en-CY': 'English (Cybre)',
ar: 'العربية',
ast: 'l\'asturianu',
bg: 'Български',
diff --git a/app/javascript/fonts/premillenium/MSSansSerif.ttf b/app/javascript/fonts/premillenium/MSSansSerif.ttf
new file mode 100644
index 000000000..3afd76ff2
Binary files /dev/null and b/app/javascript/fonts/premillenium/MSSansSerif.ttf differ
diff --git a/app/javascript/images/alert_badge.png b/app/javascript/images/alert_badge.png
new file mode 100644
index 000000000..681f6e651
Binary files /dev/null and b/app/javascript/images/alert_badge.png differ
diff --git a/app/javascript/images/background-cybre-light.png b/app/javascript/images/background-cybre-light.png
new file mode 100644
index 000000000..44d76c24c
Binary files /dev/null and b/app/javascript/images/background-cybre-light.png differ
diff --git a/app/javascript/images/background-cybre.png b/app/javascript/images/background-cybre.png
new file mode 100644
index 000000000..151fd5584
Binary files /dev/null and b/app/javascript/images/background-cybre.png differ
diff --git a/app/javascript/images/clippy_frame.png b/app/javascript/images/clippy_frame.png
new file mode 100644
index 000000000..7f2cd6a59
Binary files /dev/null and b/app/javascript/images/clippy_frame.png differ
diff --git a/app/javascript/images/clippy_wave.gif b/app/javascript/images/clippy_wave.gif
new file mode 100644
index 000000000..4d2e38a3d
Binary files /dev/null and b/app/javascript/images/clippy_wave.gif differ
diff --git a/app/javascript/images/elephant-fren.png b/app/javascript/images/elephant-fren.png
index 38b1e3cba..3b64edf08 100644
Binary files a/app/javascript/images/elephant-fren.png and b/app/javascript/images/elephant-fren.png differ
diff --git a/app/javascript/images/floppy-1.svg b/app/javascript/images/floppy-1.svg
new file mode 100644
index 000000000..08c1e4a6c
--- /dev/null
+++ b/app/javascript/images/floppy-1.svg
@@ -0,0 +1,64 @@
+
diff --git a/app/javascript/images/floppy-2.svg b/app/javascript/images/floppy-2.svg
new file mode 100644
index 000000000..d57a72a72
--- /dev/null
+++ b/app/javascript/images/floppy-2.svg
@@ -0,0 +1,64 @@
+
diff --git a/app/javascript/images/floppy-3.svg b/app/javascript/images/floppy-3.svg
new file mode 100644
index 000000000..2fe8ef399
--- /dev/null
+++ b/app/javascript/images/floppy-3.svg
@@ -0,0 +1,64 @@
+
diff --git a/app/javascript/images/header-cybre-alt.jpg b/app/javascript/images/header-cybre-alt.jpg
new file mode 100644
index 000000000..4d2b6b3a8
Binary files /dev/null and b/app/javascript/images/header-cybre-alt.jpg differ
diff --git a/app/javascript/images/header-cybre-colour.jpg b/app/javascript/images/header-cybre-colour.jpg
new file mode 100644
index 000000000..2d1b5b4f0
Binary files /dev/null and b/app/javascript/images/header-cybre-colour.jpg differ
diff --git a/app/javascript/images/header-cybre.jpeg b/app/javascript/images/header-cybre.jpeg
new file mode 100644
index 000000000..e9d7b336f
Binary files /dev/null and b/app/javascript/images/header-cybre.jpeg differ
diff --git a/app/javascript/images/icon_about.png b/app/javascript/images/icon_about.png
new file mode 100644
index 000000000..08b76dcd9
Binary files /dev/null and b/app/javascript/images/icon_about.png differ
diff --git a/app/javascript/images/icon_blocks.png b/app/javascript/images/icon_blocks.png
new file mode 100644
index 000000000..8b1490875
Binary files /dev/null and b/app/javascript/images/icon_blocks.png differ
diff --git a/app/javascript/images/icon_direct.png b/app/javascript/images/icon_direct.png
new file mode 100644
index 000000000..71e898a98
Binary files /dev/null and b/app/javascript/images/icon_direct.png differ
diff --git a/app/javascript/images/icon_docs.png b/app/javascript/images/icon_docs.png
new file mode 100644
index 000000000..6af1c8268
Binary files /dev/null and b/app/javascript/images/icon_docs.png differ
diff --git a/app/javascript/images/icon_domain_blocks.png b/app/javascript/images/icon_domain_blocks.png
new file mode 100644
index 000000000..ed3750485
Binary files /dev/null and b/app/javascript/images/icon_domain_blocks.png differ
diff --git a/app/javascript/images/icon_follow_requests.png b/app/javascript/images/icon_follow_requests.png
new file mode 100644
index 000000000..4123e2a69
Binary files /dev/null and b/app/javascript/images/icon_follow_requests.png differ
diff --git a/app/javascript/images/icon_home.png b/app/javascript/images/icon_home.png
new file mode 100644
index 000000000..66ce779c0
Binary files /dev/null and b/app/javascript/images/icon_home.png differ
diff --git a/app/javascript/images/icon_invite.png b/app/javascript/images/icon_invite.png
new file mode 100644
index 000000000..21156ec96
Binary files /dev/null and b/app/javascript/images/icon_invite.png differ
diff --git a/app/javascript/images/icon_keyboard_shortcuts.png b/app/javascript/images/icon_keyboard_shortcuts.png
new file mode 100644
index 000000000..d66f3939e
Binary files /dev/null and b/app/javascript/images/icon_keyboard_shortcuts.png differ
diff --git a/app/javascript/images/icon_likes.png b/app/javascript/images/icon_likes.png
new file mode 100644
index 000000000..17d7a9c59
Binary files /dev/null and b/app/javascript/images/icon_likes.png differ
diff --git a/app/javascript/images/icon_lists.png b/app/javascript/images/icon_lists.png
new file mode 100644
index 000000000..3828946e8
Binary files /dev/null and b/app/javascript/images/icon_lists.png differ
diff --git a/app/javascript/images/icon_local.png b/app/javascript/images/icon_local.png
new file mode 100644
index 000000000..5f82df395
Binary files /dev/null and b/app/javascript/images/icon_local.png differ
diff --git a/app/javascript/images/icon_logout.png b/app/javascript/images/icon_logout.png
new file mode 100644
index 000000000..7ff806f58
Binary files /dev/null and b/app/javascript/images/icon_logout.png differ
diff --git a/app/javascript/images/icon_mutes.png b/app/javascript/images/icon_mutes.png
new file mode 100644
index 000000000..c2225e966
Binary files /dev/null and b/app/javascript/images/icon_mutes.png differ
diff --git a/app/javascript/images/icon_notifications.png b/app/javascript/images/icon_notifications.png
new file mode 100644
index 000000000..0aaf5e68d
Binary files /dev/null and b/app/javascript/images/icon_notifications.png differ
diff --git a/app/javascript/images/icon_pin.png b/app/javascript/images/icon_pin.png
new file mode 100644
index 000000000..2329d8c54
Binary files /dev/null and b/app/javascript/images/icon_pin.png differ
diff --git a/app/javascript/images/icon_public.png b/app/javascript/images/icon_public.png
new file mode 100644
index 000000000..3c09460db
Binary files /dev/null and b/app/javascript/images/icon_public.png differ
diff --git a/app/javascript/images/icon_settings.png b/app/javascript/images/icon_settings.png
new file mode 100644
index 000000000..07f5c4519
Binary files /dev/null and b/app/javascript/images/icon_settings.png differ
diff --git a/app/javascript/images/icon_tos.png b/app/javascript/images/icon_tos.png
new file mode 100644
index 000000000..d0dbb13f7
Binary files /dev/null and b/app/javascript/images/icon_tos.png differ
diff --git a/app/javascript/images/logo-cybre-light.png b/app/javascript/images/logo-cybre-light.png
new file mode 100644
index 000000000..91908f6d3
Binary files /dev/null and b/app/javascript/images/logo-cybre-light.png differ
diff --git a/app/javascript/images/logo-cybre.png b/app/javascript/images/logo-cybre.png
new file mode 100644
index 000000000..41dd8fd4c
Binary files /dev/null and b/app/javascript/images/logo-cybre.png differ
diff --git a/app/javascript/images/start.png b/app/javascript/images/start.png
new file mode 100644
index 000000000..7843455b6
Binary files /dev/null and b/app/javascript/images/start.png differ
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index a4352faab..7dcc2d8e2 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -49,6 +49,8 @@ export const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST'
export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
+export const COMPOSE_DOODLE_SET = 'COMPOSE_DOODLE_SET';
+
export function changeCompose(text) {
return {
type: COMPOSE_CHANGE,
@@ -182,6 +184,13 @@ export function submitComposeFail(error) {
};
};
+export function doodleSet(options) {
+ return {
+ type: COMPOSE_DOODLE_SET,
+ options: options,
+ };
+};
+
export function uploadCompose(files) {
return function (dispatch, getState) {
if (getState().getIn(['compose', 'media_attachments']).size > 3) {
diff --git a/app/javascript/mastodon/components/icon_button.js b/app/javascript/mastodon/components/icon_button.js
index b96e48fd0..94e0dd86a 100644
--- a/app/javascript/mastodon/components/icon_button.js
+++ b/app/javascript/mastodon/components/icon_button.js
@@ -22,6 +22,7 @@ export default class IconButton extends React.PureComponent {
animate: PropTypes.bool,
overlay: PropTypes.bool,
tabIndex: PropTypes.string,
+ label: PropTypes.string,
};
static defaultProps = {
@@ -42,14 +43,18 @@ export default class IconButton extends React.PureComponent {
}
render () {
- const style = {
+ let style = {
fontSize: `${this.props.size}px`,
- width: `${this.props.size * 1.28571429}px`,
height: `${this.props.size * 1.28571429}px`,
lineHeight: `${this.props.size}px`,
...this.props.style,
...(this.props.active ? this.props.activeStyle : {}),
};
+ if (!this.props.label) {
+ style.width = `${this.props.size * 1.28571429}px`;
+ } else {
+ style.textAlign = 'left';
+ }
const {
active,
@@ -104,7 +109,8 @@ export default class IconButton extends React.PureComponent {
style={style}
tabIndex={tabIndex}
>
-
+
+ {this.props.label}
)}
diff --git a/app/javascript/mastodon/components/relative_timestamp.js b/app/javascript/mastodon/components/relative_timestamp.js
index 57d99dd19..164044e1e 100644
--- a/app/javascript/mastodon/components/relative_timestamp.js
+++ b/app/javascript/mastodon/components/relative_timestamp.js
@@ -60,6 +60,8 @@ const getUnitDelay = units => {
}
};
+const fallbackFormat = new Intl.DateTimeFormat('en', shortDateFormatOptions);
+
export const timeAgoString = (intl, date, now, year) => {
const delta = now - date.getTime();
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index d420a2cb9..b7fcc846b 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -365,14 +365,15 @@ class Status extends ImmutablePureComponent {
The extended description has not been set up yet.
+ features: + humane_approach_body: Learning from failures of other networks, Mastodon aims to make ethical design choices to combat the misuse of social media. + humane_approach_title: A more humane approach + not_a_product_body: Mastodon is not a commercial network. No advertising, no data mining, no walled gardens. There is no central authority. + not_a_product_title: You’re a person, not a product + real_conversation_body: With 512 characters at your disposal and support for granular content and media warnings, you can express yourself the way you want to. + real_conversation_title: Built for real conversation + within_reach_body: Multiple apps for iOS, Android, and other platforms thanks to a developer-friendly API ecosystem allow you to keep up with your friends anywhere. + within_reach_title: Always within reach + find_another_instance: Find another instance + generic_description: "%{domain} is one server in the network" + hosted_on: Mastodon hosted on %{domain} + learn_more: Learn more + other_instances: Instance list + source_code: Source code + status_count_after: pings + status_count_before: Who authored + user_count_after: users + user_count_before: Home to + what_is_mastodon: What is Mastodon? + accounts: + follow: Follow + followers: Followers + following: Following + media: Media + nothing_here: There is nothing here! + people_followed_by: People whom %{name} follows + people_who_follow: People who follow %{name} + posts: Pings + posts_with_replies: Pings with replies + remote_follow: Remote follow + reserved_username: The username is reserved + roles: + admin: Admin + unfollow: Unfollow + admin: + accounts: + are_you_sure: Are you sure? + confirm: Confirm + confirmed: Confirmed + disable_two_factor_authentication: Disable 2FA + display_name: Display name + domain: Domain + edit: Edit + email: E-mail + feed_url: Feed URL + followers: Followers + follows: Follows + inbox_url: Inbox URL + ip: IP + location: + all: All + local: Local + remote: Remote + title: Location + media_attachments: Media attachments + moderation: + all: All + silenced: Silenced + suspended: Suspended + title: Moderation + most_recent_activity: Most recent activity + most_recent_ip: Most recent IP + not_subscribed: Not subscribed + order: + alphabetic: Alphabetic + most_recent: Most recent + title: Order + outbox_url: Outbox URL + perform_full_suspension: Perform full suspension + profile_url: Profile URL + protocol: Protocol + public: Public + push_subscription_expires: PuSH subscription expires + redownload: Refresh avatar + reset: Reset + reset_password: Reset password + resubscribe: Resubscribe + salmon_url: Salmon URL + search: Search + show: + created_reports: Reports created by this account + report: report + targeted_reports: Reports made about this account + silence: Silence + statuses: Statuses + subscribe: Subscribe + title: Accounts + undo_silenced: Undo silence + undo_suspension: Undo suspension + unsubscribe: Unsubscribe + username: Username + web: Web + domain_blocks: + add_new: Add new + created_msg: Domain block is now being processed + destroyed_msg: Domain block has been undone + domain: Domain + new: + create: Create block + hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. + severity: + desc_html: "Silence will make the account's posts invisible to anyone who isn't following them. Suspend will remove all of the account's content, media, and profile data. Use None if you just want to reject media files." + noop: None + silence: Silence + suspend: Suspend + title: New domain block + reject_media: Reject media files + reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + severities: + noop: None + silence: Silence + suspend: Suspend + severity: Severity + show: + affected_accounts: + one: One account in the database affected + other: "%{count} accounts in the database affected" + retroactive: + silence: Unsilence all existing accounts from this domain + suspend: Unsuspend all existing accounts from this domain + title: Undo domain block for %{domain} + undo: Undo + title: Domain Blocks + undo: Undo + instances: + account_count: Known accounts + domain_name: Domain + title: Known Instances + reports: + action_taken_by: Action taken by + are_you_sure: Are you sure? + comment: + label: Comment + none: None + delete: Delete + id: ID + mark_as_resolved: Mark as resolved + nsfw: + 'false': Unhide media attachments + 'true': Hide media attachments + report: 'Report #%{id}' + report_contents: Contents + reported_account: Reported account + reported_by: Reported by + resolved: Resolved + silence_account: Silence account + status: Status + suspend_account: Suspend account + target: Target + title: Reports + unresolved: Unresolved + view: View + settings: + bootstrap_timeline_accounts: + desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins. + title: Default follows for new users + contact_information: + email: Business e-mail + username: Contact username + registrations: + closed_message: + desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags + title: Closed registration message + deletion: + desc_html: Allow anyone to delete their account + title: Open account deletion + open: + desc_html: Allow anyone to create an account + title: Open registration + site_description: + desc_html: Introductory paragraph on the frontpage and in meta tags. You can use HTML tags, in particular<a>
and <em>
.
+ title: Instance description
+ site_description_extended:
+ desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags
+ title: Custom extended information
+ site_terms:
+ desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags
+ title: Custom terms of service
+ site_title: Instance name
+ timeline_preview:
+ desc_html: Display public timeline on landing page
+ title: Timeline preview
+ title: Site Settings
+ statuses:
+ back_to_account: Back to account page
+ batch:
+ delete: Delete
+ nsfw_off: NSFW OFF
+ nsfw_on: NSFW ON
+ execute: Execute
+ failed_to_execute: Failed to execute
+ media:
+ hide: Hide media
+ show: Show media
+ title: Media
+ no_media: No media
+ title: Account statuses
+ with_media: With media
+ subscriptions:
+ callback_url: Callback URL
+ confirmed: Confirmed
+ expires_in: Expires in
+ last_delivery: Last delivery
+ title: WebSub
+ topic: Topic
+ title: Administration
+ admin_mailer:
+ new_report:
+ body: "%{reporter} has reported %{target}"
+ subject: New report for %{instance} (#%{id})
+ application_mailer:
+ salutation: "%{name},"
+ settings: 'Change e-mail preferences: %{link}'
+ signature: Mastodon notifications from %{instance}
+ view: 'View:'
+ applications:
+ created: Application successfully created
+ destroyed: Application successfully deleted
+ invalid_url: The provided URL is invalid
+ regenerate_token: Regenerate access token
+ token_regenerated: Access token successfully regenerated
+ warning: Be very careful with this data. Never share it with anyone!
+ your_token: Your access token
+ auth:
+ agreement_html: By signing up you agree to our terms of service and privacy policy.
+ change_password: Security
+ delete_account: Delete account
+ delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation.
+ didnt_get_confirmation: Didn't receive confirmation instructions?
+ forgot_password: Forgot your password?
+ invalid_reset_password_token: Password reset token is invalid or expired. Please try again.
+ login: Jack in
+ logout: Jack out
+ register: Apply for upload
+ resend_confirmation: Resend confirmation instructions
+ reset_password: Reset password
+ set_new_password: Set new password
+ authorize_follow:
+ error: Unfortunately, there was an error looking up the remote account
+ follow: Follow
+ follow_request: 'You have sent a follow request to:'
+ following: 'Success! You are now following:'
+ post_follow:
+ close: Or, you can just close this window.
+ return: Return to the user's profile
+ web: Go to web
+ title: Follow %{acct}
+ datetime:
+ distance_in_words:
+ about_x_hours: "%{count}h"
+ about_x_months: "%{count}mo"
+ about_x_years: "%{count}y"
+ almost_x_years: "%{count}y"
+ half_a_minute: Just now
+ less_than_x_minutes: "%{count}m"
+ less_than_x_seconds: Just now
+ over_x_years: "%{count}y"
+ x_days: "%{count}d"
+ x_minutes: "%{count}m"
+ x_months: "%{count}mo"
+ x_seconds: "%{count}s"
+ deletes:
+ bad_password_msg: Nice try, hackers! Incorrect password
+ confirm_password: Enter your current password to verify your identity
+ description_html: This will permanently, irreversibly remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations.
+ proceed: Delete account
+ success_msg: Your account was successfully deleted
+ warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases.
+ warning_title: Disseminated content availability
+ errors:
+ '403': You don't have permission to view this page.
+ '404': The page you were looking for doesn't exist.
+ '410': The page you were looking for doesn't exist anymore.
+ '422':
+ content: Security verification failed. Are you blocking cookies?
+ title: Security verification failed
+ '429': Throttled
+ noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the native apps for Mastodon for your platform.
+ exports:
+ blocks: You block
+ csv: CSV
+ follows: You follow
+ mutes: You mute
+ storage: Media storage
+ followers:
+ domain: Domain
+ explanation_html: If you want to ensure the privacy of your pings , you must be aware of who is following you. Your private pings are delivered to all instances where you have followers. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances.
+ followers_count: Number of followers
+ lock_link: Lock your account
+ purge: Remove from followers
+ success:
+ one: In the process of soft-blocking followers from one domain...
+ other: In the process of soft-blocking followers from %{count} domains...
+ true_privacy_html: Please mind that true privacy can only be achieved with end-to-end encryption.
+ unlocked_warning_html: Anyone can follow you to immediately view your private pings. %{lock_link} to be able to review and reject followers.
+ unlocked_warning_title: Your account is not locked
+ generic:
+ changes_saved_msg: Changes successfully saved!
+ powered_by: powered by %{link}
+ save_changes: Save changes
+ validation_errors:
+ one: Something isn't quite right yet! Please review the error below
+ other: Something isn't quite right yet! Please review %{count} errors below
+ imports:
+ preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking.
+ success: Your data was successfully uploaded and will now be processed in due time
+ types:
+ blocking: Blocking list
+ following: Following list
+ muting: Muting list
+ upload: Upload
+ landing_strip_html: "%{name} is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse."
+ landing_strip_signup_html: If you don't, you can sign up here.
+ media_attachments:
+ validations:
+ images_and_video: Cannot attach a video to a ping that already contains images
+ too_many: Cannot attach more than 4 files
+ notification_mailer:
+ digest:
+ body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
+ mention: "%{name} mentioned you in:"
+ new_followers_summary:
+ one: You have acquired one new follower! Yay!
+ other: You have gotten %{count} new followers! Amazing!
+ subject:
+ one: "1 new notification since your last visit \U0001F418"
+ other: "%{count} new notifications since your last visit \U0001F418"
+ favourite:
+ body: 'Your ping was florped by %{name}:'
+ subject: "%{name} florped your ping"
+ follow:
+ body: "%{name} is now following you!"
+ subject: "%{name} is now following you"
+ follow_request:
+ body: "%{name} has requested to follow you"
+ subject: 'Pending follower: %{name}'
+ mention:
+ body: 'You were mentioned by %{name} in:'
+ subject: You were mentioned by %{name}
+ reblog:
+ body: 'Your ping was relayed by %{name}:'
+ subject: "%{name} relayed your ping"
+ number:
+ human:
+ decimal_units:
+ format: "%n%u"
+ units:
+ billion: B
+ million: M
+ quadrillion: Q
+ thousand: K
+ trillion: T
+ unit: ''
+ pagination:
+ next: Next
+ prev: Prev
+ truncate: "…"
+ push_notifications:
+ favourite:
+ title: "%{name} favourited your status"
+ follow:
+ title: "%{name} is now following you"
+ group:
+ title: "%{count} notifications"
+ mention:
+ action_boost: Boost
+ action_expand: Show more
+ action_favourite: Favourite
+ title: "%{name} mentioned you"
+ reblog:
+ title: "%{name} boosted your status"
+ remote_follow:
+ acct: Enter your username@domain you want to follow from
+ missing_resource: Could not find the required redirect URL for your account
+ proceed: Proceed to follow
+ prompt: 'You are going to follow:'
+ sessions:
+ activity: Last activity
+ browser: Browser
+ browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ firefox: Firefox
+ generic: Unknown browser
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
+ nokia: Nokia S40 Ovi Browser
+ opera: Opera
+ phantom_js: PhantomJS
+ qq: QQ Browser
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
+ current_session: Current session
+ description: "%{browser} on %{platform}"
+ explanation: These are the web browsers currently logged in to your cybre.space account.
+ ip: IP
+ platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: Linux
+ mac: Mac
+ other: unknown platform
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
+ revoke: Revoke
+ revoke_success: Session successfully revoked
+ title: Sessions
+ settings:
+ authorized_apps: Authorized apps
+ back: Back to Mastodon
+ delete: Account deletion
+ development: Development
+ edit_profile: edit ~/.profile
+ export: Data export
+ followers: Authorized followers
+ import: Import
+ preferences: Preferences
+ settings: Settings
+ two_factor_authentication: Two-factor Authentication
+ your_apps: Your applications
+ statuses:
+ open_in_web: Open in web
+ over_character_limit: character limit of %{max} exceeded
+ pin_errors:
+ limit: You have already pinned the maximum number of pings
+ ownership: Someone else's ping cannot be pinned
+ private: Non-public pings cannot be pinned
+ reblog: A boost cannot be pinned
+ show_more: Show more
+ visibilities:
+ private: Followers-only
+ private_long: Only show to followers
+ public: Public
+ public_long: Everyone can see
+ unlisted: Unlisted
+ unlisted_long: Everyone can see, but not listed on public timelines
+ stream_entries:
+ click_to_show: Click to show
+ pinned: Pinned ping
+ reblogged: relayed
+ sensitive_content: Sensitive content
+ terms:
+ body_html: |
+ We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.
+ +When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.
+ +When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.
+ +Any of the information we collect from you may be used in one of the following ways:
+ +We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.
+ +We will make a good faith effort to:
+ +Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.
+ +We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.
+ +We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.
+ +Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.
+ +Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.
+ +This online privacy policy applies only to information collected through our site and not to information collected offline.
+ +By using our site, you consent to our web site privacy policy.
+ +If we decide to change our privacy policy, we will post those changes on this page.
+ +This document is CC-BY-SA. It was last updated May 31, 2013.
+ +Originally adapted from the Discourse privacy policy.
+ title: "%{instance} Terms of Service and Privacy Policy" + themes: + default: Cybrespace + mastodon: Mastodon + win95: Masto 95 + time: + formats: + default: "%b %d, %Y, %H:%M" + two_factor_authentication: + code_hint: Enter the code generated by your authenticator app to confirm + description_html: If you enable two-factor authentication, logging in will require you to be in possession of your phone, which will generate tokens for you to enter. + disable: Disable + enable: Enable + enabled: Two-factor authentication is enabled + enabled_success: Two-factor authentication successfully enabled + generate_recovery_codes: Generate recovery codes + instructions_html: "Scan this QR code into Google Authenticator or a similiar TOTP app on your phone. From now on, that app will generate tokens that you will have to enter when logging in." + lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated. + manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:' + recovery_codes: Backup recovery codes + recovery_codes_regenerated: Recovery codes successfully regenerated + recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents. + setup: Set up + wrong_code: The entered code was invalid! Are server time and device time correct? + users: + invalid_email: The e-mail address is invalid + invalid_otp_token: Invalid two-factor code + signed_in_as: 'Signed in as:' diff --git a/config/locales/en.yml b/config/locales/en.yml index a6e7e70a5..f8dc59160 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -931,8 +931,11 @@ en: title: "%{instance} Terms of Service and Privacy Policy" themes: contrast: Mastodon (High contrast) - default: Mastodon (Dark) - mastodon-light: Mastodon (Light) + default: Cybrespace + mastodon: Mastodon (Dark) + mastodon-light: Mastodon (light) + win95: Windows 95 + light: Cybre Lite time: formats: default: "%b %d, %Y, %H:%M" diff --git a/config/locales/simple_form.en-CY.yml b/config/locales/simple_form.en-CY.yml new file mode 100644 index 000000000..44acd8a39 --- /dev/null +++ b/config/locales/simple_form.en-CY.yml @@ -0,0 +1,127 @@ +--- +en-CY: + simple_form: + hints: + account_warning_preset: + text: You can use ping syntax, such as URLs, hashtags and mentions + admin_account_action: + send_email_notification: The user will receive an explanation of what happened with their account + text_html: Optional. You can use ping syntax. You can add warning presets to save time + type_html: Choose what to do with %{acct} + warning_preset_id: Optional. You can still add custom text to end of the preset + defaults: + autofollow: People who sign up through the invite will automatically follow you + avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px + bot: This account mainly performs automated actions and might not be monitored + context: One or multiple contexts where the filter should apply + digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence + discoverable_html: The directory lets people find accounts based on interests and activity. Requires at least %{min_followers} followers + email: You will be sent a confirmation e-mail + fields: You can have up to 4 items displayed as a table on your profile + header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px + inbox_url: Copy the URL from the frontpage of the relay you want to use + irreversible: Filtered pings will disappear irreversibly, even if filter is later removed + locale: The language of the user interface, e-mails and push notifications + locked: Requires you to manually approve followers + password: Use at least 8 characters + phrase: Will be matched regardless of casing in text or content warning of a pings + scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. + setting_aggregate_reblogs: Do not show new relays for pings that have been recently relayed (only affects newly-received relays) + setting_default_language: The language of your pings can be detected automatically, but it's not always accurate + setting_display_media_default: Hide media marked as sensitive + setting_display_media_hide_all: Always hide all media + setting_display_media_show_all: Always show media marked as sensitive + setting_hide_network: Who you follow and who follows you will not be shown on your profile + setting_noindex: Affects your public profile and status pages + setting_theme: Affects how Mastodon looks when you're logged in from any device. + username: Your username will be unique on %{domain} + whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word + imports: + data: CSV file exported from another Mastodon instance + sessions: + otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' + user: + chosen_languages: When checked, only pings in selected languages will be displayed in public timelines + labels: + account: + fields: + name: Label + value: Content + account_warning_preset: + text: Preset text + admin_account_action: + send_email_notification: Notify the user per e-mail + text: Custom warning + type: Action + types: + disable: Disable + none: Do nothing + silence: Silence + suspend: Suspend and irreversibly delete account data + warning_preset_id: Use a warning preset + defaults: + autofollow: Invite to follow your account + avatar: Avatar + bot: This is a bot account + chosen_languages: Filter languages + confirm_new_password: Confirm new password + confirm_password: Confirm password + context: Filter contexts + current_password: Current password + data: Data + discoverable: List this account on the directory + display_name: Display name + email: E-mail address + expires_in: Expire after + fields: Profile metadata + header: Header + inbox_url: URL of the relay inbox + irreversible: Drop instead of hide + locale: Interface language + locked: Lock account + max_uses: Max number of uses + new_password: New password + note: Bio + otp_attempt: Two-factor code + password: Password + phrase: Keyword or phrase + setting_aggregate_reblogs: Group relays in timelines + setting_auto_play_gif: Auto-play animated GIFs + setting_boost_modal: Show confirmation dialog before relaying + setting_default_language: Posting language + setting_default_privacy: Post privacy + setting_default_sensitive: Always mark media as sensitive + setting_delete_modal: Show confirmation dialog before deleting a ping + setting_display_media: Media display + setting_display_media_default: Default + setting_display_media_hide_all: Hide all + setting_display_media_show_all: Show all + setting_expand_spoilers: Always expand pings marked with content warnings + setting_hide_network: Hide your network + setting_noindex: Opt-out of search engine indexing + setting_reduce_motion: Reduce motion in animations + setting_system_font_ui: Use system's default font + setting_theme: Site theme + setting_unfollow_modal: Show confirmation dialog before unfollowing someone + severity: Severity + type: Import type + username: Username + username_or_email: Username or Email + whole_word: Whole word + interactions: + must_be_follower: Block notifications from non-followers + must_be_following: Block notifications from people you don't follow + must_be_following_dm: Block direct messages from people you don't follow + notification_emails: + digest: Send digest e-mails + favourite: Send e-mail when someone favourites your status + follow: Send e-mail when someone follows you + follow_request: Send e-mail when someone requests to follow you + mention: Send e-mail when someone mentions you + reblog: Send e-mail when someone relays your status + report: Send e-mail when a new report is submitted + 'no': 'No' + required: + mark: "*" + text: required + 'yes': 'Yes' diff --git a/config/settings.yml b/config/settings.yml index 4f7c2c8f3..4f0aa9481 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -2,7 +2,7 @@ # important settings can be changed from the admin interface. defaults: &defaults - site_title: Mastodon + site_title: 'Cybrespace' site_short_description: '' site_description: '' site_extended_description: '' diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459..05e7943be 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,6 @@ -default: styles/application.scss +default: styles/cybre.scss +mastodon: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss +light: styles/cybre-light.scss +win95: styles/win95.scss diff --git a/db/migrate/20171026200500_en_to_en_cy.rb b/db/migrate/20171026200500_en_to_en_cy.rb new file mode 100644 index 000000000..0035e1dcd --- /dev/null +++ b/db/migrate/20171026200500_en_to_en_cy.rb @@ -0,0 +1,17 @@ +class EnToEnCy < ActiveRecord::Migration[5.1] + def up + User.find_each do |user| + if user.locale == 'en' + user.update(locale: 'en-CY') + end + end + end + + def down + User.find_each do |user| + if user.locale == 'en-CY' + user.update(locale: 'en') + end + end + end +end diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index ee9657b0e..9538a5e0d 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -388,6 +388,28 @@ namespace :mastodon do end end + desc 'Machine-readably add a user by providing their email, username and initial password.' \ + 'The user will receive a confirmation email.' + task add_user_automatic: :environment do + print 'Enter email: ' + email = STDIN.gets.chomp + + print 'Enter username: ' + username = STDIN.gets.chomp + + print 'Enter password: ' + password = STDIN.gets.chomp + + user = User.new(email: email, password: password, account_attributes: { username: username }) + if user.save + puts 'User added and confirmation mail sent to user\'s email address.' + else + user.errors.each do |key, val| + STDERR.puts "#{key}: #{val}" + end + end + end + namespace :webpush do desc 'Generate VAPID key' task generate_vapid_key: :environment do diff --git a/package.json b/package.json index 5fa6fa8b7..96f451679 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@babel/runtime": "^7.2.0", "@gfx/zopfli": "^1.0.10", "array-includes": "^3.0.3", + "atrament": "^0.2.3", "autoprefixer": "^9.4.3", "axios": "^0.18.0", "babel-core": "^7.0.0-bridge.0", @@ -134,7 +135,8 @@ "webpack-bundle-analyzer": "^3.0.3", "webpack-cli": "^3.1.2", "webpack-merge": "^4.1.5", - "websocket.js": "^0.1.12" + "websocket.js": "^0.1.12", + "what-input": "^4.3.1" }, "devDependencies": { "babel-eslint": "^10.0.1", diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 7a99a1964..8e9c26b58 100644 Binary files a/public/android-chrome-192x192.png and b/public/android-chrome-192x192.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index b12aa55a3..691c1f20a 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/background-cybre.png b/public/background-cybre.png new file mode 100644 index 000000000..151fd5584 Binary files /dev/null and b/public/background-cybre.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml index 7fdab5058..fcf794bc2 100644 --- a/public/browserconfig.xml +++ b/public/browserconfig.xml @@ -3,7 +3,7 @@