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