set important HTML attributes via code, not translations

pull/1/head
ansuz 4 years ago
parent eb53d9d256
commit 4ac10aa358

@ -12,6 +12,16 @@ define([
return e;
};
Pages.externalLink = function (el, href) {
if (!el) { return el; }
el.setAttribute("rel", "noopener noreferrer");
el.setAttribute("target", "_blank");
if (typeof(href) === 'string') {
el.setAttribute("href", href);
}
return el;
};
var languageSelector = function () {
var options = [];
var languages = Msg._languages;

@ -80,6 +80,12 @@ define([
});
}
var supportText = Pages.setHTML(h('span'), Msg.home_support);
Pages.externalLink(supportText.querySelector('a'), "https://docs.cryptpad.fr/en/how_to_contribute.html");
var opensource = Pages.setHTML(h('p'), Msg.home_opensource);
Pages.externalLink(opensource.querySelector('a'), "https://github.com/xwiki-labs/cryptpad");
var blocks = [
h('div.row.cp-page-section', [
h('div.col-sm-6',
@ -103,7 +109,7 @@ define([
h('div.row.cp-page-section', [
h('div.col-sm-6', [
h('h2', Msg.home_opensource_title),
Pages.setHTML(h('p'), Msg.home_opensource),
opensource,
h('img.small-logo.cp-img-invert', {
src: '/customize/images/logo_AGPLv3.svg',
alt: 'APGL3 License Logo'
@ -111,7 +117,7 @@ define([
]),
h('div.col-sm-6', [
h('h2', Msg.home_support_title),
Pages.setHTML(h('span'), Msg.home_support),
supportText,
subscribeButton,
Pages.crowdfundingButton(function () {
Feedback.send('HOME_SUPPORT_CRYPTPAD');

@ -4,12 +4,18 @@ define([
'/customize/pages.js'
], function (h, Msg, Pages) {
return function () {
var whatWeKnow = Pages.setHTML(h('p'), Msg.policy_whatweknow_p1);
Pages.externalLink(whatWeKnow.querySelector('a'), "https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending");
var vpn = Pages.setHTML(h('p'), Msg.policy_choices_vpn);
Pages.externalLink(vpn.querySelector('a'), 'https://www.torproject.org/download/');
return h('div#cp-main', [
Pages.infopageTopbar(),
h('div.container.cp-container.cp-privacy',[
h('div.row.cp-page-title', h('h1', Msg.policy_title)),
h('h2', Msg.policy_whatweknow),
Pages.setHTML(h('p'), Msg.policy_whatweknow_p1),
whatWeKnow,
h('h2', Msg.policy_howweuse),
h('p', Msg.policy_howweuse_p1),
@ -26,7 +32,7 @@ define([
h('h2', Msg.policy_choices),
h('p', Msg.policy_choices_open),
Pages.setHTML(h('p'), Msg.policy_choices_vpn),
vpn
]),
Pages.infopageFooter()
]);

@ -9,6 +9,12 @@ define([
return function () {
var urlArgs = Config.requireConf.urlArgs;
var tos = $(UI.createCheckbox('accept-terms')).find('.cp-checkmark-label').append(Msg.register_acceptTerms).parent()[0]
$(tos).find('a').attr({
href: '/terms.html',
tabindex: '-1',
});
return [h('div#cp-main', [
Pages.infopageTopbar(),
h('div.container.cp-container', [
@ -47,7 +53,7 @@ define([
UI.createCheckbox('import-recent', Msg.register_importRecent, true)
]),
h('div.checkbox-container', [
$(UI.createCheckbox('accept-terms')).find('.cp-checkmark-label').append(Msg.register_acceptTerms).parent()[0]
tos,
]),
h('button#register', Msg.login_register)
])

@ -4,7 +4,8 @@ define([
'/customize/messages.js',
'/customize/pages.js',
'/common/common-feedback.js',
], function (Config, h, Msg, Pages, Feedback) {
'/customize/pages.js',
], function (Config, h, Msg, Pages, Feedback, Pages) {
var urlArgs = Config.requireConf.urlArgs;
var logoLink = function (alt, src, url, cls) {
@ -17,6 +18,9 @@ define([
};
return function () {
var xwiki_info = Pages.setHTML(h('span'), Msg.whatis_xwiki_info);
Pages.externalLink(xwiki_info.querySelector('a'), "https://xwiki.com");
return h('div#cp-main', [
Pages.infopageTopbar(),
h('div.container.cp-container', [
@ -52,7 +56,7 @@ define([
h('div.row.cp-page-section', [
h('div.col-md-6', [
Pages.setHTML(h('h2'), Msg.whatis_drive),
Pages.setHTML(h('spam'), Msg.whatis_drive_info),
Pages.setHTML(h('span'), Msg.whatis_drive_info),
]),
h('div.col-md-6', [
h('img.cp-shadow', {
@ -91,7 +95,7 @@ define([
h('div.row.cp-page-section', [
h('div.col-md-6', [
Pages.setHTML(h('h2'), Msg.whatis_xwiki),
Pages.setHTML(h('spam'), Msg.whatis_xwiki_info),
xwiki_info,
]),
h('div.col-md-6.small-logos', [
h('img', {

@ -0,0 +1,20 @@
@import (reference) "../include/colortheme-all.less";
@import (reference) "../include/font.less";
html, body {
.font_main();
margin: 0px;
padding: 0px;
background-color: @cp_static-bg !important;
color: @cryptpad_text_col;
font-family: "IBM Plex Mono";
a {
color: @cryptpad_color_link;
}
}
body {
width: 50%;
min-width: 650px;
margin: auto;
}

@ -3,6 +3,9 @@ var EN = require("../www/common/translations/messages.json");
var simpleTags = [
'<br>',
'<br />',
'<br/>',
'<a href="/login/">', // XXX
'<a href="/register/">', // XXX
];
['a', 'b', 'em', 'p', 'i'].forEach(function (tag) {

@ -1257,10 +1257,13 @@ define([
Messages.dontShowAgain
]);
var footerSel = 'div.cp-corner-footer';
var popup = h('div.cp-corner-container', [
setHTML(h('div.cp-corner-text'), text),
h('div.cp-corner-actions', actions),
setHTML(h('div.cp-corner-footer'), footer),
(typeof(footer) === 'string'?
setHTML(h(footerSel), footer):
h(footerSel, footer)),
opts.dontShowAgain ? dontShowAgain : undefined
]);

@ -714,8 +714,14 @@ define([
callback(err);
return void UI.warn(Messages.fm_forbidden);
}
var cMsg = common.isLoggedIn() ? Messages.movedToTrash : Messages.deleted;
var msg = common.fixLinks($('<div>').html(cMsg));
var msg;
if (common.isLoggedIn()) {
msg = Pages.setHTML(h('div'), Messages.movedToTrash);
$(msg).find('a').attr('href', '/drive/');
common.fixLinks(msg);
} else {
msg = h('div', Messages.deleted);
}
UI.alert(msg);
callback();
return;
@ -2715,7 +2721,7 @@ define([
common.openURL(priv.accounts.donateURL);
Feedback.send('CROWDFUNDING_YES');
});
$(modal.popup).find('a').click(function (e) {
$(modal.popup).find('a').click(function (e) { // XXX do we really need both a link and a button? (the link is the less popular option)
e.stopPropagation();
e.preventDefault();
modal.delete();
@ -2761,7 +2767,7 @@ define([
priv.pathname.indexOf('/drive/') !== -1 ? Messages.autostore_sf :
Messages.autostore_pad;
var text = Messages._getKey('autostore_notstored', [typeMsg]);
var footer = Messages.autostore_settings;
var footer = Pages.setHTML(h('span'), Messages.autostore_settings);
var hide = h('button.cp-corner-cancel', Messages.autostore_hide);
var store = h('button.cp-corner-primary', Messages.autostore_store);

@ -1,5 +1,10 @@
define([
'/common/common-language.js',
'less!/customize/src/less2/pages/page-feedback.less',
], function (Language) {
Language.applyTranslation();
var optoutLink = document.querySelector('#optout a');
if (optoutLink) {
optoutLink.setAttribute('href', '/settings/');
}
});

@ -11,9 +11,9 @@ body {
</style>
</head>
<body>
<p data-localization="feedback_about">If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions</p>
<p data-localization="feedback_about">If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions.</p>
<p data-localization="feedback_privacy">We care about your privacy, and at the same time we want CryptPad to be very easy to use.
We use this file to figure out which UI features matter to our users, by requesting it along with a parameter specifying which action was taken.</p>
<p data-localization="feedback_optout">If you would like to opt out, visit <a href="/settings/">your user settings page</a>, where you'll find a checkbox to enable or disable user feedback</p>
<p data-localization="feedback_optout" id="optout">If you would like to opt out, visit <a href="/settings/">your user settings page</a>, where you'll find a checkbox to enable or disable user feedback.</p>

@ -7,7 +7,8 @@ define([
'/common/common-util.js',
'/common/common-constants.js',
'/customize/messages.js',
], function($, h, Hash, UI, UIElements, Util, Constants, Messages) {
'/customize/pages.js',
], function($, h, Hash, UI, UIElements, Util, Constants, Messages, Pages) {
var handlers = {};
@ -395,7 +396,10 @@ define([
handlers['SAFE_LINKS_DEFAULT'] = function (common, data) {
var content = data.content;
content.getFormatText = function () {
return Messages.settings_safeLinkDefault;
var msg = Pages.setHTML(h('span'), Messages.settings_safeLinkDefault);
var i = msg.querySelector('i');
if (i) { i.classList = 'fa fa-shhare-alt'; }
return msg.innerHTML;
};
content.handler = function () {

@ -16,6 +16,7 @@ define([
'/common/metadata-manager.js',
'/customize/application_config.js',
'/customize/pages.js',
'/common/common-realtime.js',
'/common/common-util.js',
'/common/common-hash.js',
@ -23,7 +24,8 @@ define([
'/common/common-interface.js',
'/common/common-feedback.js',
'/common/common-language.js',
'/bower_components/localforage/dist/localforage.min.js'
'/bower_components/localforage/dist/localforage.min.js',
'/common/hyperscript.js',
], function (
$,
nThen,
@ -41,6 +43,7 @@ define([
MT,
MetadataMgr,
AppConfig,
Pages,
CommonRealtime,
Util,
Hash,
@ -48,7 +51,8 @@ define([
UI,
Feedback,
Language,
localForage
localForage,
h
) {
// Chainpad Netflux Inner
var funcs = {};
@ -765,7 +769,14 @@ define([
UI.addTooltips();
ctx.sframeChan.on("EV_PAD_NODATA", function () {
UI.errorLoadingScreen(Messages.safeLinks_error);
var error = Pages.setHTML(h('span'), Messages.safeLinks_error);
var i = error.querySelector('i');
if (i) { i.classList = 'fa fa-shhare-alt'; }
var a = error.querySelector('a');
if (a) {
a.setAttribute('href', "https://docs.cryptpad.fr/en/user_guide/user_account.html#confidentiality");
}
UI.errorLoadingScreen(error);
});
ctx.sframeChan.on("EV_PAD_PASSWORD", function (cfg) {

@ -11,8 +11,9 @@ define([
'/common/hyperscript.js',
'/common/messenger-ui.js',
'/customize/messages.js',
'/customize/pages.js',
], function ($, Config, ApiConfig, UIElements, UI, Hash, Util, Feedback, MT, h,
MessengerUI, Messages) {
MessengerUI, Messages, Pages) {
var Common;
var Bar = {
@ -958,15 +959,24 @@ MessengerUI, Messages) {
var todo = function (e, overLimit) {
if (e) { return void console.error("Unable to get the pinned usage", e); }
if (overLimit) {
$limit.show().click(function () {
if (ApiConfig.allowSubscriptions && Config.upgradeURL) {
var key = 'pinLimitReachedAlert'; // Msg.pinLimitReachedAlert
if (!ApiConfig.allowSubscriptions) {
key = 'pinLimitReachedAlertNoAccounts'; // Msg.pinLimitReachedAlertNoAccounts
var msg = Pages.setHTML(h('span'), Messages.pinLimitReachedAlert);
$(msg).find('a').attr({
target: '_blank',
href: Config.upgradeURL,
});
UI.alert(msg);
} else {
UI.alert(Messages.pinLimitReachedAlertNoAccounts);
}
$limit.show().click(function () {
UI.alert(Messages._getKey(key, [encodeURIComponent(l.hostname)]), null, true);
});
}
};
//todo(void 0, true);
Common.isOverPinLimit(todo);
return $limit;

@ -70,7 +70,7 @@
"formattedGB": "{0} GB",
"formattedKB": "{0} KB",
"pinLimitReached": "You've reached your storage limit",
"pinLimitReachedAlert": "You've reached your storage limit. New pads won't be stored in your CryptDrive.<br>You can either remove pads from your CryptDrive or <a href=\"https://accounts.cryptpad.fr/#!on={0}\" target=\"_blank\">subscribe to a premium offer</a> to increase your limit.",
"pinLimitReachedAlert": "You've reached your storage limit. New pads won't be stored in your CryptDrive.<br>You can either remove pads from your CryptDrive or <a>subscribe to a premium offer</a> to increase your limit.",
"pinLimitReachedAlertNoAccounts": "You've reached your storage limit",
"pinLimitNotPinned": "You've reached your storage limit.<br>This pad is not stored in your CryptDrive.",
"pinLimitDrive": "You've reached your storage limit.<br>You can't create new pads.",
@ -87,7 +87,7 @@
"saveTitle": "Save the title (enter)",
"forgetButton": "Delete",
"forgetPrompt": "Clicking OK will move this pad to your trash. Are you sure?",
"movedToTrash": "That pad has been moved to the trash.<br><a href=\"/drive/\">Access my Drive</a>",
"movedToTrash": "That pad has been moved to the trash.<br><a>Access my Drive</a>",
"shareButton": "Share",
"shareSuccess": "Copied link to clipboard",
"userListButton": "User list",
@ -342,7 +342,7 @@
"login_invalPass": "Password required",
"login_unhandledError": "An unexpected error occurred :(",
"register_importRecent": "Import documents from your unregistered session",
"register_acceptTerms": "I accept <a href='/terms.html' tabindex='-1'>the terms of service</a>",
"register_acceptTerms": "I accept <a>the terms of service</a>",
"register_passwordsDontMatch": "Passwords do not match!",
"register_passwordTooShort": "Passwords must be at least {0} characters long.",
"register_mustAcceptTerms": "You must accept the terms of service.",
@ -350,7 +350,7 @@
"register_header": "Register",
"register_writtenPassword": "I have written down my username and password, proceed",
"register_cancel": "Cancel",
"register_warning": "<i class='fa fa-warning'></i> Warning",
"register_warning": "Warning",
"register_alreadyRegistered": "This user already exists, do you want to log in?",
"register_emailWarning0": "It looks like you submitted your email as your username.",
"register_emailWarning1": "You can do that if you want, but it won't be sent to our server.",
@ -519,7 +519,7 @@
"whatis_drive": "Organization with CryptDrive",
"policy_title": "CryptPad Privacy Policy",
"policy_whatweknow": "What we know about you",
"policy_whatweknow_p1": "As an application that is hosted on the web, CryptPad has access to metadata exposed by the HTTP protocol. This includes your IP address, and various other HTTP headers that can be used to identify your particular browser. You can see what information your browser is sharing by visiting <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.",
"policy_whatweknow_p1": "As an application that is hosted on the web, CryptPad has access to metadata exposed by the HTTP protocol. This includes your IP address, and various other HTTP headers that can be used to identify your particular browser. You can see what information your browser is sharing by visiting <a>WhatIsMyBrowser.com</a>.",
"policy_howweuse": "How we use what we learn",
"policy_howweuse_p1": "We use this information to make better decisions about promoting CryptPad, by evaluating which of our past efforts were successful. Information about your location lets us know whether we should consider providing better support for languages other than English.",
"policy_howweuse_p2": "Information about your browser (whether it's a desktop or mobile operating system) helps us make decisions when prioritizing feature improvements. Our development team is small, and we try to make choices that will improve as many users' experience as possible.",
@ -531,7 +531,7 @@
"policy_ads_p1": "We do not display any online advertising, though we may link to the bodies which are financing our research.",
"policy_choices": "Choices you have",
"policy_choices_open": "Our code is open source, so you always have the option of hosting your own instance of CryptPad.",
"policy_choices_vpn": "If you want to use our hosted instance, but don't want to expose your IP address, you can protect your IP using the <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"downloads from the Tor project\" target=\"_blank\" rel=\"noopener noreferrer\">Tor browser bundle</a>, or a <a href=\"https://riseup.net/en/vpn\" title=\"VPNs provided by Riseup\" target=\"_blank\" rel=\"noopener noreferrer\">VPN</a>.",
"policy_choices_vpn": "If you want to use our hosted instance, but don't want to expose your IP address, you can protect your IP using the <a>Tor browser bundle</a>.",
"features": "Features",
"features_title": "Features",
"features_anon": "Non-registered",
@ -599,9 +599,9 @@
"readme_cat3_l1": "With CryptPad code editor, you can collaborate on code like Javascript and markdown like HTML and Markdown",
"readme_cat3_l2": "With CryptPad slide editor, you can make quick presentations using Markdown",
"readme_cat3_l3": "With CryptPoll you can take quick votes, especially for scheduling meetings which fit with everybody's calendar",
"feedback_about": "If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions",
"feedback_about": "If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions.",
"feedback_privacy": "We care about your privacy, and at the same time we want CryptPad to be very easy to use. We use this file to figure out which UI features matter to our users, by requesting it along with a parameter specifying which action was taken.",
"feedback_optout": "If you would like to opt out, visit <a href='/settings/'>your user settings page</a>, where you'll find a checkbox to enable or disable user feedback",
"feedback_optout": "If you would like to opt out, visit <a>your user settings page</a>, where you'll find a checkbox to enable or disable user feedback.",
"creation_404": "This pad no longer exists. Use the following form to create a new pad.",
"creation_owned": "Owned pad",
"creation_owned1": "An <b>owned</b> item can be destroyed whenever the owner wants. Destroying an owned item makes it unavailable from other users' CryptDrives.",
@ -657,7 +657,7 @@
"autostore_sf": "folder",
"autostore_pad": "pad",
"autostore_notstored": "This {0} is not in your CryptDrive. Do you want to store it now?",
"autostore_settings": "You can enable automatic pad storage in your <a href=\"/settings/\">Settings</a> page!",
"autostore_settings": "You can enable automatic pad storage in your <a>Settings</a> page!",
"autostore_store": "Store",
"autostore_hide": "Don't store",
"autostore_error": "Unexpected error: we were unable to store this pad, please try again.",
@ -748,7 +748,7 @@
"support_disabledHint": "This CryptPad instance is not yet configured to use a support form.",
"support_cat_new": "New ticket",
"support_formTitle": "New Ticket",
"support_formHint": "Use this form to securely contact the administrators about issues and questions.<br>Please note that some issues/questions may already be addressed in the <a href=\"https://docs.cryptpad.fr/en/user_guide/index.html\" rel=\"noopener noreferrer\" target=\"_blank\">CryptPad User Guide</a>. Please do not create a new ticket if you already have an open ticket about the same issue. Instead, reply to your original message with any additional information.",
"support_formHint": "Use this form to securely contact the administrators about issues and questions.<br>Please note that some issues/questions may already be addressed in the <a>CryptPad User Guide</a>. Please do not create a new ticket if you already have an open ticket about the same issue. Instead, reply to your original message with any additional information.",
"support_formButton": "Send",
"support_formTitleError": "Error: title is empty",
"support_formContentError": "Error: content is empty",
@ -922,7 +922,7 @@
"settings_cat_security": "Confidentiality",
"settings_safeLinksTitle": "Safe Links",
"settings_safeLinksCheckbox": "Enable safe links",
"safeLinks_error": "This link was copied from the browser's address bar and does not provide access to the document. Please use the <i class=\"fa fa-shhare-alt\"></i> <b>Share</b> menu to share directly with contacts or copy the link. <a href=\"https://docs.cryptpad.fr/en/user_guide/user_account.html#confidentiality\"> Read more about the Safe Links feature</a>.\n",
"safeLinks_error": "This link was copied from the browser's address bar and does not provide access to the document. Please use the <i></i> <b>Share</b> menu to share directly with contacts or copy the link. <a> Read more about the Safe Links feature</a>.",
"dontShowAgain": "Don't show again",
"profile_login": "You need to log in to add this user to your contacts",
"settings_safeLinksHint": "CryptPad includes the keys to decrypt your pads in their links. Anyone with access to your browsing history can potentially read your data. This includes intrusive browser extensions and browsers that sync your history across devices. Enabling \"safe links\" prevents the keys from entering your browsing history or being displayed in your address bar whenever possible. We strongly recommend that you enable this feature and use the {0} Share menu.",
@ -1005,7 +1005,7 @@
"slide_backCol": "Background color",
"slide_textCol": "Text color",
"support_languagesPreamble": "The support team speaks the following languages:",
"settings_safeLinkDefault": "Safe Links are now turned on by default. Please use the <i class=\"fa fa-shhare-alt\"></i> <b>Share</b> menu to copy links rather than your browser's address bar.",
"settings_safeLinkDefault": "Safe Links are now turned on by default. Please use the <i></i> <b>Share</b> menu to copy links rather than your browser's address bar.",
"info_imprintFlavour": "<a>Legal information about the administrators of this instance</a>.",
"user_about": "About CryptPad",
"info_privacyFlavour": "Our <a>privacy policy</a> describes how we treat your data.",
@ -1138,9 +1138,9 @@
"home_privacy_text": "CryptPad is built to enable collaboration while keeping data private. All content is encrypted and decrypted by your browser. This means documents, chats, and files are unreadable outside of the session where you are logged in. Even the service administrators do not have access to your information.",
"home_host_title": "About this instance",
"home_opensource_title": "Open Source",
"home_opensource": "Anyone can host CryptPad and offer the service in a personal or professional capacity. The source code is available on <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://github.com/xwiki-labs/cryptpad\">Github</a>.",
"home_opensource": "Anyone can host CryptPad and offer the service in a personal or professional capacity. The source code is available on <a>Github</a>.",
"home_support_title": "Support CryptPad",
"home_support": "<p>The development team does not profit from user data in any way. This is part of a vision for online services that respect privacy. Unlike the big platforms that pretend to be \"free\" while making profits from personal information, we aim to build a sustainable model funded willingly by users.</p><p>You can support the project by making a one-time or recurring donation through our Open Collective. Our budget is transparent and updates are published regularly. There are also a number of <a href=\"https://docs.cryptpad.fr/en/how_to_contribute.html\" rel=\"noopener noreferrer\" target=\"_blank\">non-financial ways to contribute</a>.</p>",
"home_support": "<p>The development team does not profit from user data in any way. This is part of a vision for online services that respect privacy. Unlike the big platforms that pretend to be \"free\" while making profits from personal information, we aim to build a sustainable model funded willingly by users.</p><p>You can support the project by making a one-time or recurring donation through our Open Collective. Our budget is transparent and updates are published regularly. There are also a number of <a>non-financial ways to contribute</a>.</p>",
"register_notes_title": "Important notes",
"register_notes": "<ul class=\"cp-notes-list\"><li>Your password is the secret key that encrypts all of your documents. <span class=\"red\">If you lose it there is no way we can recover your data.</span></li><li>If you are using a shared computer, <span class=\"red\">remember to log out</span> when you are done. Only closing the browser window leaves your account exposed. </li><li>To keep the documents you created and/or stored without being logged in, tick \"Import documents from your anonymous session\". </li></ul>",
"register_warning_note": "Due to the encrypted nature of CryptPad, the service administrators will not be able to recover data in case you forget your username and/or password. Please save them in a safe place.",
@ -1151,7 +1151,7 @@
"whatis_model": "Business model",
"whatis_model_info": "<p>CryptPad has been supported since 2016 by French and European research grants such as BPI France, NLNet Foundation, NGI Trust, Mozilla Open Source Support, as well as donations and subscriptions to cryptpad.fr. We believe that public money should fund public code, so the service is fully open source. This means anyone can use, host, and modify the software.</p><p>CryptPad does not profit from user data. This is part of a vision for online services that respect privacy. Unlike the big platforms that pretend to be \"free\" while making profits from personal information, CryptPad aims to build a sustainable model funded willingly by users.</p><p>We offer CryptPad's functionality for free because we believe everyone deserves personal privacy, not just people with disposable income. If you are in a position to support the project, you will contribute new features, improvements and maintenance that benefit all users.</p><p>Now that the feasibility of the project has been established, the next goal is to make it financially sustainable through user funding. If you would like to support CryptPad and help make it a sustainable alternative to the big platforms, please consider making a one-time or recurring donation.</p>",
"whatis_xwiki": "Made at XWiki",
"whatis_xwiki_info": "<p>CryptPad is made at <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://xwiki.com\">XWiki</a>, a company based in Paris, France that has been making open-source software for over 15 years. We have extensive experience making collaborative software to organise information. Our track record shows we are committed to the long-term development and maintenance of CryptPad.</p>",
"whatis_xwiki_info": "<p>CryptPad is made at <a>XWiki</a>, a company based in Paris, France that has been making open-source software for over 15 years. We have extensive experience making collaborative software to organise information. Our track record shows we are committed to the long-term development and maintenance of CryptPad.</p>",
"creation_expiresIn": "Expires in",
"creation_helperText": "Open in documentation",
"docs_link": "Documentation",

@ -102,7 +102,11 @@ define([
setTimeout(function () {
var span = h('span', [
UI.setHTML(h('h2'), Messages.register_warning), // TODO remove the icon from this translation string and pass it separately
h('h2', [
h('i.fa.fa-warning'),
' ',
Messages.register_warning,
]),
Messages.register_warning_note
]);

@ -168,6 +168,11 @@ define([
create['form'] = function () {
var key = 'form';
var $div = makeBlock(key, true); // Msg.support_formHint, .support_formTitle, .support_formButton
$div.find('a').attr({
rel: 'noopener noreferrer',
target: '_blank',
href: 'https://docs.cryptpad.fr/en/user_guide/index.html',
});
var form = APP.support.makeForm();

Loading…
Cancel
Save