commit
da800a9016
@ -1,137 +1,167 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env node
|
||||||
|
|
||||||
# $0 script path
|
var colors = require('colors'),
|
||||||
# $1 action
|
cproc = require('child_process'),
|
||||||
# $2 subaction
|
argv = require('minimist')(process.argv.slice(2)),
|
||||||
|
fs = require('fs'),
|
||||||
node="$(which nodejs 2>/dev/null)";
|
async = require('async'),
|
||||||
if [ $? -gt 0 ];
|
touch = require('touch'),
|
||||||
then node="$(which node)";
|
npm = require('npm');
|
||||||
fi
|
|
||||||
|
var getRunningPid = function(callback) {
|
||||||
function pidExists() {
|
fs.readFile(__dirname + '/pidfile', {
|
||||||
if [ -e "pidfile" ];
|
encoding: 'utf-8'
|
||||||
then
|
}, function(err, pid) {
|
||||||
if ps -p $(cat pidfile) > /dev/null
|
if (err) {
|
||||||
then return 1;
|
return callback(err);
|
||||||
else
|
|
||||||
rm ./pidfile;
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case "$1" in
|
try {
|
||||||
start)
|
process.kill(parseInt(pid, 10), 0);
|
||||||
echo "Starting NodeBB";
|
callback(null, parseInt(pid, 10));
|
||||||
echo " \"./nodebb stop\" to stop the NodeBB server";
|
} catch(e) {
|
||||||
echo " \"./nodebb log\" to view server output";
|
callback(e);
|
||||||
|
}
|
||||||
# Start the loader daemon
|
});
|
||||||
"$node" loader "$@"
|
};
|
||||||
;;
|
|
||||||
|
switch(process.argv[2]) {
|
||||||
stop)
|
case 'status':
|
||||||
pidExists;
|
getRunningPid(function(err, pid) {
|
||||||
if [ 0 -eq $? ];
|
if (!err) {
|
||||||
then
|
process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan);
|
||||||
echo "NodeBB is already stopped.";
|
process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||||
else
|
process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n');
|
||||||
echo "Stopping NodeBB. Goodbye!";
|
process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n');
|
||||||
kill $(cat pidfile);
|
} else {
|
||||||
fi
|
process.stdout.write('\nNodeBB is not running\n'.bold);
|
||||||
;;
|
process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n');
|
||||||
|
}
|
||||||
restart)
|
})
|
||||||
pidExists;
|
break;
|
||||||
if [ 0 -eq $? ];
|
|
||||||
then
|
case 'start':
|
||||||
echo "NodeBB could not be restarted, as a running instance could not be found.";
|
process.stdout.write('\nStarting NodeBB\n'.bold);
|
||||||
else
|
process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n');
|
||||||
echo "Restarting NodeBB.";
|
process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n');
|
||||||
kill -1 $(cat pidfile);
|
process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n');
|
||||||
fi
|
|
||||||
;;
|
// Spawn a new NodeBB process
|
||||||
|
cproc.fork(__dirname + '/loader.js', {
|
||||||
reload)
|
env: process.env
|
||||||
pidExists;
|
});
|
||||||
if [ 0 -eq $? ];
|
break;
|
||||||
then
|
|
||||||
echo "NodeBB could not be reloaded, as a running instance could not be found.";
|
case 'stop':
|
||||||
else
|
getRunningPid(function(err, pid) {
|
||||||
echo "Reloading NodeBB.";
|
if (!err) {
|
||||||
kill -12 $(cat pidfile);
|
process.kill(pid, 'SIGTERM');
|
||||||
fi
|
process.stdout.write('Stopping NodeBB. Goodbye!\n')
|
||||||
;;
|
} else {
|
||||||
|
process.stdout.write('NodeBB is already stopped.\n');
|
||||||
status)
|
}
|
||||||
pidExists;
|
});
|
||||||
if [ 0 -eq $? ];
|
break;
|
||||||
then
|
|
||||||
echo "NodeBB is not running";
|
case 'restart':
|
||||||
echo " \"./nodebb start\" to launch the NodeBB server";
|
getRunningPid(function(err, pid) {
|
||||||
else
|
if (!err) {
|
||||||
echo "NodeBB Running (pid $(cat pidfile))";
|
process.kill(pid, 'SIGHUP');
|
||||||
echo " \"./nodebb stop\" to stop the NodeBB server";
|
} else {
|
||||||
echo " \"./nodebb log\" to view server output";
|
process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.');
|
||||||
echo " \"./nodebb restart\" to restart NodeBB";
|
}
|
||||||
fi
|
});
|
||||||
;;
|
break;
|
||||||
|
|
||||||
log)
|
case 'reload':
|
||||||
clear;
|
getRunningPid(function(err, pid) {
|
||||||
tail -F ./logs/output.log;
|
if (!err) {
|
||||||
;;
|
process.kill(pid, 'SIGUSR2');
|
||||||
|
} else {
|
||||||
upgrade)
|
process.stdout.write('NodeBB could not be reloaded, as a running instance could not be found.');
|
||||||
npm install
|
}
|
||||||
# ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm install
|
});
|
||||||
# ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm update
|
break;
|
||||||
npm i nodebb-theme-vanilla nodebb-theme-lavender nodebb-widget-essentials
|
|
||||||
"$node" app --upgrade
|
case 'dev':
|
||||||
touch package.json
|
process.env.NODE_ENV = 'development';
|
||||||
;;
|
cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], {
|
||||||
|
env: process.env
|
||||||
setup)
|
});
|
||||||
"$node" app --setup "$@"
|
break;
|
||||||
;;
|
|
||||||
|
case 'log':
|
||||||
reset)
|
process.stdout.write('\nType '.red + 'Ctrl-C '.bold + 'to exit\n\n'.red);
|
||||||
"$node" app --reset --$2
|
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
||||||
;;
|
cwd: __dirname,
|
||||||
|
stdio: 'inherit'
|
||||||
dev)
|
});
|
||||||
echo "Launching NodeBB in \"development\" mode."
|
break;
|
||||||
echo "To run the production build of NodeBB, please use \"forever\"."
|
|
||||||
echo "More Information: https://docs.nodebb.org/en/latest/running/index.html"
|
case 'setup':
|
||||||
NODE_ENV=development "$node" loader --no-daemon --no-silent "$@"
|
cproc.fork('app.js', ['--setup'], {
|
||||||
;;
|
cwd: __dirname,
|
||||||
|
silent: false
|
||||||
watch)
|
});
|
||||||
echo "***************************************************************************"
|
break;
|
||||||
echo "WARNING: ./nodebb watch will be deprecated soon. Please use grunt: "
|
|
||||||
echo "https://docs.nodebb.org/en/latest/running/index.html#grunt-development"
|
case 'reset':
|
||||||
echo "***************************************************************************"
|
var args = process.argv.slice(0);
|
||||||
NODE_ENV=development supervisor -q --ignore public/templates,public/nodebb.min.js,public/nodebb.min.js.map --extensions 'node|js|tpl|less' -- app "$@"
|
args.unshift('--reset');
|
||||||
;;
|
|
||||||
|
cproc.fork('app.js', args, {
|
||||||
*)
|
cwd: __dirname,
|
||||||
echo "Welcome to NodeBB"
|
silent: false
|
||||||
echo $"Usage: $0 {start|stop|reload|restart|log|setup|reset|upgrade|dev|watch}"
|
});
|
||||||
echo ''
|
break;
|
||||||
column -s ' ' -t <<< '
|
|
||||||
start Start the NodeBB server
|
case 'upgrade':
|
||||||
stop Stops the NodeBB server
|
async.series([
|
||||||
reload Restarts NodeBB
|
function(next) {
|
||||||
restart Restarts NodeBB
|
process.stdout.write('1. '.bold + 'Bringing base dependencies up to date\n'.yellow);
|
||||||
log Opens the logging interface (useful for debugging)
|
npm.load({
|
||||||
setup Runs the NodeBB setup script
|
loglevel: 'silent'
|
||||||
reset Disables all plugins, restores the default theme.
|
}, function() {
|
||||||
upgrade Run NodeBB upgrade scripts, ensure packages are up-to-date
|
npm.commands.install(next);
|
||||||
dev Start NodeBB in interactive development mode
|
});
|
||||||
watch Start NodeBB in development mode and watch for changes
|
},
|
||||||
'
|
function(next) {
|
||||||
exit 1
|
process.stdout.write('2. '.bold + 'Updating NodeBB data store schema\n'.yellow);
|
||||||
esac
|
var upgradeProc = cproc.fork('app.js', ['--upgrade'], {
|
||||||
|
cwd: __dirname,
|
||||||
|
silent: false
|
||||||
|
});
|
||||||
|
|
||||||
|
upgradeProc.on('close', next)
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
process.stdout.write('3. '.bold + 'Storing upgrade date in "package.json"\n'.yellow);
|
||||||
|
touch(__dirname + '/package.json', {}, next);
|
||||||
|
}
|
||||||
|
], function(err) {
|
||||||
|
if (err) {
|
||||||
|
process.stdout.write('\nError'.red + ': ' + err.message + '\n');
|
||||||
|
} else {
|
||||||
|
var message = 'NodeBB Upgrade Complete!',
|
||||||
|
spaces = new Array(Math.floor(process.stdout.columns / 2) - (message.length / 2) + 1).join(' ');
|
||||||
|
process.stdout.write('\n' + spaces + message.green.bold + '\n\n');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
process.stdout.write('\nWelcome to NodeBB\n\n'.bold);
|
||||||
|
process.stdout.write('Usage: ./nodebb {start|stop|reload|restart|log|setup|reset|upgrade|dev}\n\n');
|
||||||
|
process.stdout.write('\t' + 'start'.yellow + '\tStart the NodeBB server\n');
|
||||||
|
process.stdout.write('\t' + 'stop'.yellow + '\tStops the NodeBB server\n');
|
||||||
|
process.stdout.write('\t' + 'reload'.yellow + '\tRestarts NodeBB\n');
|
||||||
|
process.stdout.write('\t' + 'restart'.yellow + '\tRestarts NodeBB\n');
|
||||||
|
process.stdout.write('\t' + 'log'.yellow + '\tOpens the logging interface (useful for debugging)\n');
|
||||||
|
process.stdout.write('\t' + 'setup'.yellow + '\tRuns the NodeBB setup script\n');
|
||||||
|
process.stdout.write('\t' + 'reset'.yellow + '\tDisables all plugins, restores the default theme.\n');
|
||||||
|
process.stdout.write('\t' + 'upgrade'.yellow + '\tRun NodeBB upgrade scripts, ensure packages are up-to-date\n');
|
||||||
|
process.stdout.write('\t' + 'dev'.yellow + '\tStart NodeBB in interactive development mode\n');
|
||||||
|
process.stdout.write('\t' + 'watch'.yellow + '\tStart NodeBB in development mode and watch for changes\n');
|
||||||
|
process.stdout.write('\n');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"new_topic_button": "موضوع جديد",
|
"new_topic_button": "موضوع جديد",
|
||||||
"guest-login-post": "المرجو تسجيل الدخول أوَّلا",
|
"guest-login-post": "يجب عليك تسجيل الدخول للرد",
|
||||||
"no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
"no_topics": "<strong>لا توجد مواضيع في هذه الفئة</strong>لم لا تحاول إنشاء موضوع؟<br />",
|
||||||
"browsing": "تصفح",
|
"browsing": "تصفح",
|
||||||
"no_replies": "لم يرد أحد",
|
"no_replies": "لم يرد أحد",
|
||||||
"share_this_category": "انشر هذه الفئة",
|
"share_this_category": "انشر هذه الفئة",
|
||||||
"watch": "Watch",
|
"watch": "متابعة",
|
||||||
"ignore": "تجاهل",
|
"ignore": "تجاهل",
|
||||||
"watch.message": "You are now watching updates from this category",
|
"watch.message": "You are now watching updates from this category",
|
||||||
"ignore.message": "You are now ignoring updates from this category"
|
"ignore.message": "You are now ignoring updates from this category"
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
{
|
{
|
||||||
"register": "تسجيل",
|
"register": "تسجيل",
|
||||||
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من الجمهور.",
|
"help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.",
|
||||||
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.",
|
"help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم </span>.",
|
||||||
"help.minimum_password_length": "كلمتك السر يجب أن تكون على الأقل متألفة من 1% أحرف",
|
"help.minimum_password_length": "كلمة المرور يجب أن تكون على الأقل بها 1% أحرف",
|
||||||
"email_address": "عنوان البريد الإلكتروني",
|
"email_address": "عنوان البريد الإلكتروني",
|
||||||
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
|
"email_address_placeholder": "ادخل عنوان البريد الإلكتروني",
|
||||||
"username": "اسم المستخدم",
|
"username": "اسم المستخدم",
|
||||||
"username_placeholder": "أدخل اسم المستخدم",
|
"username_placeholder": "أدخل اسم المستخدم",
|
||||||
"password": "كلمة السر",
|
"password": "كلمة المرور",
|
||||||
"password_placeholder": "أدخل كلمة السر",
|
"password_placeholder": "أدخل كلمة المرور",
|
||||||
"confirm_password": "تأكيد كلمة السر",
|
"confirm_password": "تأكيد كلمة المرور",
|
||||||
"confirm_password_placeholder": "تأكيد كلمة السر",
|
"confirm_password_placeholder": "تأكيد كلمة المرور",
|
||||||
"register_now_button": "قم بالتسجيل الآن",
|
"register_now_button": "قم بالتسجيل الآن",
|
||||||
"alternative_registration": "طريقة تسجيل بديلة",
|
"alternative_registration": "طريقة تسجيل بديلة",
|
||||||
"terms_of_use": "قوانين الاستخدام",
|
"terms_of_use": "شروط الاستخدام",
|
||||||
"agree_to_terms_of_use": "أوافق على قوانين الاستخدام"
|
"agree_to_terms_of_use": "أوافق على شروط الاستخدام"
|
||||||
}
|
}
|
@ -1,40 +1,40 @@
|
|||||||
{
|
{
|
||||||
"results_matching": "%1 نتيجة (نتائج) موافقة ل \"%2\", (%3 ثواني)",
|
"results_matching": "%1 نتيجة (نتائج) موافقة ل \"%2\", (%3 ثواني)",
|
||||||
"no-matches": "No matches found",
|
"no-matches": "No matches found",
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "بحث متقدم",
|
||||||
"in": "In",
|
"in": "في",
|
||||||
"titles": "Titles",
|
"titles": "العناوين",
|
||||||
"titles-posts": "Titles and Posts",
|
"titles-posts": "العناوين والمشاركات",
|
||||||
"posted-by": "Posted by",
|
"posted-by": "Posted by",
|
||||||
"in-categories": "In Categories",
|
"in-categories": "في الفئات",
|
||||||
"search-child-categories": "Search child categories",
|
"search-child-categories": "بحث في الفئات الفرعية",
|
||||||
"reply-count": "Reply Count",
|
"reply-count": "عدد المشاركات",
|
||||||
"at-least": "At least",
|
"at-least": "على اﻷقل",
|
||||||
"at-most": "At most",
|
"at-most": "على اﻷكثر",
|
||||||
"post-time": "Post time",
|
"post-time": "تاريخ المشاركة",
|
||||||
"newer-than": "Newer than",
|
"newer-than": "أحدث من",
|
||||||
"older-than": "Older than",
|
"older-than": "أقدم من",
|
||||||
"any-date": "Any date",
|
"any-date": "أي وقت",
|
||||||
"yesterday": "Yesterday",
|
"yesterday": "أمس",
|
||||||
"one-week": "One week",
|
"one-week": "أسبوع",
|
||||||
"two-weeks": "Two weeks",
|
"two-weeks": "أسبوعان",
|
||||||
"one-month": "One month",
|
"one-month": "شهر",
|
||||||
"three-months": "Three months",
|
"three-months": "ثلاثة أشهر",
|
||||||
"six-months": "Six months",
|
"six-months": "ستة أشهر",
|
||||||
"one-year": "One year",
|
"one-year": "عام",
|
||||||
"sort-by": "Sort by",
|
"sort-by": "Sort by",
|
||||||
"last-reply-time": "Last reply time",
|
"last-reply-time": "تاريخ آخر رد",
|
||||||
"topic-title": "Topic title",
|
"topic-title": "عنوان الموضوع",
|
||||||
"number-of-replies": "Number of replies",
|
"number-of-replies": "عدد الردود",
|
||||||
"number-of-views": "Number of views",
|
"number-of-views": "عدد المشاهدات",
|
||||||
"topic-start-date": "Topic start date",
|
"topic-start-date": "تاريخ بدأ الموضوع",
|
||||||
"username": "Username",
|
"username": "اسم المستخدم",
|
||||||
"category": "Category",
|
"category": "فئة",
|
||||||
"descending": "In descending order",
|
"descending": "In descending order",
|
||||||
"ascending": "In ascending order",
|
"ascending": "In ascending order",
|
||||||
"save-preferences": "Save preferences",
|
"save-preferences": "حفظ التفضيلات",
|
||||||
"clear-preferences": "Clear preferences",
|
"clear-preferences": "ازالة التفضيلات",
|
||||||
"search-preferences-saved": "Search preferences saved",
|
"search-preferences-saved": "تم حفظ تفضيلات البحث",
|
||||||
"search-preferences-cleared": "Search preferences cleared",
|
"search-preferences-cleared": "تم ازالة تفضيلات البحث",
|
||||||
"show-results-as": "Show results as"
|
"show-results-as": "عرض النتائج كـ"
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"no_tag_topics": "لاوجود لمواضيع تحمل هذا الوسم.",
|
"no_tag_topics": "لا يوجد مواضيع بهذه الكلمة الدلالية.",
|
||||||
"tags": "بطاقات",
|
"tags": "الكلمات الدلالية",
|
||||||
"enter_tags_here": "Enter tags here, between %1 and %2 characters each.",
|
"enter_tags_here": "Enter tags here, between %1 and %2 characters each.",
|
||||||
"enter_tags_here_short": "أدخل البطاقات...",
|
"enter_tags_here_short": "أدخل الكلمات الدلالية...",
|
||||||
"no_tags": "لاتوجد هناك بطاقات بعد."
|
"no_tags": "لا يوجد كلمات دلالية بعد."
|
||||||
}
|
}
|
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"latest_users": "أحدث المستخدمين",
|
"latest_users": "أحدث الأعضاء",
|
||||||
"top_posters": "أكثر المشتركين",
|
"top_posters": "اﻷكثر مشاركة",
|
||||||
"most_reputation": "أعلى سمعة",
|
"most_reputation": "أعلى سمعة",
|
||||||
"search": "بحث",
|
"search": "بحث",
|
||||||
"enter_username": "أدخل اسم مستخدم للبحث",
|
"enter_username": "أدخل اسم مستخدم للبحث",
|
||||||
"load_more": "حمل المزيد",
|
"load_more": "حمل المزيد",
|
||||||
"users-found-search-took": "%1 user(s) found! Search took %2 seconds.",
|
"users-found-search-took": "%1 user(s) found! Search took %2 seconds.",
|
||||||
"filter-by": "Filter By",
|
"filter-by": "Filter By",
|
||||||
"online-only": "Online only",
|
"online-only": "المتصلون فقط",
|
||||||
"picture-only": "Picture only"
|
"picture-only": "صورة فقط"
|
||||||
}
|
}
|
@ -1,28 +1,28 @@
|
|||||||
{
|
{
|
||||||
"password-reset-requested": "Parooli muutmise taotlus - %1!",
|
"password-reset-requested": "Parooli muutmise taotlus - %1!",
|
||||||
"welcome-to": "Tere tulemast %1",
|
"welcome-to": "Tere tulemast foorumisse %1",
|
||||||
"greeting_no_name": "Tere",
|
"greeting_no_name": "Tere",
|
||||||
"greeting_with_name": "Tere %1",
|
"greeting_with_name": "Tere %1",
|
||||||
"welcome.text1": "Thank you for registering with %1!",
|
"welcome.text1": "Täname et oled registreerinud foorumisse %1!",
|
||||||
"welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.",
|
"welcome.text2": "Konto täielikuks aktiveerimiseks peame me kinnitama, et registreerimisel kasutatud e-mail kuulub teile.",
|
||||||
"welcome.cta": "Click here to confirm your email address",
|
"welcome.cta": "Vajuta siia, et kinnitada oma e-maili aadress",
|
||||||
"reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.",
|
"reset.text1": "Meile laekus päring parooli muutmiseks. Kui päring ei ole teie poolt esitatud või te ei soovi parooli muuta, siis võite antud kirja ignoreerida.",
|
||||||
"reset.text2": "To continue with the password reset, please click on the following link:",
|
"reset.text2": "Selleks, et jätkata parooli muutmisega vajuta järgnevale lingile:",
|
||||||
"reset.cta": "Click here to reset your password",
|
"reset.cta": "Vajuta siia, et taotleda uut parooli",
|
||||||
"reset.notify.subject": "Password successfully changed",
|
"reset.notify.subject": "Parool edukalt muudetud",
|
||||||
"reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.",
|
"reset.notify.text1": "Teavitame sind, et sinu parool %1 foorumis on edukalt muudetud.",
|
||||||
"reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.",
|
"reset.notify.text2": "Kui te ei ole lubanud seda, siis teavitage koheselt administraatorit.",
|
||||||
"digest.notifications": "You have unread notifications from %1:",
|
"digest.notifications": "Sul on lugemata teateid %1 poolt:",
|
||||||
"digest.latest_topics": "Latest topics from %1",
|
"digest.latest_topics": "Viimased teemad %1 poolt",
|
||||||
"digest.cta": "Click here to visit %1",
|
"digest.cta": "Vajuta siia et külastada %1",
|
||||||
"digest.unsub.info": "This digest was sent to you due to your subscription settings.",
|
"digest.unsub.info": "See uudiskiri on saadetud teile tellimuse seadistuse tõttu.",
|
||||||
"digest.no_topics": "There have been no active topics in the past %1",
|
"digest.no_topics": "Viimase %1 jooksul ei ole olnud ühtegi aktiivset teemat",
|
||||||
"notif.chat.subject": "New chat message received from %1",
|
"notif.chat.subject": "Sulle on saabunud uus sõnum kasutajalt %1",
|
||||||
"notif.chat.cta": "Click here to continue the conversation",
|
"notif.chat.cta": "Vajuta siia, et jätkata vestlusega",
|
||||||
"notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",
|
"notif.chat.unsub.info": "See chat teavitus on saadetud teile tellimuse seadistuse tõttu.",
|
||||||
"notif.post.cta": "Click here to read the full topic",
|
"notif.post.cta": "Vajuta siia, et lugeda teemat täies mahus",
|
||||||
"notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.",
|
"notif.post.unsub.info": "See postituse teavitus on saadetud teile tellimuse seadistuse tõttu.",
|
||||||
"test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
|
"test.text1": "See on test e-mail kinnitamaks, et emailer on korrektselt seadistatud sinu NodeBB jaoks.",
|
||||||
"unsub.cta": "Click here to alter those settings",
|
"unsub.cta": "Vajuta siia, et muuta neid seadeid",
|
||||||
"closing": "Thanks!"
|
"closing": "Aitäh!"
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "Persian (Iran)",
|
"name": "فارسی",
|
||||||
"code": "fa_IR",
|
"code": "fa_IR",
|
||||||
"dir": "rtl"
|
"dir": "rtl"
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"success": "موفقیت",
|
"success": "موفقیتآمیز",
|
||||||
"topic-post": "دیدگاه شما باموفقیت فرستاده شد.",
|
"topic-post": "دیدگاه شما باموفقیت فرستاده شد.",
|
||||||
"authentication-successful": "اعتبارسنجی موفق",
|
"authentication-successful": "اعتبارسنجی موفق",
|
||||||
"settings-saved": "تنظیمات اندوخته شد."
|
"settings-saved": "تنظیمات اندوخته شد."
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue