lots of stuff translated

This commit is contained in:
Mayesters 2017-05-26 22:26:06 +02:00
parent dbb118c8ee
commit 01cb3f583e
13 changed files with 140 additions and 68 deletions

View file

@ -233,5 +233,77 @@
"Loading transactions": "Loading transactions", "Loading transactions": "Loading transactions",
"Amount": "Amount", "Amount": "Amount",
"Time": "Time", "Time": "Time",
"Transaction": "Transaction" "Transaction": "Transaction",
"You earned %s for registering as a new developer.": "You earned %s for registering as a new developer.",
"You earned %s LBC new user reward.": "You earned %s LBC new user reward.",
"You earned %s LBC for verifying your email address.": "You earned %s LBC for verifying your email address.",
"You earned %s LBC for creating a publisher identity.": "You earned %s LBC for creating a publisher identity.",
"You earned %s LBC for streaming your first video.": "You earned %s LBC for streaming your first video.",
"You earned %s LBC for downloading some of the things.": "You earned %s LBC for downloading some of the things.",
"You earned %s LBC for making your first publication.": "You earned %s LBC for making your first publication.",
"Your First Nickel": "Your First Nickel",
"First Publish": "First Publish",
"We're Going Streaming": "We're Going Streaming",
"Channel Surfing": "Channel Surfing",
"Many Views": "Many Views",
"Hot Right Now": "Hot Right Now",
"A welcome bonus for being at the vanguard of content freedom.": "A welcome bonus for being at the vanguard of content freedom.",
"The first view is on us.": "The first view is on us.",
"Up the quad, and to the gymanasium. Press play. Everybody's doing it.": "Up the quad, and to the gymanasium. Press play. Everybody's doing it.",
"Claim your channel! Create an identity used to securely publish content.": "Claim your channel! Create an identity used to securely publish content.",
"Watch a bunch of stuff... who knows how much?": "Watch a bunch of stuff... who knows how much?",
"Watch the latest featured content.": "Watch the latest featured content.",
"Rewards are not enabled.": "Rewards are not enabled.",
"Failed to load rewards.": "Failed to load rewards.",
"Reward claimed.": "Reward claimed.",
"Show All": "Show All",
"Please create a channel identity first.": "Please create a channel identity first.",
"Please publish something and wait for confirmation by the network to claim this reward.": "Please publish something and wait for confirmation by the network to claim this reward.",
"Please publish something to claim this reward.": "Please publish something to claim this reward.",
"Could not connect to Lighthouse server. Last server attempted: %s": "Could not connect to Lighthouse server. Last server attempted: %s",
"LBRY URIs must include a protocol prefix (lbry://).": "LBRY URIs must include a protocol prefix (lbry://).",
"URI does not include name.": "URI does not include name.",
"No channel name after @.": "No channel name after @.",
"Channel names must be at least %s characters.": "Channel names must be at least %s characters.",
"Invalid character %s in name: %s.": "Invalid character %s in name: %s.",
"No modifier provided after separator %s.": "No modifier provided after separator %s.",
"Invalid claim ID %s.": "Invalid claim ID %s.",
"Claim sequence must be a number.": "Claim sequence must be a number.",
"Bid position must be a number.": "Bid position must be a number.",
"Only channel URIs may have a path.": "Only channel URIs may have a path.",
"Invalid character %s in path: %s": "Invalid character %s in path: %s",
"No path provided after /": "No path provided after /",
"Received a channel content URI, but name and channelName do not match. \"name\" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.": "Received a channel content URI, but name and channelName do not match. \"name\" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.",
"Path and contentName do not match. Only one is required; most likely you wanted contentName.": "Path and contentName do not match. Only one is required; most likely you wanted contentName.",
"Internal API disabled": "Internal API disabled",
"LBRY internal API is disabled": "LBRY internal API is disabled",
"Something went wrong making an internal API call.": "Something went wrong making an internal API call.",
"XMLHttpRequest connection timed out": "XMLHttpRequest connection timed out",
"Invalid method": "Invalid method",
"Received invalid authentication response.": "Received invalid authentication response.",
"Unable to connect to LBRY": "Unable to connect to LBRY",
"Resolve has hacked cache on top of it that requires a URI": "Resolve has hacked cache on top of it that requires a URI",
"Connection to API server failed": "Connection to API server failed",
"Please select a file to upgrade from": "Please select a file to upgrade from",
"Update available": "Update available",
"Upgrade": "Upgrade",
"Skip": "Skip",
"Your version of LBRY is out of date and may be unreliable or insecure.": "Your version of LBRY is out of date and may be unreliable or insecure.",
"Sorry, your download timed out :(": "Sorry, your download timed out :(",
"Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it": "Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it",
"Downloading stream... not long left now!": "Downloading stream... not long left now!",
"this is the world's worst loading screen and we shipped our software with it anyway...": "this is the world's worst loading screen and we shipped our software with it anyway...",
"Wallet Address": "Wallet Address",
"Get New Address": "Get New Address",
"Other LBRY users may send credits to you by entering this address on the \"Send\" page.": "Other LBRY users may send credits to you by entering this address on the \"Send\" page.",
"You can generate a new address at any time, and any previous addresses will continue to work. Using multiple addresses can be helpful for keeping track of incoming payments from multiple sources.": "You can generate a new address at any time, and any previous addresses will continue to work. Using multiple addresses can be helpful for keeping track of incoming payments from multiple sources.",
"Send Credits": "Send Credits",
"Recipient Address": "Recipient Address",
"Insufficient balance": "Insufficient balance",
"Insufficient balance: after this transaction you would have less than 1 LBC in your wallet.": "Insufficient balance: after this transaction you would have less than 1 LBC in your wallet.",
"Transaction successful": "Transaction successful",
"Your transaction was successfully placed in the queue.": "Your transaction was successfully placed in the queue.",
"Transaction failed": "Transaction failed",
"Something went wrong": "Something went wrong",
"Find movies, music, games, and more": "Find movies, music, games, and more"
} }

View file

@ -17,13 +17,13 @@ class UpgradeModal extends React.Component {
return ( return (
<Modal <Modal
isOpen={true} isOpen={true}
contentLabel="Update available" contentLabel={__("Update available")}
type="confirm" type="confirm"
confirmButtonLabel="Upgrade" confirmButtonLabel={__("Upgrade")}
abortButtonLabel="Skip" abortButtonLabel={__("Skip")}
onConfirmed={downloadUpgrade} onConfirmed={downloadUpgrade}
onAborted={skipUpgrade}> onAborted={skipUpgrade}>
Your version of LBRY is out of date and may be unreliable or insecure. {__("Your version of LBRY is out of date and may be unreliable or insecure.")}
</Modal> </Modal>
) )
} }

View file

@ -51,20 +51,20 @@ class VideoPlayButton extends React.Component {
icon="icon-play" icon="icon-play"
onClick={this.onWatchClick.bind(this)} /> onClick={this.onWatchClick.bind(this)} />
{modal} {modal}
<Modal contentLabel="Not enough credits" isOpen={modal == 'notEnoughCredits'} onConfirmed={() => { this.closeModal() }}> <Modal contentLabel={__("Not enough credits")} isOpen={modal == 'notEnoughCredits'} onConfirmed={() => { this.closeModal() }}>
You don't have enough LBRY credits to pay for this stream. {__("You don't have enough LBRY credits to pay for this stream.")}
</Modal> </Modal>
<Modal <Modal
type="confirm" type="confirm"
isOpen={modal == 'affirmPurchase'} isOpen={modal == 'affirmPurchase'}
contentLabel="Confirm Purchase" contentLabel={__("Confirm Purchase")}
onConfirmed={this.onPurchaseConfirmed.bind(this)} onConfirmed={this.onPurchaseConfirmed.bind(this)}
onAborted={closeModal}> onAborted={closeModal}>
This will purchase <strong>{title}</strong> for <strong><FilePrice uri={uri} look="plain" /></strong> credits. {__("This will purchase")} <strong>{title}</strong> {__("for")} <strong><FilePrice uri={uri} look="plain" /></strong> {__("credits")}.
</Modal> </Modal>
<Modal <Modal
isOpen={modal == 'timedOut'} onConfirmed={() => { this.closeModal() }} contentLabel="Timed Out"> isOpen={modal == 'timedOut'} onConfirmed={() => { this.closeModal() }} contentLabel="Timed Out">
Sorry, your download timed out :( {__("Sorry, your download timed out :(")}
</Modal> </Modal>
</div>); </div>);
} }
@ -100,16 +100,16 @@ class Video extends React.Component {
let loadStatusMessage = '' let loadStatusMessage = ''
if (isLoading) { if (isLoading) {
loadStatusMessage = "Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it" loadStatusMessage = __("Requesting stream... it may sit here for like 15-20 seconds in a really awkward way... we're working on it")
} else if (isDownloading) { } else if (isDownloading) {
loadStatusMessage = "Downloading stream... not long left now!" loadStatusMessage = __("Downloading stream... not long left now!")
} }
return ( return (
<div className={"video " + this.props.className + (isPlaying ? " video--active" : " video--hidden")}>{ <div className={"video " + this.props.className + (isPlaying ? " video--active" : " video--hidden")}>{
isPlaying || isLoading ? isPlaying || isLoading ?
(!isReadyToPlay ? (!isReadyToPlay ?
<span>this is the world's worst loading screen and we shipped our software with it anyway... <br /><br />{loadStatusMessage}</span> : <span>{__("this is the world's worst loading screen and we shipped our software with it anyway...")} <br /><br />{loadStatusMessage}</span> :
<VideoPlayer poster={metadata.thumbnail} autoplay={isPlaying} downloadPath={fileInfo.download_path} />) : <VideoPlayer poster={metadata.thumbnail} autoplay={isPlaying} downloadPath={fileInfo.download_path} />) :
<div className="video__cover" style={{backgroundImage: 'url("' + metadata.thumbnail + '")'}}> <div className="video__cover" style={{backgroundImage: 'url("' + metadata.thumbnail + '")'}}>
<VideoPlayButton startPlaying={this.startPlaying.bind(this)} {...this.props} /> <VideoPlayButton startPlaying={this.startPlaying.bind(this)} {...this.props} />

View file

@ -19,18 +19,18 @@ class WalletAddress extends React.Component {
return ( return (
<section className="card"> <section className="card">
<div className="card__title-primary"> <div className="card__title-primary">
<h3>Wallet Address</h3> <h3>{__("Wallet Address")}</h3>
</div> </div>
<div className="card__content"> <div className="card__content">
<Address address={receiveAddress} /> <Address address={receiveAddress} />
</div> </div>
<div className="card__actions"> <div className="card__actions">
<Link label="Get New Address" button="primary" icon='icon-refresh' onClick={getNewAddress} disabled={gettingNewAddress} /> <Link label={__("Get New Address")} button="primary" icon='icon-refresh' onClick={getNewAddress} disabled={gettingNewAddress} />
</div> </div>
<div className="card__content"> <div className="card__content">
<div className="help"> <div className="help">
<p>Other LBRY users may send credits to you by entering this address on the "Send" page.</p> <p>{__("Other LBRY users may send credits to you by entering this address on the \"Send\" page.")}</p>
<p>You can generate a new address at any time, and any previous addresses will continue to work. Using multiple addresses can be helpful for keeping track of incoming payments from multiple sources.</p> <p>{__("You can generate a new address at any time, and any previous addresses will continue to work. Using multiple addresses can be helpful for keeping track of incoming payments from multiple sources.")}</p>
</div> </div>
</div> </div>
</section> </section>

View file

@ -20,27 +20,27 @@ const WalletSend = (props) => {
<section className="card"> <section className="card">
<form onSubmit={sendToAddress}> <form onSubmit={sendToAddress}>
<div className="card__title-primary"> <div className="card__title-primary">
<h3>Send Credits</h3> <h3>{__("Send Credits")}</h3>
</div> </div>
<div className="card__content"> <div className="card__content">
<FormRow label="Amount" postfix="LBC" step="0.01" type="number" placeholder="1.23" size="10" onChange={setAmount} value={amount} /> <FormRow label={__("Amount")} postfix="LBC" step="0.01" type="number" placeholder="1.23" size="10" onChange={setAmount} value={amount} />
</div> </div>
<div className="card__content"> <div className="card__content">
<FormRow label="Recipient Address" placeholder="bbFxRyXXXXXXXXXXXZD8nE7XTLUxYnddTs" type="text" size="60" onChange={setAddress} value={address} /> <FormRow label={__("Recipient Address")} placeholder="bbFxRyXXXXXXXXXXXZD8nE7XTLUxYnddTs" type="text" size="60" onChange={setAddress} value={address} />
</div> </div>
<div className="card__actions card__actions--form-submit"> <div className="card__actions card__actions--form-submit">
<Link button="primary" label="Send" onClick={sendToAddress} disabled={!(parseFloat(amount) > 0.0) || !address} /> <Link button="primary" label={_("Send")} onClick={sendToAddress} disabled={!(parseFloat(amount) > 0.0) || !address} />
<input type='submit' className='hidden' /> <input type='submit' className='hidden' />
</div> </div>
</form> </form>
{modal == 'insufficientBalance' && <Modal isOpen={true} contentLabel="Insufficient balance" onConfirmed={closeModal}> {modal == 'insufficientBalance' && <Modal isOpen={true} contentLabel={__("Insufficient balance")} onConfirmed={closeModal}>
Insufficient balance: after this transaction you would have less than 1 LBC in your wallet. {__("Insufficient balance: after this transaction you would have less than 1 LBC in your wallet.")}
</Modal>} </Modal>}
{modal == 'transactionSuccessful' && <Modal isOpen={true} contentLabel="Transaction successful" onConfirmed={closeModal}> {modal == 'transactionSuccessful' && <Modal isOpen={true} contentLabel={__("Transaction successful")} onConfirmed={closeModal}>
Your transaction was successfully placed in the queue. {__("Your transaction was successfully placed in the queue.")}
</Modal>} </Modal>}
{modal == 'transactionFailed' && <Modal isOpen={true} contentLabel="Transaction failed" onConfirmed={closeModal}> {modal == 'transactionFailed' && <Modal isOpen={true} contentLabel={__("Transaction failed")} onConfirmed={closeModal}>
Something went wrong: {__("Something went wrong")}:
</Modal>} </Modal>}
</section> </section>
) )

View file

@ -11,7 +11,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba
connectFailedCallback(e); connectFailedCallback(e);
}); });
xhr.addEventListener('timeout', function() { xhr.addEventListener('timeout', function() {
connectFailedCallback(new Error('XMLHttpRequest connection timed out')); connectFailedCallback(new Error(__('XMLHttpRequest connection timed out')));
}) })
} }
xhr.addEventListener('load', function() { xhr.addEventListener('load', function() {
@ -50,7 +50,7 @@ jsonrpc.call = function (connectionString, method, params, callback, errorCallba
method: method, method: method,
params: params, params: params,
code: xhr.status, code: xhr.status,
message: 'Connection to API server failed' message: __('Connection to API server failed')
} }
}); });
document.dispatchEvent(errorEvent); document.dispatchEvent(errorEvent);

View file

@ -111,7 +111,7 @@ lbry.connect = function() {
}, tryNum < 100 ? 200 : 1000); }, tryNum < 100 ? 200 : 1000);
} }
else { else {
reject(new Error("Unable to connect to LBRY")); reject(new Error(__("Unable to connect to LBRY")));
} }
} }
}); });
@ -422,7 +422,7 @@ lbry._resolveXhrs = {}
lbry.resolve = function(params={}) { lbry.resolve = function(params={}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!params.uri) { if (!params.uri) {
throw "Resolve has hacked cache on top of it that requires a URI" throw __("Resolve has hacked cache on top of it that requires a URI")
} }
if (params.uri && lbry._claimCache[params.uri] !== undefined) { if (params.uri && lbry._claimCache[params.uri] !== undefined) {
resolve(lbry._claimCache[params.uri]); resolve(lbry._claimCache[params.uri]);

View file

@ -34,20 +34,20 @@ lbryio.getExchangeRates = function() {
lbryio.call = function(resource, action, params={}, method='get', evenIfDisabled=false) { // evenIfDisabled is just for development, when we may have some calls working and some not lbryio.call = function(resource, action, params={}, method='get', evenIfDisabled=false) { // evenIfDisabled is just for development, when we may have some calls working and some not
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!lbryio.enabled && !evenIfDisabled && (resource != 'discover' || action != 'list')) { if (!lbryio.enabled && !evenIfDisabled && (resource != 'discover' || action != 'list')) {
console.log("Internal API disabled"); console.log(__("Internal API disabled"));
reject(new Error("LBRY internal API is disabled")) reject(new Error(__("LBRY internal API is disabled")))
return return
} }
const xhr = new XMLHttpRequest; const xhr = new XMLHttpRequest;
xhr.addEventListener('error', function (event) { xhr.addEventListener('error', function (event) {
reject(new Error("Something went wrong making an internal API call.")); reject(new Error(__("Something went wrong making an internal API call.")));
}); });
xhr.addEventListener('timeout', function() { xhr.addEventListener('timeout', function() {
reject(new Error('XMLHttpRequest connection timed out')); reject(new Error(__('XMLHttpRequest connection timed out')));
}); });
xhr.addEventListener('load', function() { xhr.addEventListener('load', function() {
@ -89,7 +89,7 @@ lbryio.call = function(resource, action, params={}, method='get', evenIfDisabled
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(querystring.stringify(fullParams)); xhr.send(querystring.stringify(fullParams));
} else { } else {
reject(new Error("Invalid method")); reject(new Error(__("Invalid method")));
} }
}); });
}; };
@ -138,7 +138,7 @@ lbryio.authenticate = function() {
app_id: installation_id, app_id: installation_id,
}, 'post').then(function(responseData) { }, 'post').then(function(responseData) {
if (!responseData.id) { if (!responseData.id) {
reject(new Error("Received invalid authentication response.")); reject(new Error(__("Received invalid authentication response.")));
} }
lbryio.setAccessToken(installation_id) lbryio.setAccessToken(installation_id)
setCurrentUser() setCurrentUser()

View file

@ -39,12 +39,12 @@ lbryuri.parse = function(uri, requireProto=false) {
// Validate protocol // Validate protocol
if (requireProto && !proto) { if (requireProto && !proto) {
throw new Error('LBRY URIs must include a protocol prefix (lbry://).'); throw new Error(__('LBRY URIs must include a protocol prefix (lbry://).'));
} }
// Validate and process name // Validate and process name
if (!name) { if (!name) {
throw new Error('URI does not include name.'); throw new Error(__('URI does not include name.'));
} }
const isChannel = name.startsWith('@'); const isChannel = name.startsWith('@');
@ -52,11 +52,11 @@ lbryuri.parse = function(uri, requireProto=false) {
if (isChannel) { if (isChannel) {
if (!channelName) { if (!channelName) {
throw new Error('No channel name after @.'); throw new Error(__('No channel name after @.'));
} }
if (channelName.length < CHANNEL_NAME_MIN_LEN) { if (channelName.length < CHANNEL_NAME_MIN_LEN) {
throw new Error(`Channel names must be at least ${CHANNEL_NAME_MIN_LEN} characters.`); throw new Error(__(`Channel names must be at least %s characters.`, CHANNEL_NAME_MIN_LEN));
} }
contentName = path; contentName = path;
@ -64,14 +64,14 @@ lbryuri.parse = function(uri, requireProto=false) {
const nameBadChars = (channelName || name).match(/[^A-Za-z0-9-]/g); const nameBadChars = (channelName || name).match(/[^A-Za-z0-9-]/g);
if (nameBadChars) { if (nameBadChars) {
throw new Error(`Invalid character${nameBadChars.length == 1 ? '' : 's'} in name: ${nameBadChars.join(', ')}.`); throw new Error(__(`Invalid character %s in name: %s.`, nameBadChars.length == 1 ? '' : 's', nameBadChars.join(', ') ));
} }
// Validate and process modifier (claim ID, bid position or claim sequence) // Validate and process modifier (claim ID, bid position or claim sequence)
let claimId, claimSequence, bidPosition; let claimId, claimSequence, bidPosition;
if (modSep) { if (modSep) {
if (!modVal) { if (!modVal) {
throw new Error(`No modifier provided after separator ${modSep}.`); throw new Error(__(`No modifier provided after separator %s.`, modSep));
} }
if (modSep == '#') { if (modSep == '#') {
@ -84,31 +84,31 @@ lbryuri.parse = function(uri, requireProto=false) {
} }
if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/))) { if (claimId && (claimId.length > CLAIM_ID_MAX_LEN || !claimId.match(/^[0-9a-f]+$/))) {
throw new Error(`Invalid claim ID ${claimId}.`); throw new Error(__(`Invalid claim ID %s.`, claimId));
} }
if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) { if (claimSequence && !claimSequence.match(/^-?[1-9][0-9]*$/)) {
throw new Error('Claim sequence must be a number.'); throw new Error(__('Claim sequence must be a number.'));
} }
if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) { if (bidPosition && !bidPosition.match(/^-?[1-9][0-9]*$/)) {
throw new Error('Bid position must be a number.'); throw new Error(__('Bid position must be a number.'));
} }
// Validate and process path // Validate and process path
if (path) { if (path) {
if (!isChannel) { if (!isChannel) {
throw new Error('Only channel URIs may have a path.'); throw new Error(__('Only channel URIs may have a path.'));
} }
const pathBadChars = path.match(/[^A-Za-z0-9-]/g); const pathBadChars = path.match(/[^A-Za-z0-9-]/g);
if (pathBadChars) { if (pathBadChars) {
throw new Error(`Invalid character${count == 1 ? '' : 's'} in path: ${nameBadChars.join(', ')}`); throw new Error(__(`Invalid character %s in path: %s`,count == 1 ? '' : 's',nameBadChars.join(', ')));
} }
contentName = path; contentName = path;
} else if (pathSep) { } else if (pathSep) {
throw new Error('No path provided after /'); throw new Error(__('No path provided after /'));
} }
return { return {
@ -135,7 +135,7 @@ lbryuri.build = function(uriObj, includeProto=true, allowExtraProps=false) {
if (!name) { if (!name) {
name = channelNameFormatted; name = channelNameFormatted;
} else if (name !== channelNameFormatted) { } else if (name !== channelNameFormatted) {
throw new Error('Received a channel content URI, but name and channelName do not match. "name" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.'); throw new Error(__('Received a channel content URI, but name and channelName do not match. \"name\" represents the value in the name position of the URI (lbry://name...), which for channel content will be the channel name. In most cases, to construct a channel URI you should just pass channelName and contentName.'));
} }
} }
@ -146,7 +146,7 @@ lbryuri.build = function(uriObj, includeProto=true, allowExtraProps=false) {
path = contentName; path = contentName;
} }
if (path && path !== contentName) { if (path && path !== contentName) {
throw new Error('path and contentName do not match. Only one is required; most likely you wanted contentName.'); throw new Error(__('Path and contentName do not match. Only one is required; most likely you wanted contentName.'));
} }
} }

View file

@ -21,7 +21,7 @@ function getServers() {
function call(method, params, callback, errorCallback) { function call(method, params, callback, errorCallback) {
if (connectTryNum >= maxQueryTries) { if (connectTryNum >= maxQueryTries) {
errorCallback(new Error(`Could not connect to Lighthouse server. Last server attempted: ${server}`)); errorCallback(new Error(__(`Could not connect to Lighthouse server. Last server attempted: %s`, server)));
return; return;
} }

View file

@ -42,7 +42,7 @@ class DeveloperPage extends React.Component {
handleForceUpgradeClick() { handleForceUpgradeClick() {
let upgradeSent = false; let upgradeSent = false;
if (!this.state.upgradePath) { if (!this.state.upgradePath) {
alert('Please select a file to upgrade from'); alert(__('Please select a file to upgrade from'));
} else { } else {
try { try {
const stats = fs.lstatSync(this.state.upgradePath); const stats = fs.lstatSync(this.state.upgradePath);

View file

@ -24,7 +24,7 @@ export class RewardTile extends React.Component {
</div> </div>
<div className="card__actions"> <div className="card__actions">
{this.props.claimed {this.props.claimed
? <span><Icon icon="icon-check" /> Reward claimed.</span> ? <span><Icon icon="icon-check" /> {__("Reward claimed.")}</span>
: <RewardLink {...this.props} />} : <RewardLink {...this.props} />}
</div> </div>
<div className="card__content">{this.props.description}</div> <div className="card__content">{this.props.description}</div>
@ -64,9 +64,9 @@ export class RewardsPage extends React.Component {
<SubHeader /> <SubHeader />
<div> <div>
{!this.state.userRewards {!this.state.userRewards
? (this.state.failed ? <div className="empty">Failed to load rewards.</div> : '') ? (this.state.failed ? <div className="empty">{__("Failed to load rewards.")}</div> : '')
: this.state.userRewards.map(({reward_type, reward_title, reward_description, transaction_id, reward_amount}) => { : this.state.userRewards.map(({reward_type, reward_title, reward_description, transaction_id, reward_amount}) => {
return <RewardTile key={reward_type} onRewardClaim={this.loadRewards} type={reward_type} title={reward_title} description={reward_description} claimed={!!transaction_id} value={reward_amount} />; return <RewardTile key={reward_type} onRewardClaim={this.loadRewards} type={reward_type} title={__(reward_title)} description={__(reward_description)} claimed={!!transaction_id} value={reward_amount} />;
})} })}
</div> </div>
</main> </main>

View file

@ -7,13 +7,13 @@ import {
function rewardMessage(type, amount) { function rewardMessage(type, amount) {
return { return {
new_developer: `You earned ${amount} for registering as a new developer.`, new_developer: __(`You earned %s for registering as a new developer.`, amount),
new_user: `You earned ${amount} LBC new user reward.`, new_user: __(`You earned %s LBC new user reward.`, amount),
confirm_email: `You earned ${amount} LBC for verifying your email address.`, confirm_email: __(`You earned %s LBC for verifying your email address.`, amount),
new_channel: `You earned ${amount} LBC for creating a publisher identity.`, new_channel: __(`You earned %s LBC for creating a publisher identity.`, amount),
first_stream: `You earned ${amount} LBC for streaming your first video.`, first_stream: __(`You earned %s LBC for streaming your first video.`, amount),
many_downloads: `You earned ${amount} LBC for downloading some of the things.`, many_downloads: __(`You earned %s LBC for downloading some of the things.`, amount),
first_publish: `You earned ${amount} LBC for making your first publication.`, first_publish: __(`You earned %s LBC for making your first publication.`, amount),
}[type]; }[type];
} }
@ -81,7 +81,7 @@ rewards.claimReward = function (type) {
function requestReward(resolve, reject, params) { function requestReward(resolve, reject, params) {
if (!lbryio.enabled) { if (!lbryio.enabled) {
reject(new Error("Rewards are not enabled.")) reject(new Error(__("Rewards are not enabled.")))
return; return;
} }
lbryio.call('reward', 'new', params, 'post').then(({reward_amount}) => { lbryio.call('reward', 'new', params, 'post').then(({reward_amount}) => {
@ -96,7 +96,7 @@ rewards.claimReward = function (type) {
// Display global notice // Display global notice
const action = doShowSnackBar({ const action = doShowSnackBar({
message, message,
linkText: "Show All", linkText: __("Show All"),
linkTarget: "/rewards", linkTarget: "/rewards",
isError: false, isError: false,
}) })
@ -125,7 +125,7 @@ rewards.claimReward = function (type) {
params.transaction_id = claim.txid; params.transaction_id = claim.txid;
requestReward(resolve, reject, params) requestReward(resolve, reject, params)
} else { } else {
reject(new Error("Please create a channel identity first.")) reject(new Error(__("Please create a channel identity first.")))
} }
}).catch(reject) }).catch(reject)
break; break;
@ -140,8 +140,8 @@ rewards.claimReward = function (type) {
requestReward(resolve, reject, params) requestReward(resolve, reject, params)
} else { } else {
reject(claims.length ? reject(claims.length ?
new Error("Please publish something and wait for confirmation by the network to claim this reward.") : new Error(__("Please publish something and wait for confirmation by the network to claim this reward.")) :
new Error("Please publish something to claim this reward.")) new Error(__("Please publish something to claim this reward.")))
} }
}).catch(reject) }).catch(reject)
break; break;