Sync with upstream

Merge branch 'devel' of https://github.com/TelescopeJS/Telescope into devel
This commit is contained in:
Alekzanther 2015-04-07 15:21:10 +02:00
commit 38a74d68a0
279 changed files with 6411 additions and 2103 deletions

View file

@ -5,3 +5,4 @@
notices-for-0.9.0
notices-for-0.9.1
0.9.4-platform-file
notices-for-facebook-graph-api-2

View file

@ -26,9 +26,10 @@ meteorhacks:fast-render
meteorhacks:subs-manager
meteorhacks:npm
aldeed:autoform
aldeed:autoform@5.1.2
aldeed:collection2
aldeed:simple-schema
aldeed:simple-schema@1.3.2
aldeed:template-extension
mrt:jquery-hotkeys
mrt:cookies
@ -43,12 +44,17 @@ npm-container
matb33:collection-hooks
djedi:sanitize-html
rajit:bootstrap3-datepicker
bengott:avatar
bengott:avatar@0.7.6
jparker:gravatar
tap:i18n
useraccounts:unstyled@1.4.0
useraccounts:unstyled@1.8.1
tsega:bootstrap3-datetimepicker@3.1.3_1
momentjs:moment
aslagle:reactive-table
aramk:tinycolor
fortawesome:fontawesome
fourseven:scss
manuelschoebel:ms-seo
# Testing
@ -84,5 +90,8 @@ telescope-post-by-feed
telescope-releases
telescope-getting-started
telescope-subscribe-to-posts
telescope-tagline-banner
telescope-sitemap
telescope-messages
# Custom Packages

View file

@ -1 +1 @@
METEOR@1.0.2.1
METEOR@1.1

View file

@ -1,114 +1,120 @@
accounts-base@1.1.3
accounts-facebook@1.0.3
accounts-oauth@1.1.3
accounts-password@1.0.5
accounts-twitter@1.0.3
accounts-ui@1.1.4
accounts-ui-unstyled@1.1.5
aldeed:autoform@4.2.2
aldeed:collection2@2.3.0
aldeed:simple-schema@1.2.0
application-configuration@1.0.4
artwells:queue@0.0.3
autoupdate@1.1.4
accounts-base@1.2.0
accounts-facebook@1.0.4
accounts-oauth@1.1.5
accounts-password@1.1.1
accounts-twitter@1.0.4
accounts-ui@1.1.5
accounts-ui-unstyled@1.1.7
aldeed:autoform@5.1.2
aldeed:collection2@2.3.3
aldeed:http@0.2.2
aldeed:simple-schema@1.3.2
aldeed:template-extension@3.4.3
anti:i18n@0.4.3
aramk:tinycolor@1.1.0_1
aslagle:reactive-table@0.7.2
autoupdate@1.2.1
backbone@1.0.0
base64@1.0.2
bengott:avatar@0.7.3
binary-heap@1.0.2
blaze@2.0.4
blaze-tools@1.0.2
boilerplate-generator@1.0.2
callback-hook@1.0.2
base64@1.0.3
bengott:avatar@0.7.6
binary-heap@1.0.3
blaze@2.1.1
blaze-tools@1.0.3
boilerplate-generator@1.0.3
callback-hook@1.0.3
ccan:cssreset@1.0.0
check@1.0.3
cfs:http-methods@0.0.27
check@1.0.5
chuangbo:cookie@1.1.0
chuangbo:marked@0.3.5
cmather:handlebars-server@2.0.0
coffeescript@1.0.5
ddp@1.0.13
deps@1.0.6
djedi:sanitize-html@1.3.0
ejson@1.0.5
email@1.0.5
facebook@1.1.3
fastclick@1.0.2
follower-livedata@1.0.3
fourseven:scss@1.0.0
geojson-utils@1.0.2
handlebars@1.0.2
html-tools@1.0.3
htmljs@1.0.3
http@1.0.9
id-map@1.0.2
iron:controller@1.0.6
iron:core@1.0.6
iron:dynamic-template@1.0.6
iron:layout@1.0.6
iron:location@1.0.6
iron:middleware-stack@1.0.6
iron:router@1.0.6
iron:url@1.0.6
coffeescript@1.0.6
ddp@1.1.0
deps@1.0.7
djedi:sanitize-html@1.6.1
ejson@1.0.6
email@1.0.6
facebook@1.2.0
fastclick@1.0.3
fortawesome:fontawesome@4.3.0
fourseven:scss@2.1.1
gadicohen:robots-txt@0.0.9
gadicohen:sitemaps@0.0.20
geojson-utils@1.0.3
handlebars@1.0.3
html-tools@1.0.4
htmljs@1.0.4
http@1.1.0
id-map@1.0.3
iron:controller@1.0.7
iron:core@1.0.7
iron:dynamic-template@1.0.7
iron:layout@1.0.7
iron:location@1.0.7
iron:middleware-stack@1.0.7
iron:router@1.0.7
iron:url@1.0.7
jparker:crypto-core@0.1.0
jparker:crypto-md5@0.1.1
jparker:gravatar@0.3.1
jquery@1.0.2
json@1.0.2
kestanous:herald@1.1.3
jquery@1.11.3_2
json@1.0.3
kestanous:herald@1.3.0
kestanous:herald-email@0.4.2
launch-screen@1.0.1
less@1.0.12
livedata@1.0.12
localstorage@1.0.2
logging@1.0.6
matb33:collection-hooks@0.7.7
meteor@1.1.4
meteor-platform@1.2.1
launch-screen@1.0.2
less@1.0.14
livedata@1.0.13
localstorage@1.0.3
logging@1.0.7
manuelschoebel:ms-seo@0.4.1
matb33:collection-hooks@0.7.11
meteor@1.1.6
meteor-platform@1.2.2
meteorhacks:async@1.0.0
meteorhacks:fast-render@2.1.5
meteorhacks:kadira@2.15.1
meteorhacks:kadira-binary-deps@1.3.1
meteorhacks:meteorx@1.2.1
meteorhacks:npm@1.2.2
meteorhacks:subs-manager@1.2.2
minifiers@1.1.3
minimongo@1.0.6
miro:mailchimp@1.0.2
mobile-status-bar@1.0.2
momentjs:moment@2.8.4
mongo@1.0.11
mongo-livedata@1.0.7
meteorhacks:fast-render@2.3.1
meteorhacks:inject-data@1.2.2
meteorhacks:kadira@2.20.1
meteorhacks:meteorx@1.3.1
meteorhacks:npm@1.3.0
meteorhacks:picker@1.0.2
meteorhacks:subs-manager@1.3.0
minifiers@1.1.5
minimongo@1.0.8
miro:mailchimp@1.0.4
mobile-status-bar@1.0.3
momentjs:moment@2.9.0
mongo@1.1.0
mongo-livedata@1.0.8
mrt:cookies@0.3.0
mrt:jquery-hotkeys@0.0.1
mrt:moment@2.8.1
npm-bcrypt@0.7.7
npm-bcrypt@0.7.8_2
npm-container@1.0.0
oauth@1.1.3
oauth1@1.1.3
oauth2@1.1.2
observe-sequence@1.0.4
ordered-dict@1.0.2
oauth@1.1.4
oauth1@1.1.4
oauth2@1.1.3
observe-sequence@1.0.6
ordered-dict@1.0.3
percolatestudio:synced-cron@1.1.0
rajit:bootstrap3-datepicker@1.3.1
random@1.0.2
reactive-dict@1.0.5
reactive-var@1.0.4
reload@1.1.2
retry@1.0.2
routepolicy@1.0.3
sacha:juice@0.1.1
rajit:bootstrap3-datepicker@1.4.1
random@1.0.3
reactive-dict@1.1.0
reactive-var@1.0.5
reload@1.1.3
retry@1.0.3
routepolicy@1.0.5
sacha:juice@0.1.3
sacha:spin@2.0.4
service-configuration@1.0.3
session@1.0.5
sha@1.0.2
softwarerero:accounts-t9n@1.0.5
spacebars@1.0.4
spacebars-compiler@1.0.4
spiderable@1.0.6
srp@1.0.2
standard-app-packages@1.0.4
stylus@1.0.6
tap:http-methods@0.0.23
tap:i18n@1.2.1
service-configuration@1.0.4
session@1.1.0
sha@1.0.3
softwarerero:accounts-t9n@1.0.8
spacebars@1.0.6
spacebars-compiler@1.0.6
spiderable@1.0.7
srp@1.0.3
standard-app-packages@1.0.5
stylus@1.0.7
tap:i18n@1.4.1
telescope-api@0.0.0
telescope-base@0.0.0
telescope-daily@0.0.0
@ -120,7 +126,8 @@ telescope-i18n@0.0.0
telescope-invites@0.1.0
telescope-kadira@0.1.0
telescope-lib@0.2.9
telescope-module-share@0.0.0
telescope-messages@0.0.0
telescope-module-share@0.1.0
telescope-newsletter@0.1.0
telescope-notifications@0.1.0
telescope-post-by-feed@0.0.1
@ -128,19 +135,21 @@ telescope-releases@0.1.0
telescope-rss@0.0.0
telescope-search@0.0.0
telescope-singleday@0.1.0
telescope-sitemap@0.0.5
telescope-subscribe-to-posts@0.1.0
telescope-tagline-banner@0.1.0
telescope-tags@0.0.0
telescope-theme-base@0.0.0
telescope-theme-hubble@0.0.0
telescope-update-prompt@0.1.0
templating@1.0.10
tracker@1.0.4
templating@1.1.1
tracker@1.0.7
tsega:bootstrap3-datetimepicker@3.1.3_3
twitter@1.1.3
ui@1.0.5
underscore@1.0.2
url@1.0.3
useraccounts:core@1.4.1
useraccounts:unstyled@1.4.1
webapp@1.1.5
webapp-hashing@1.0.2
twitter@1.1.4
ui@1.0.6
underscore@1.0.3
url@1.0.4
useraccounts:core@1.8.1
useraccounts:unstyled@1.8.1
webapp@1.2.0
webapp-hashing@1.0.3

View file

@ -1,13 +1,96 @@
## v0.15 “SideScope”
#### Layout
* Added new `postListTop` zone that only appears on post lists.
* Now showing tagline on every post list.
* Added the Side Nav layout.
* New Admin menu layout.
#### Settings
* Added the Post Views setting.
* Changed color settings names.
* Added field for optional category image (thanks @dtsepelev!).
#### SEO
* Added `telescope-sitemap` package (thanks @yourcelf!).
* Added improved SEO support (thanks @yourcelf!).
* Added field for SEO site image.
#### Other
* Improved performance when loading comments for long threads (thanks @dandv!).
* Usernames are now case and space insensitive. `John Smith`, `JohnSmith`, and `johnsmith` are now all considered to be the same username (thanks @splendido!).
* Now using `feedparser` instead of `htmlparser2` to parse RSS feeds (thanks @delgermurun!).
* Now supporting RSS categories (thanks @delgermurun).
* Refactored dropdowns into menu components.
* New `{{{icon}}}` helper for icons, using FontAwesome.
* New accent color customization API.
* Fixed various bugs (thanks @webyak, @yourcelf, @ywang28, @delgermurun!).
* Now publishing upvoters and downvoters on single post page.
#### Internationalization
* Added Arabic translation (thanks @nwabdou85!).
* Added missing translations in Brazilian Portuguese (thanks @alanmeira!).
* Improved French translation (thanks @klamzo!).
* Romanian translation (thanks @razvansky!).
* Added Dutch translation (thanks @reneras!).
## v0.14.3 “TableScope”
* Implemented Reactive Table for the Users dashboard (thanks @jshimko!).
* Upgraded Herald package (thanks @kestanous!).
* Upgraded Avatar package (thanks @bengott!).
* Upgraded Autoform package.
* Added Greek translation (thanks @portokallidis!).
* Improved Spanish translation (thanks @brayancruces!).
* Added new callbacks for upvoting and downvoting (thanks @Baxter900 !).
* OP comments now get the `author-comment` CSS class.
## v0.14.2 “FaviconScope”
* Added settings for auth methods.
* Added setting for external fonts.
* Use site tagline as homepage title.
* Make favicon customizable.
* Making webfont customizable. To get previous font back, use: `https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,400italic,700italic`.
* Fix juice issue.
* Non-admins should not be able to access rejected posts.
* Bulgarian translation (thanks @durrrr91!)
## v0.14.1 “TaglineScope”
* Fix double notification bug.
* Fix singleday view bug.
* Fix post approval date bug.
* Don't let non-admins access pending posts.
* Give search field a border on white backgrounds.
* Spanish, Brazilian, Turkish, Vietnamese, Polish translations (thanks everybody!).
* Do not put comment reply page behind log-in wall.
* Various CSS tweaks.
* Added tagline banner package.
* You can now assign a category to posts generated from feeds (thanks @Accentax!).
* Use tagline as title on homepage.
* Refactor default view route controller code.
* Fixed security issue with post editing.
## v0.14.0 “GridScope”
* Adeed Grid Layout option.
* Added Grid Layout option.
* Cleaned up vote click handling functions and added tests (thanks @anthonymayer!).
* Added `threadModules` zone.
* Added `upvoteCallbacks` and `downvoteCallbacks` callback arrays.
* Fix “post awaiting moderation” message bug.
* You can now subscribe to comment threads (thanks @delgermurun!).
* Added `postApproveCallbacks` callback array.
* Added notifications for pending and approved posts, for admins and end users.
* Renaming "digest" view to "singleday".
* Make sure only valid properties can be added to posts and comments.
* Added newsletter time setting (thanks @anthonymayer!).
* Change "sign up" to "register" (thanks @Kikobeats!).
## v0.13.0 “ComponentScope”
@ -24,13 +107,13 @@
* Various CSS tweaks.
* Fixing newsletter issue.
* Post rank now has its own module.
* Changed how field label i18n works.
* Changed how field label i18n works.
## v0.12.0 “DummyScope”
**Important: existing newsletters and feeds need to be manually enabled in the Settings panel**
**Important: existing newsletters and feeds need to be manually enabled in the Settings panel**
* Added "Enable Newsletter" setting. Note: existing newsletters must be re-enabled.
* Added "Enable Newsletter" setting. Note: existing newsletters must be re-enabled.
* Added "Enable Feeds" settings. Note: existing feeds must be re-enabled.
* Now showing release notes for latest version right inside the app.
* Added dummy posts, users, and comments.
@ -50,21 +133,21 @@
* `telescope-post-by-feed` package now lets you import posts from RSS feeds.
* Adding limit of 200 posts to post list request.
* Refactoring post and comment submit to fix latency compensation issues.
* Tags package now using Autoform.
* Tags package now using Autoform.
## v0.11.0 “AvatarScope”
* Added new `userCreatedCallbacks` callback hook.
* Added new setting to subscribe new user to mailing list automatically.
* Added new `debug` setting.
* Added new `debug` setting.
* `siteUrl` setting now affects `Meteor.absoluteUrl()`.
* Added new `clog` function that only logs if `debug` setting is true.
* Simplified post module system, modules are not split in three zones anymore.
* Added new `postThumbnail` hook to show Embedly thumbnail.
* Added new `postThumbnail` hook to show Embedly thumbnail.
* Simplified Hubble theme CSS for both desktop and mobile.
* Many CSS tweaks for Hubble mobile.
* Many CSS tweaks for Hubble mobile.
* Show author and commenters avatars on post item.
* Adding description to post list pages and showing them in menus.
* Adding description to post list pages and showing them in menus.
* Improved Russian translation (thanks @Viktorminator!).
* Now using `editorconfig` (thanks @erasaur!).
* Upgraded to `useraccounts:unstyled@1.4.0` (thanks @splendido!).
@ -82,10 +165,10 @@
## v0.9.11 “FormScope”
* Now using [Autoform](https://github.com/aldeed/meteor-autoform/)'s **quickform** feature to generate post submit and edit forms.
* Now using [Autoform](https://github.com/aldeed/meteor-autoform/)'s **quickform** feature to generate post submit and edit forms.
* Various fixes by [@anthonymayer](https://github.com/anthonymayer).
* Now using [fourseven:scss](https://github.com/fourseven/meteor-scss) to directly compile SCSS files.
* Renamed `post` method to `submitPost`.
* Now using [fourseven:scss](https://github.com/fourseven/meteor-scss) to directly compile SCSS files.
* Renamed `post` method to `submitPost`.
* Post editing now happens via a `postEdit` method.
* Categories are now normalized (only the `_id` is stored on the post object, not the whole category object).
* Refactored Embedly package; now fills in description as well (thanks [@kvindasAB](https://github.com/kvindasAB)!).
@ -129,12 +212,12 @@
* Splitting up the settings form into sub-sections.
* Adding help text to settings form.
* Fixing problem with daily view theming.
* Improving avatar stuff (thanks @shaialon and @bengott!).
* Improving avatar stuff (thanks @shaialon and @bengott!).
## v0.9.6
* Fixed security hole in user update.
* Kadira is now included by default.
* Fixed security hole in user update.
* Kadira is now included by default.
* Comments now have their own feed (thanks @delgermurun!).
* Fixed URL collision bug (thanks @GoodEveningMiss!).
* Now using [`account-templates`](https://github.com/splendido/accounts-templates-core) (thanks @splendido!).
@ -152,7 +235,7 @@
## v0.9.4 “UpdateScope”
* Removed unneeded allow insert on Posts and Comments.
* Removed unneeded allow insert on Posts and Comments.
* Renaming `postMeta` template to `postInfo` to avoid ambiguity.
* Fixing avatar code.
* Adding update prompt package.
@ -162,24 +245,24 @@
## v0.9.3 “DailyScope”
* Show user comments on user profile page.
* Show user comments on user profile page.
* Move votes to their own `user.votes` object.
* Add daily view.
* Default root view is now customizable.
* Default root view is now customizable.
* Updated app to 0.9.0.
* Updated all packages to be 0.9.0-compatible.
* Fixed XSS bug (CVE ID: CVE-2014-5144) by sanitizing user input server-side.
* Now storing both markdown and HTML versions of content.
* Now storing both markdown and HTML versions of content.
## v0.9.2.6 “InviteScope”
* Added new invite features (thanks [@callmephilip](https://github.com/callmephilip)!)
* Changed `navItems` to `primaryNav` and added `secondaryNav`.
* Changed `navItems` to `primaryNav` and added `secondaryNav`.
* Added new `themeSettings` object for storing theme-level settings.
* Notifications is now a nav menu item.
* Notifications is now a nav menu item.
* Renamed `comments` to `commentsCount` on `Post` model.
* Now tracking list of commenters `_id`s on `Post` model.
* Rerun interrupted migrations.
* Rerun interrupted migrations.
## v0.9.2.5 “AccountScope”
@ -189,19 +272,19 @@
## v0.9.2 “MailScope”
* Use [handlebars-server](https://github.com/EventedMind/meteor-handlebars-server) for all email templates.
* Use [handlebars-server](https://github.com/EventedMind/meteor-handlebars-server) for all email templates.
* Refactored email system to use global HTML email wrapper.
* Added routes to preview email templates.
* Added routes to preview email templates.
* Changed how notifications are stored in db.
* Added `deleteNotifications` migration to delete all existing notifications.
* Now using templates for on-site notifications too.
* Added `heroModules` and `footerModules` hooks.
* Added [telescope-newsletter](https://github.com/TelescopeJS/Telescope-Newsletter) package.
* Sending emails from within `setTimeout`s to fix latency compensation issue.
* Added [telescope-newsletter](https://github.com/TelescopeJS/Telescope-Newsletter) package.
* Sending emails from within `setTimeout`s to fix latency compensation issue.
## v0.9.1.2
* Added `lastCommentedAt` property to posts.
* Added `lastCommentedAt` property to posts.
* Added hooks to `post_edit` and `post_submit`'s `rendered` callback.
* Embedly module now supports video embedding in a lightbox.
* Updated to Meteor 0.8.3.
@ -211,16 +294,16 @@
* Using Arunoda's [Subscription Manager](https://github.com/meteorhacks/subs-manager).
* Updating mobile version.
* Made the background color setting into a more general background CSS setting.
* Added `postHeading` and `postMeta` hooks.
* Made the background color setting into a more general background CSS setting.
* Added `postHeading` and `postMeta` hooks.
## v0.9
* See [blog post](http://telesc.pe/blog/telescope-v09-modulescope) for changelog.
* See [blog post](http://telesc.pe/blog/telescope-v09-modulescope) for changelog.
## v0.8.3 “CleanScope”
* Refactored the way dating and timestamping works with pending/approved posts.
* Refactored the way dating and timestamping works with pending/approved posts.
* Cleaned up unused/old third-party code.
* Migrated "submitted" property to "postedAt".
* Added a "postedAt" property to comments.
@ -230,24 +313,24 @@
* Improved migrations with timestamps and number of rows affected.
* Created `telescope-lib` and `telescope-base` pacakge.
* Pulled out search into its own `telescope-search` package.
* Made menu and views modular.
* Made menu and views modular.
* Using SimpleSchema and Collection2 for models.
## v0.8.1 “FlexScope”
* Extracted part of the tags feature into its own package.
* Extracted part of the tags feature into its own package.
* Made subscription preloader more flexible.
* Made navigation menu dynamic.
* Made navigation menu dynamic.
## v0.8 “BlazeScope”
* Updated for Meteor 0.8.1.1/Blaze compatibility.
* Using Collection2/SimpleSchema/Autoforms for Settings form.
* Using Collection2/SimpleSchema/Autoforms for Settings form.
## v0.7.4 “InterScope”
* Added basic internationalization (thanks Toam!).
* Added search logging.
* Added search logging.
## v0.7.3
@ -262,9 +345,9 @@
* Added karma redistribution.
* Improved user dashboard.
* Improved user profiles.
* Improved user profiles.
Note: run the "update user profile" script from the toolbox after updating.
Note: run the "update user profile" script from the toolbox after updating.
## v0.7 “IronScope”
@ -280,7 +363,7 @@ Note: run the "update user profile" script from the toolbox after updating.
* Paginating users dashboard.
* Filtering users dashboard.
Note: If you're upgrading from a previous version of Telescope, you'll need to run the "update user slugs" method from within the Admin Toolbox panel inside the web app to get user profiles to work.
Note: If you're upgrading from a previous version of Telescope, you'll need to run the "update user slugs" method from within the Admin Toolbox panel inside the web app to get user profiles to work.
## v0.6.2
@ -327,4 +410,4 @@ Note: If you're upgrading from a previous version of Telescope, you'll need to r
* Added a second `createdAt` timestamp. Score calculations still use the `submitted` timestamp, but it only gets set when (if) a post gets approved.
* Started keeping track of versions and changes.
* Started keeping track of versions and changes.

View file

@ -0,0 +1,190 @@
@function black($opacity){
@return rgba(0,0,0,$opacity);
}
@function white($opacity){
@return rgba(255,255,255,$opacity);
}
$medium-text: #a4a9ab;
$red: #DD3416;
$text: #444444;
// ------------------------------------ Base ------------------------------------ //
.menu-item{
padding: 5px;
margin: 0;
a{
font-size:14px;
}
}
.menu-label{
display: block;
}
.menu-description{
display: block;
font-weight: normal;
font-size: 12px;
margin-top: 2px;
color: $medium-text;
}
.item-admin{
.menu-label:after{
content: "[A]";
font-size: 10px;
color: $red;
display: inline-block;
margin-left: 3px;
}
}
.item-active{
.dark-bg &, .medium-dark-bg &{
background: white(0.1);
}
.light-bg &, .medium-light-bg &, white-bg &{
background: black(0.1);
}
}
.item-active.item-never-active{
background: none;
}
.menu-top-label{
cursor: pointer;
}
// ------------------------------------ List ------------------------------------ //
.menu-list{
.show-more{
display: none;
}
.item-active{
background: black(0.05);
}
}
// ------------------------------------ Hover ------------------------------------ //
.menu-dropdown{
position:relative;
&.menu-has-items{
.menu-top-level{
cursor: pointer;
&:after{
display:inline-block;
position:relative;
top:-1px;
margin-left:4px;
content:"";
font-size:8px;
}
}
&:hover{
.menu-menu{
display:block;
}
}
}
.menu-menu{
display:none;
top:10px;
left:10px;
position:absolute;
padding-top:20px;
z-index: 10000;
&, a, a:link, a:visited{
color: $text;
}
a.button{
color: white;
}
.menu-contents{
background:white;
padding: 10px;
min-width:180px;
border-radius: 3px;
box-shadow: 0 1px 3px black(0.35);
list-style-type: none;
}
}
.show-more{
display: none;
}
}
// ------------------------------------ Accordion ------------------------------------ //
.menu-accordion{
.menu-top-level{
cursor: default;
display: block;
padding: 5px;
position: relative;
/* note: we use a pseudo-element for the border so we can control the opacity indepdently from the color */
&:after{
content: " ";
display: block;
position: absolute;
width: 100%;
height: 1px;
background: currentColor;
bottom: 0px;
left: 0px;
opacity: 0.5;
}
}
/* ------- Show More Button ------- */
.show-more{
// border-top: 1px solid #ccc;
position: relative;
/* note: we use a pseudo-element for the border so we can control the opacity indepdently from the color */
&:before{
content: " ";
display: block;
position: absolute;
width: 100%;
height: 1px;
background: currentColor;
top: 0px;
left: 0px;
opacity: 0.5;
}
padding: 8px 0;
display: none;
text-align: center;
.icon{
display: block;
height: 20px;
width: 20px;
opacity: 0.5;
margin: 0 auto;
}
&:hover{
background: white(0.2);
.show-more-icon{
opacity: 1;
}
}
.icon-close{
display: none;
}
}
&.menu-long .show-more{
display: block; // only show the "show more" button if the menu has more than three items
}
&.menu-open{
.icon-close{
display: block;
}
.icon-open{
display: none;
}
}
/* expand/collapse animation */
.menu-contents{
max-height: 93px;
overflow: hidden;
transition: max-height ease-out 300ms;
}
&.menu-open .menu-contents{
max-height: 999px !important;
}
}

View file

@ -0,0 +1,60 @@
<!--
Menu Component
menuName (String)
| The name of the menu
menuItems (Array)
| An array containing the contents of the menu
- route (String/Function) [optional]
- label (String/Function) [optional]
- description (String) [optional]
- itemClass (String) [optional]
| an optional CSS class
- adminOnly (Boolean) [optional]
| whether to only show the item to admins
- template (String) [optional]
| if a template is provided, it will override the route/label/description
- data (Object) [optional]
| data contexnt for the template
menuLabel (String) [optional]
menuClass (String) [optional]
| An optional default CSS class given to the menu
menuMode (String) [optional]
| "accordion", "dropdown", or "list" (defaults to "list")
-->
<template name="menuComponent">
<div class="menu {{menuClass}}">
<div class="menu-top-level" href="/">{{menuLabel}}</div>
<div class="menu-menu">
{{#with menuItems}}
<ul class="menu-contents" role="menu" aria-labelledby="dLabel">
{{#each this}}
{{#if showMenuItem}}
{{#if hasTemplate}}
{{> Template.dynamic template=template data=data}}
{{else}}
<li class="menu-item {{itemClass}}">
<a class="menu-sub-level" href="{{itemRoute}}">
<span class="menu-label">{{itemLabel}}</span>
{{#if description}}<span class="menu-description">{{_ description}}</span>{{/if}}
</a>
</li>
{{/if}}
{{/if}}
{{/each}}
</ul>
{{/with}}
<a class="show-more" href="#">
{{{icon "open"}}}
{{{icon "close"}}}
</a>
</div>
</div>
</template>

View file

@ -0,0 +1,74 @@
getRoute = function (item) {
// if route is a Function return its result, else apply Router.path() to it
return typeof item.route == "function" ? item.route() : Router.path(item.route);
}
Template[getTemplate('menuComponent')].helpers({
menuClass: function () {
var classes = [this.menuName+"-menu"];
var mode = (typeof this.menuMode === "undefined") ? "list" : this.menuMode;
var count = this.menuItems.length;
classes.push("menu-"+mode);
if(!!this.menuClass) {
classes.push(this.menuClass)
}
// enable menu if top-nav layout is enabled, if themes supports menus, and if menu isn't empty
if (count) {
classes.push("menu-has-items");
if (count > 3) {
classes.push("menu-long");
}
} else {
classes.push("menu-no-items");
}
return classes.join(" ");
},
menuLabel: function () {
// if label is defined, use this. Else default to menu name
return !!this.menuLabel ? this.menuLabel : i18n.t(this.menuName);
},
showMenuItem: function () {
// if this is an admin item, only show it if current user is admin
return this.adminOnly ? isAdmin(Meteor.user()) : true;
},
hasTemplate: function () {
return !!this.template;
},
itemClass: function () {
var itemClass = "";
var currentPath = Router.current().location.get().path ;
if (this.adminOnly) {
itemClass += " item-admin";
}
if (getRoute(this) === currentPath || getRoute(this) === Meteor.absoluteUrl() + currentPath.substr(1)) {
// substr(1) is to avoid having two "/" in the URL
itemClass += " item-active";
}
if (this.itemClass) {
itemClass += " "+this.itemClass;
}
return itemClass;
},
itemLabel: function () {
// if label is a Function return its result, else return i18n'd version of label
return typeof this.label == "function" ? this.label() : i18n.t(this.label);
},
itemRoute: function () {
return getRoute(this);
}
});
Template[getTemplate('menuComponent')].events({
'click .show-more': function (e, t) {
e.preventDefault();
$menu = t.$('.menu');
$menu.toggleClass('menu-open');
}
});

View file

@ -0,0 +1,64 @@
<!--
Post List Component
title (String)
| The title of the post list
incoming (Cursor)
| A cursor containing the new posts since render
postsCursor (Cursor)
| A cursor containing the post list
postsCount (Number)
| How many posts are loaded
postsReady (Boolean)
| Whether the subscription is ready
hasMorePosts (Boolean)
| Whether there are still more posts that can be loaded
loadMoreHandler (Function)
| What to do when the user clicks "load more"
-->
<template name="posts_list">
<div class="posts-wrapper grid grid-module">
{{> Template.dynamic template=postsListIncoming data=incoming}}
<div class="posts list {{postsLayout}}" aria-live="polite">
{{#each postsCursor}}
{{> Template.dynamic template=before_post_item}}
{{> Template.dynamic template=post_item}}
{{> Template.dynamic template=after_post_item}}
{{/each}}
</div>
{{> Template.dynamic template=postsLoadMore}}
</div>
</template>
<template name="postsListIncoming">
{{#if count}}
<a class="more-button show-new grid-module" href="">
<span>
{{_ "view"}} {{count}} {{_ "new"}} {{pluralize count "post"}}
</span>
</a>
{{/if}}
</template>
<template name="postsLoadMore">
{{#if postsReady}}
{{#if hasPosts}}
{{#if hasMorePosts}}
<a class="more-button" href="#"><span>{{_ "load_more"}}</span></a>
{{/if}}
{{else}}
<div class="no-posts">{{_ "sorry_we_couldnt_find_any_posts"}}</div>
{{/if}}
{{else}}
<div class="loading-module">{{> spinner}}</div>
{{/if}}
</template>

View file

@ -1,3 +1,5 @@
// ----------------------------------- Post List -----------------------------------//
Template[getTemplate('posts_list')].created = function() {
Session.set('listPopulatedAt', new Date());
};
@ -36,5 +38,40 @@ Template[getTemplate('posts_list')].helpers({
},
postsListIncoming: function () {
return getTemplate('postsListIncoming');
},
postsListSort: function () {
return getTemplate('postsListSort');
}
});
// ----------------------------------- Incoming -----------------------------------//
Template[getTemplate('postsListIncoming')].events({
'click .show-new': function(e, instance) {
Session.set('listPopulatedAt', new Date());
}
});
// ----------------------------------- Load More -----------------------------------//
Template[getTemplate('postsLoadMore')].helpers({
postsReady: function () {
return this.postsReady;
},
hasPosts: function () {
return !!this.postsCursor.count();
}
});
Template[getTemplate('postsLoadMore')].events({
'click .more-button': function (event, instance) {
event.preventDefault();
if (this.controllerInstance) {
// controller is a template
this.loadMoreHandler(this.controllerInstance);
} else {
// controller is router
this.loadMoreHandler();
}
}
});

View file

@ -15,7 +15,6 @@ UI.registerHelper('eachWithRank', function(items, options) {
});
UI.registerHelper('getSetting', function(setting, defaultArgument){
defaultArgument = defaultArgument || '';
setting = getSetting(setting, defaultArgument);
return setting;
});
@ -36,7 +35,7 @@ UI.registerHelper('isAdmin', function(showError) {
return true;
}
if ((typeof showError === 'string') && (showError === 'true')) {
flashMessage(i18n.t('sorry_you_do_not_have_access_to_this_page'), 'error');
Messages.flash(i18n.t('sorry_you_do_not_have_access_to_this_page'), 'error');
}
return false;
});
@ -81,4 +80,15 @@ UI.registerHelper('userName', function(userOrUserId) {
if (!!user) {
return getUserName(user);
}
});
});
UI.registerHelper('displayName', function(userOrUserId) {
var user = (typeof userOrUserId === 'string') ? Meteor.users.findOne(userOrUserId) : userOrUserId;
if (!!user) {
return getDisplayName(user);
}
});
UI.registerHelper('icon', function(iconName, iconClass) {
return getIcon(iconName, iconClass);
});

View file

@ -1,6 +1,5 @@
<head>
<title>Loading...</title>
<meta name="viewport" content="initial-scale=1.0">
<link rel="shortcut icon" href="/img/favicon.ico"/>
<link id="rss-link" rel="alternate" type="application/rss+xml" title="New Posts" href="/feed.xml"/>
</head>

View file

@ -12,4 +12,31 @@ Meteor.startup(function () {
$('#rss-link').attr('title', i18n.t('new_posts'));
});
// AutoForm.debug();
// AutoForm.debug();
Meteor.startup(function() {
var seoProperties = {
meta: {},
og: {}
}
var title = getSetting("title", "Telescope");
if (!!getSetting("tagline")) {
title += ": "+getSetting("tagline");
}
seoProperties.title = title;
if (!!getSetting("description")) {
seoProperties.meta.description = getSetting("description");
seoProperties.og.description = getSetting("description");
}
if (!!getSetting("siteImage")) {
seoProperties.og.image = getSetting("siteImage");
}
SEO.config(seoProperties);
});

View file

@ -0,0 +1,5 @@
<template name="adminMenu">
{{#if isAdmin}}
{{> menuComponent menuName="admin" menuMode="list" menuItems=adminMenuItems}}
{{/if}}
</template>

View file

@ -0,0 +1,5 @@
Template[getTemplate('adminMenu')].helpers({
adminMenuItems: function () {
return adminMenu;
}
});

View file

@ -0,0 +1,8 @@
<template name="adminWrapper">
<div class="grid admin-wrapper">
{{> Template.dynamic template=adminMenu}}
<div class="admin-contents {{contentsClass}}">
{{> Template.dynamic template=contents data=this}}
</div>
</div>
</template>

View file

@ -0,0 +1,11 @@
Template[getTemplate('adminWrapper')].helpers({
adminMenu: function () {
return getTemplate("adminMenu");
},
contents: function () {
return Router.current().route.getName();
},
contentsClass: function () {
return Router.current().route.getName()+"-contents";
}
});

View file

@ -1,9 +1,7 @@
<template name="settingsForm">
<div class="grid-small grid-module dialog settings">
{{#if this.hasSettings}}
{{> quickForm collection="Settings" id="updateSettingsForm" type="update" doc=this.settings label-class="control-label" input-col-class="controls" template="telescope"}}
{{else}}
{{> quickForm collection="Settings" id="insertSettingsForm" type="insert" template="telescope" label-class="control-label" input-col-class="controls"}}
{{/if}}
</div>
<template name="settings">
{{#if this.hasSettings}}
{{> quickForm collection="Settings" id="updateSettingsForm" type="update" doc=this.settings label-class="control-label" input-col-class="controls" template="telescope"}}
{{else}}
{{> quickForm collection="Settings" id="insertSettingsForm" type="insert" template="telescope" label-class="control-label" input-col-class="controls"}}
{{/if}}
</template>

View file

@ -2,36 +2,36 @@ AutoForm.hooks({
updateSettingsForm: {
before: {
update: function(docId, modifier, template) {
template.$('button[type=submit]').addClass('loading');
update: function(modifier) {
this.template.$('button[type=submit]').addClass('loading');
return modifier;
}
},
onSuccess: function(operation, result, template) {
template.$('button[type=submit]').removeClass('loading');
onSuccess: function(operation, result) {
this.template.$('button[type=submit]').removeClass('loading');
},
onError: function(operation, result, template) {
template.$('button[type=submit]').removeClass('loading');
this.template.$('button[type=submit]').removeClass('loading');
}
},
insertSettingsForm: {
before: {
insert: function(doc, template) {
template.$('button[type=submit]').addClass('loading');
insert: function(doc) {
this.template.$('button[type=submit]').addClass('loading');
return doc;
}
},
onSuccess: function(operation, result, template) {
template.$('button[type=submit]').removeClass('loading');
onSuccess: function(operation, result) {
this.template.$('button[type=submit]').removeClass('loading');
},
onError: function(operation, result, template) {
template.$('button[type=submit]').removeClass('loading');
onError: function(operation, result) {
this.template.$('button[type=submit]').removeClass('loading');
}
}

View file

@ -1,5 +0,0 @@
<template name="comment_deleted">
<div class="grid-small grid-block">
<p>{{_ "your_comment_has_been_deleted"}}</p>
</div>
</template>

View file

@ -25,7 +25,7 @@ Template[getTemplate('comment_edit')].events({
if(confirm(i18n.t("are_you_sure"))){
Meteor.call('removeComment', comment._id);
Router.go('post_page', {_id: comment.postId});
flashMessage("Your comment has been deleted.", "success");
Messages.flash("Your comment has been deleted.", "success");
}
}
});

View file

@ -9,7 +9,7 @@ Template[getTemplate('comment_form')].events({
e.preventDefault();
$(e.target).addClass('disabled');
clearSeenMessages();
Messages.clearSeen();
var comment = {};
var $commentForm = instance.$('#comment');
@ -20,8 +20,6 @@ Template[getTemplate('comment_form')].events({
// $commentForm.prop('disabled', true);
// $submitButton.addClass('loading');
$commentForm.val('');
// context can be either post, or comment property
var postId = !!this._id ? this._id: this.comment.postId;
var post = Posts.findOne(postId);
@ -41,9 +39,10 @@ Template[getTemplate('comment_form')].events({
// $submitButton.removeClass('loading');
if(error){
console.log(error);
flashMessage(error.reason, "error");
Messages.flash(error.reason, "error");
}else{
trackEvent("newComment", newComment);
$commentForm.val('');
}
});

View file

@ -1,5 +1,5 @@
<template name="comment_item">
<li class="comment module comment-displayed" id="{{_id}}">
<li class="comment module comment-displayed {{commentClass}}" id="{{_id}}">
<div class="comment-body">
{{#if isDeleted}}
<div class="comment-deleted">This comment has been deleted.</div>
@ -7,16 +7,16 @@
<div class="comment-content">
<div class="comment-actions {{#if upvoted}}upvoted{{else}}not-upvoted{{/if}} {{#if downvoted}}downvoted{{else}}not-downvoted{{/if}}">
<a class="upvote" href="#">
<i class="icon-up"></i>
{{{icon "upvote"}}}
<span>{{_ "upvote"}}</span>
</a>
<a class="downvote" href="#">
<i class="icon-down"></i>
{{{icon "downvote"}}}
<span>{{_ "downvote"}}</span>
</a>
</div>
<div class="comment-meta">
<div class="user-avatar avatar-medium">{{> avatar userId=userId shape="circle"}}</div>
<div class="user-avatar avatar-medium" aria-hidden="true">{{> avatar userId=userId shape="circle"}}</div>
<a class="comment-username" href="{{profileUrl}}">{{authorName}}</a>
<span class="comment-time">{{timeAgo ago}},</span>
<span class="points">{{upvotes}}</span> <span class="unit">points </span>

View file

@ -66,6 +66,12 @@ Template[getTemplate('comment_item')].helpers({
comment_item: function () {
return getTemplate('comment_item');
},
commentClass: function () {
// if this comment was made by the post author
if (Posts.findOne(this.postId).userId == this.userId) {
return 'author-comment';
}
},
full_date: function(){
return this.createdAt.toString();
},
@ -103,9 +109,10 @@ Template[getTemplate('comment_item')].helpers({
var handleVoteClick = function (meteorMethodName, eventName, e, instance) {
e.preventDefault();
e.stopImmediatePropagation(); // needed to prevent the handler running multiple times in nested comments
if (!Meteor.user()){
Router.go('atSignIn');
flashMessage(i18n.t('please_log_in_first'), 'info');
Messages.flash(i18n.t('please_log_in_first'), 'info');
} else {
Meteor.call(meteorMethodName, this, function(error, result){
trackEvent(eventName, {

View file

@ -1,5 +1,5 @@
<template name="comment_list">
<ul class="comments comment-list">
<ul class="comments comment-list" aria-live="polite">
{{#each child_comments}}
{{> UI.dynamic template=comment_item}}
{{/each}}

View file

@ -8,7 +8,7 @@
{{/with}}
{{#with comment}}
<ul class="selected-comment">
<ul class="selected-comment" aria-live="polite">
{{> UI.dynamic template=comment_item}}
</ul>
{{/with}}
@ -17,5 +17,9 @@
{{> UI.dynamic template=comment_form}}
{{/if}}
{{#if isLoggedIn}}
{{else}}
<p><a href="/sign-in">{{_ "please_sign_in_to_reply"}}</a></p>
{{/if}}
</div>
</template>

View file

@ -1,33 +1,30 @@
<template name="css">
<style>
{{elementColors}}
body, textarea, input, button, input[type="submit"], input[type="button"]{
font-family: {{getSetting 'fontFamily'}};
}
body{
background: {{getSetting "backgroundCSS"}};
}
input[type="submit"], button, .button, .auth-buttons #login-buttons #login-buttons-password, .btn-primary, .error, .mobile-menu-button, .login-link-text, .post-category:hover{
background-color: {{getSetting "buttonColor"}} !important;
color: {{getSetting "buttonTextColor"}} !important;
.logo-image a{
max-height:{{getSetting "logoHeight"}}px;
max-width:{{getSetting "logoWidth"}}px;
}
a:hover, .post-content .post-heading .post-title:hover, .post-content .post-upvote .upvote-link i, .comment-actions a i, .comment-actions.upvoted .upvote i, .comment-actions.downvoted .downvote i, .toggle-actions-link, .post-meta a:hover, .action:hover, .post-upvote .upvote-link i{
color: {{getSetting "buttonColor"}};
{{hideAuthClass}}
@media screen and (max-width: 600px) {
/* find a way to get rid of this */
.post-discuss .icon, .post-discuss .action-count{
color: {{getSetting "buttonColor"}};
}
}
.post-upvote .upvote-link i{
border-color: {{getSetting "buttonColor"}};
}
.toggle-actions-link{
border-color: {{getSetting "buttonColor"}};
}
.post-content .post-upvote .upvote-link.voted i.icon-check{
/*color: {{getSetting "secondaryColor"}};*/
}
.header{
background-color: {{getSetting "headerColor"}};
}
.header, .header .logo a, .header .logo a:visited{
color: {{getSetting "headerTextColor"}};
}
.logo-image a{
max-height:{{getSetting "logoHeight"}}px;
max-width:{{getSetting "logoWidth"}}px;
}
</style>
<link href='{{getSetting 'fontUrl'}}' rel='stylesheet' type='text/css'>
</template>

View file

@ -1,2 +1,54 @@
Template[getTemplate('css')].helpers({
elementColors: function () {
var css = "";
// first loop over each of the four color
_.each(colorTable, function (elements, color) {
var properties = {};
// for each color, loop over the items to build the selector
_.each(elements, function (element) {
var elementSelector = element.selector;
var elementProperty = !!element.property ? element.property : "color"; // default to color property
properties[elementProperty] += ", "+elementSelector;
});
// loop over all properties, and add the relevant selectors
_.each(properties, function (selector, property) {
css += selector + "{\n " + property + ": " + getSetting(color) + ";\n}\n";
});
});
return css;
},
headerTextColorHalfOpacity: function () {
return tinycolor(getSetting("headerTextColor")).setAlpha(0.5);
},
buttonColorHalfOpacity: function () {
return tinycolor(getSetting("buttonColor")).setAlpha(0.5);
},
hideAuthClass: function () {
var authClass = '';
var authMethods = getSetting('authMethods', ["email"]);
var selectors = [
{name: 'email', selector: ".at-pwd-form"},
{name: 'twitter', selector: "#at-twitter"},
{name: 'facebook', selector: "#at-facebook"}
];
selectors.forEach(function (method) {
// if current method is not one of the enabled auth methods, hide it
if (authMethods.indexOf(method.name) == -1) {
authClass += method.selector + ", ";
}
});
// unless we're showing at least one of twitter and facebook AND the password form,
// hide separator
if (authMethods.indexOf('email') == -1 || (authMethods.indexOf('facebook') == -1 && authMethods.indexOf('twitter') == -1)) {
authClass += ".at-sep, ";
}
return authClass.slice(0, - 2) + "{display:none !important}";
}
});

View file

@ -1,7 +1,7 @@
<template name="layout">
{{> UI.dynamic template=css}}
<div class="outer-wrapper {{currentPage}}">
<div class="outer-wrapper {{currentPage}} {{navLayout}}">
{{> UI.dynamic template=mobile_nav}}
<div class="inner-wrapper template-{{pageName}}">
{{> UI.dynamic template=nav}}
@ -10,6 +10,8 @@
{{#each heroModules}}
{{> UI.dynamic template=getTemplate}}
{{/each}}
{{> yield "adminMenu"}}
{{> yield "postListTop"}}
{{> yield}}
{{> UI.dynamic template=footer}}
</div>

View file

@ -5,6 +5,9 @@ Template[getTemplate('layout')].helpers({
nav: function () {
return getTemplate('nav');
},
navLayout: function () {
return getSetting('navLayout', 'top-nav');
},
messages: function () {
return getTemplate('messages');
},
@ -20,8 +23,11 @@ Template[getTemplate('layout')].helpers({
css: function () {
return getTemplate('css');
},
extraCode: function() {
return getSetting('extraCode');
},
heroModules: function () {
return heroModules;
return _.sortBy(heroModules, 'order');
},
getTemplate: function () {
return getTemplate(this.template);
@ -37,6 +43,14 @@ Template[getTemplate('layout')].rendered = function(){
$('body').scrollTop(currentScroll);
Session.set('currentScroll', null);
}
// favicon
var link = document.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = getSetting('faviconUrl', '/img/favicon.ico');
document.getElementsByTagName('head')[0].appendChild(link);
};
Template[getTemplate('layout')].events({

View file

@ -1,10 +0,0 @@
Template[getTemplate('message_item')].helpers({
});
Template[getTemplate('message_item')].created = function(){
var messageId=this.data._id;
Meteor.setTimeout(function(){
Messages.update(messageId, {$set: {seen:true}});
}, 100);
};

View file

@ -6,27 +6,19 @@ var findAtts = function () {
return c && c.atts;
}
var getSchema = function () {
var schema = AutoForm.find().ss._schema;
// decorate schema with key names
schema = _.map(schema, function (field, key) {
field.name = key;
return field;
});
return schema;
}
var canEditField = function (field) {
// show field only if user is admin or it's marked as editable
return isAdmin(Meteor.user()) || !!field.atts.editable || (!!field.afFieldInputAtts && !!field.afFieldInputAtts.editable)
return isAdmin(Meteor.user()) || (!!field.atts && !!field.atts.editable) || (!!field.afFieldInputAtts && !!field.afFieldInputAtts.editable)
}
Template[getTemplate('quickForm_telescope')].helpers({
fieldsWithNoFieldset: function () {
// get names of fields who don't have an autoform attribute or don't have a group, but are not omitted
var fields = _.pluck(_.filter(getSchema(), function (field, key) {
// note: we need to _.map() first to assign the field key to the "name" property to preserve it.
var fields = _.pluck(_.filter(_.map(AutoForm.getFormSchema()._schema, function (field, key) {
field.name = key;
return field;
}), function (field) {
if (field.name.indexOf('$') !== -1) // filter out fields with "$" in their name
return false
if (field.autoform && field.autoform.omit) // filter out fields with omit = true
@ -34,11 +26,12 @@ Template[getTemplate('quickForm_telescope')].helpers({
if (field.autoform && field.autoform.group) // filter out fields with a group
return false
return true // return remaining fields
}), 'name');
}), "name");
return fields;
},
afFieldsets: function () {
var groups = _.compact(_.uniq(_.pluckDeep(getSchema(), 'autoform.group')));
var groups = _.compact(_.uniq(_.pluckDeep(AutoForm.getFormSchema()._schema, 'autoform.group')));
// if user is not admin, exclude "admin" group from fieldsets
if (!isAdmin(Meteor.user()))
@ -51,9 +44,8 @@ Template[getTemplate('quickForm_telescope')].helpers({
},
fieldsForFieldset: function () {
var fieldset = this.toLowerCase();
// get names of fields whose group match the current fieldset
var fields = _.pluck(_.filter(getSchema(), function (field, key) {
var fields = _.pluck(_.filter(AutoForm.getFormSchema()._schema, function (field, key) {
return (field.name.indexOf('$') === -1) && field.autoform && field.autoform.group == fieldset;
}), 'name');
@ -135,17 +127,13 @@ Template["afFormGroup_telescope"].helpers({
return this.afFieldInputAtts.instructions;
},
label: function () {
var fieldName = this.name;
var fieldSchema = AutoForm.getFormSchema().schema(fieldName);
var name = this.atts.name;
var label = name; // default to field name
// ugly hack to figure out if schema is Post (the only one that's modifiable right now)
if (getCurrentTemplate().indexOf("post") !== -1 && !!postSchemaObject[name].label) {
var label = postSchemaObject[name].label;
}
return i18n.t(label);
// if a label has been explicitely specified, use it; else default to capitalization of i18n of the field name
var label = !!fieldSchema.label ? fieldSchema.label: capitalise(i18n.t(fieldName));
return label;
}
});

View file

@ -1,14 +0,0 @@
<template name="adminMenu">
{{#if isAdmin}}
<div class="dropdown header-submodule admin-menu">
<a class="admin dropdown-top-level" href="/">{{_ "admin"}}</a>
<div class="dropdown-menu">
<ul role="menu" aria-labelledby="dLabel">
{{#each menu}}
{{> UI.dynamic template=menuItem data=this}}
{{/each}}
</ul>
</div>
</div>
{{/if}}
</template>

View file

@ -1,8 +0,0 @@
Template[getTemplate('adminMenu')].helpers({
menuItem: function () {
return getTemplate('menuItem');
},
menu: function () {
return adminMenu;
}
});

View file

@ -0,0 +1,11 @@
<template name="logo">
{{#if logo_url}}
<h1 class="logo logo-image header-module">
<a href="/">
<img src="{{logo_url}}" alt="{{site_title}}"/>
</a>
</h1>
{{else}}
<h1 class="logo header-module"><a href="/">{{site_title}}</a></h1>
{{/if}}
</template>

8
client/views/nav/logo.js Normal file
View file

@ -0,0 +1,8 @@
Template[getTemplate('logo')].helpers({
site_title: function(){
return getSetting('title', "Telescope");
},
logo_url: function(){
return getSetting('logoUrl');
}
});

View file

@ -1,8 +0,0 @@
<template name="menuItem">
<li>
<a class="dropdown-sub-level" href="{{pathFor route}}">
<span class="menu-label">{{_ label}}</span>
{{#if description}}<span class="menu-description">{{_ description}}</span>{{/if}}
</a>
</li>
</template>

View file

@ -1,16 +1,10 @@
<template name="mobile_nav">
<div class="mobile-nav">
<div class="mobile-nav-inner">
<ul class="mobile-menu">
{{#each primaryNav}}
{{#each mobileNav}}
<li>
{{> UI.dynamic template=getTemplate}}
</li>
{{/each}}
{{#each secondaryNav}}
<li>
{{> UI.dynamic template=getTemplate}}
{{> Template.dynamic template=getTemplate data=mobileContext}}
</li>
{{/each}}
</ul>

View file

@ -1,28 +1,31 @@
Template[getTemplate('mobile_nav')].helpers({
primaryNav: function () {
return primaryNav;
mobileNav: function () {
return _.sortBy(mobileNav, 'order');
},
secondaryNav: function () {
return secondaryNav;
logoTemplate: function () {
return getTemplate('logo');
},
getTemplate: function () {
return getTemplate(this).template;
return getTemplate(this.template);
},
mobileContext: function () {
return {mobile: true};
}
});
Template[getTemplate('mobile_nav')].events({
'click .dropdown-sub-level': function () {
'click .menu-sub-level': function () {
$('body').toggleClass('mobile-nav-open');
}
});
Template[getTemplate('mobile_nav')].events({
'click .dropdown-top-level': function (e) {
'click .menu-top-level': function (e) {
e.preventDefault();
$(e.currentTarget).next().slideToggle('fast');
},
'click .mobile-nav a': function (e) {
if (e.target.className.indexOf('dropdown-top-level') == -1){
if (e.target.className.indexOf('menu-top-level') == -1){
$('body').removeClass('mobile-nav-open');
}
}

View file

@ -1,39 +1,27 @@
<template name="nav">
<header class="header">
<header class="header {{headerClass}}">
<a href="#menu" class="mobile-only mobile-menu-button button">
<svg height="24px" id="Layer_1" style="enable-background:new 0 0 32 32;" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path class="hamburger" d="M4,10h24c1.104,0,2-0.896,2-2s-0.896-2-2-2H4C2.896,6,2,6.896,2,8S2.896,10,4,10z M28,14H4c-1.104,0-2,0.896-2,2 s0.896,2,2,2h24c1.104,0,2-0.896,2-2S29.104,14,28,14z M28,22H4c-1.104,0-2,0.896-2,2s0.896,2,2,2h24c1.104,0,2-0.896,2-2 S29.104,22,28,22z"/></svg>
{{{icon "menu"}}}
</a>
{{#if logo_url}}
<h1 class="logo logo-image header-module">
<a href="/">
<img src="{{logo_url}}" alt="{{site_title}}"/>
</a>
</h1>
{{else}}
<h1 class="logo header-module"><a href="/">{{site_title}}</a></h1>
{{/if}}
{{> Template.dynamic template=logoTemplate}}
{{#if hasPrimaryNav}}
<ul class="nav primary-nav desktop-nav {{dropdownClass}} header-module desktop-only">
{{#each primaryNav}}
<li>
{{> UI.dynamic template=getTemplate}}
</li>
{{#with primaryNav}}
<div class="nav primary-nav desktop-nav header-module desktop-only">
{{#each this}}
{{> UI.dynamic template=getTemplate}}
{{/each}}
</ul>
{{/if}}
</div>
{{/with}}
{{#if hasSecondaryNav}}
<ul class="nav secondary-nav desktop-nav {{dropdownClass}} header-module desktop-only">
{{#each secondaryNav}}
<li>
{{> UI.dynamic template=getTemplate}}
</li>
{{#with secondaryNav}}
<div class="nav secondary-nav desktop-nav header-module desktop-only">
{{#each this}}
{{> UI.dynamic template=getTemplate}}
{{/each}}
</ul>
{{/if}}
</div>
{{/with}}
</header>
</template>

View file

@ -1,4 +1,20 @@
Template[getTemplate('nav')].helpers({
headerClass: function () {
var headerClass = "";
var bgBrightness = tinycolor(getSetting('headerColor')).getBrightness();
if (bgBrightness < 50) {
headerClass += " dark-bg";
} else if (bgBrightness < 130) {
headerClass += " medium-dark-bg";
} else if (bgBrightness < 220) {
headerClass += " medium-light-bg";
} else if (bgBrightness < 255) {
headerClass += " light-bg";
} else {
headerClass += " white-bg";
}
return headerClass;
},
primaryNav: function () {
return _.sortBy(primaryNav, 'order');
},
@ -12,16 +28,30 @@ Template[getTemplate('nav')].helpers({
return !!secondaryNav.length;
},
dropdownClass: function () {
return getThemeSetting('useDropdowns', true) ? 'has-dropdown' : 'no-dropdown';
var dropdownClass = "";
// only use dropdowns for top nav
if (this.length > 3) {
dropdownClass += "long-dropdown";
}
if (getSetting('navLayout', 'top-nav') == 'top-nav' && getThemeSetting('useDropdowns', true)) {
dropdownClass += "has-dropdown";
} else {
dropdownClass += "no-dropdown";
}
return dropdownClass;
},
hasMoreThanThreeItems: function () {
console.log(this)
return this.length > 3;
},
logoTemplate: function () {
return getTemplate('logo');
},
navZoneTemplate: function () {
return getTemplate('navZone');
},
getTemplate: function () {
return getTemplate(this.template);
},
site_title: function(){
return getSetting('title', "Telescope");
},
logo_url: function(){
return getSetting('logoUrl');
}
});

View file

@ -1,17 +1,8 @@
<template name="userMenu">
{{#if isLoggedIn}}
<div class="user-menu dropdown header-submodule">
<a class="view dropdown-top-level" href="/">{{name}}</a>
<div class="dropdown-menu">
<ul role="menu" aria-labelledby="dLabel">
<li><a href="{{profileUrl}}">{{_ "profile"}}</a></li>
<li><a href="{{userEditUrl}}">{{_ "edit_account"}}</a></li>
<li><a href="{{pathFor route='signOut'}}">{{_ "sign_out"}}</a></li>
</ul>
</div>
</div>
{{> menuComponent menuName="user" menuLabel=menuLabel menuItems=menuItems menuClass="header-submodule" menuMode=menuMode}}
{{else}}
<a class="account-link sign-in" href="{{pathFor route='atSignIn'}}">{{_ "sign_in"}}</a>
<a class="account-link sign-up" href="{{pathFor route='atSignUp'}}">{{_ "sign_up"}}</a>
<a class="account-link sign-in" href="{{pathFor route='atSignUp'}}">{{_ "sign_up"}}</a>
<a class="account-link sign-up" href="{{pathFor route='atSignIn'}}">{{_ "sign_in"}}</a>
{{/if}}
</template>
</template>

View file

@ -1,14 +1,17 @@
Template[getTemplate('userMenu')].helpers({
isLoggedIn: function () {
return !!Meteor.user();
},
name: function () {
menuLabel: function () {
return getDisplayName(Meteor.user());
},
profileUrl: function () {
return Router.path('user_profile', {_idOrSlug: Meteor.user().slug});
menuItems: function () {
return userMenu;
},
userEditUrl: function () {
return Router.path('user_edit', {slug: Meteor.user().slug});
menuMode: function () {
if (!!this.mobile) {
return 'list';
} else if (getSetting('navLayout', 'top-nav') === 'top-nav') {
return 'dropdown';
} else {
return 'accordion';
}
}
});

View file

@ -1,14 +1,5 @@
<template name="viewsMenu">
{{#if canView}}
<div class="dropdown header-submodule views-menu">
<a class="view dropdown-top-level" href="/">{{_ "view"}}</a>
<div class="dropdown-menu">
<ul role="menu" aria-labelledby="dLabel">
{{#each views}}
{{> UI.dynamic template=menuItem data=this}}
{{/each}}
</ul>
</div>
</div>
{{> menuComponent viewsMenuData}}
{{/if}}
</template>

View file

@ -1,8 +1,8 @@
Template[getTemplate('viewsMenu')].helpers({
menuItem: function () {
return getTemplate('menuItem');
},
views: function () {
return viewsMenu;
viewsMenuData: function () {
return {
dropdownName: 'view',
dropdownItems: viewsMenu
}
}
});

View file

@ -1,5 +1,5 @@
<template name="postActions">
<a class="toggle-actions-link mobile-only" href="#">
<span class="action"></span>
{{{icon "more" "icon-circle"}}}
</a>
</template>

View file

@ -1,13 +1,11 @@
<template name="postAdmin">
{{#if isAdmin}}
<div class="post-meta-item">
{{#if postsMustBeApproved}}
|
{{#if isApproved}}
<a href="#" class="unapprove-link goto-edit">{{_ "unapprove"}}</a>
{{else}}
<a href="#" class="approve-link goto-edit">{{_ "approve"}}</a>
{{/if}}
<div class="post-meta-item" aria-live="off">
{{#if showApprove}}
| <a href="#" class="approve-link goto-edit">{{_ "approve"}}</a>
{{/if}}
{{#if showUnapprove}}
| <a href="#" class="unapprove-link goto-edit">{{_ "unapprove"}}</a>
{{/if}}
| {{_ "score"}}: {{shortScore}}, {{_ "clicks"}}: {{clickCount}}, {{_ "views"}}: {{viewCount}}
</div>

View file

@ -1,9 +1,9 @@
Template[getTemplate('postAdmin')].helpers({
postsMustBeApproved: function () {
return !!getSetting('requirePostsApproval');
showApprove: function () {
return this.status == STATUS_PENDING;
},
isApproved: function(){
return this.status == STATUS_APPROVED;
showUnapprove: function(){
return !!getSetting('requirePostsApproval') && this.status == STATUS_APPROVED;
},
shortScore: function(){
return Math.floor(this.score*1000)/1000;

View file

@ -1,3 +1,3 @@
<template name="postAuthor">
<a class="post-author" href="{{profileUrl userId}}">{{userName userId}}</a>
<a class="post-author" href="{{profileUrl userId}}">{{displayName userId}}</a>
</template>

View file

@ -1,11 +1,11 @@
<template name="postAvatars">
<a href="{{profileUrl userId}}" class="avatar-link avatar-small author-avatar">
<a href="{{profileUrl userId}}" class="avatar-link avatar-small author-avatar" aria-hidden="true">
{{> avatar userId=userId shape="circle"}}
</a>
{{#if commenters}}
<div class="post-commenters">
{{#each commenters}}
<a href="{{profileUrl this}}" class="avatar-link avatar-small commenter-avatar">
<a href="{{profileUrl this}}" class="avatar-link avatar-small commenter-avatar" aria-hidden="true">
{{> avatar userId=this shape="circle"}}
</a>
{{/each}}

View file

@ -1,7 +1,7 @@
<template name="postDiscuss">
<a class="discuss-link go-to-comments action" href="/posts/{{_id}}">
<i class="action-icon icon-comment"></i>
<a class="discuss-link go-to-comments action" href="/posts/{{_id}}" title="{{_ 'discuss'}}">
{{{icon "comment"}}}
<span class="action-count">{{commentCount}}</span>
<span class="action-label">{{_ 'discuss'}}</span>
<span class="sr-only"> {{_ "comments"}}</span>
</a>
</template>

View file

@ -1,5 +1,5 @@
<template name="postInfo">
<div class="post-meta-item">
<div class="post-meta-item" aria-live="off">
<span class="points">{{baseScore}}</span>
<span class="unit">{{pointsUnitDisplayText}}</span>
{{#if postedAt}}<span class="post-time">{{timeAgo postedAt}}</span>{{/if}}

View file

@ -1,3 +1,3 @@
<template name="postRank">
<div class="post-rank-inner"><span>{{oneBasedRank}}</span></div>
<div class="post-rank-inner" aria-live="off"><span>{{oneBasedRank}}</span></div>
</template>

View file

@ -1,13 +1,13 @@
<template name="postUpvote">
{{#if upvoted}}
<span class="upvote-link voted action">
<i class="icon-check action-icon"></i>
<span class="action-label">{{_ "upvoted"}}</span>
<span class="upvote-link voted action" title="{{_ "upvoted"}}">
{{{icon "voted" "icon-circle"}}}
<span class="sr-only">{{_ "upvoted"}}</span>
</span>
{{else}}
<a class="upvote-link not-voted action" href="#">
<i class="icon-up action-icon"></i>
<span class="action-label">{{_ "upvote_"}}</span>
<a class="upvote-link not-voted action" href="#" title="{{_ "upvote_"}}">
{{{icon "upvote" "icon-circle"}}}
<span class="sr-only">{{_ "upvote_"}}</span>
</a>
{{/if}}
</template>

View file

@ -12,7 +12,7 @@ Template[getTemplate('postUpvote')].events({
e.preventDefault();
if(!Meteor.user()){
Router.go('atSignIn');
flashMessage(i18n.t("please_log_in_first"), "info");
Messages.flash(i18n.t("please_log_in_first"), "info");
}
Meteor.call('upvotePost', post, function(error, result){
trackEvent("post upvoted", {'_id': post._id});

View file

@ -1,7 +1,7 @@
<template name="post_edit">
<div class="grid grid-module">
{{> quickForm collection="Posts" doc=post id="editPostForm" template="telescope" label-class="control-label" input-col-class="controls" type="method" meteormethod="editPost"}}
{{> quickForm collection="Posts" doc=post id="editPostForm" template="telescope" label-class="control-label" input-col-class="controls" type="method-update" meteormethod="editPost"}}
</div>
<div class="grid grid-module">

View file

@ -2,20 +2,21 @@ AutoForm.hooks({
editPostForm: {
before: {
editPost: function(doc, template) {
editPost: function(modifier) {
console.log(modifier)
console.log(template)
var post = doc;
// ------------------------------ Checks ------------------------------ //
if (!Meteor.user()) {
flashMessage(i18n.t('you_must_be_logged_in'), "");
Messages.flash(i18n.t('you_must_be_logged_in'), "");
return false;
}
// ------------------------------ Callbacks ------------------------------ //
// run all post edit client callbacks on post object successively
// run all post edit client callbacks on modifier object successively
post = postEditClientCallbacks.reduce(function(result, currentFunction) {
return currentFunction(result);
}, post);
@ -24,15 +25,15 @@ AutoForm.hooks({
}
},
onSuccess: function(operation, post, template) {
onSuccess: function(operation, post) {
trackEvent("edit post", {'postId': post._id});
Router.go('post_page', {_id: post._id});
},
onError: function(operation, error, template) {
onError: function(operation, error) {
console.log(error)
flashMessage(error.reason.split('|')[0], "error"); // workaround because error.details returns undefined
clearSeenMessages();
Messages.flash(error.reason.split('|')[0], "error"); // workaround because error.details returns undefined
Messages.clearSeen();
}
}
@ -44,17 +45,17 @@ Template[getTemplate('post_edit')].events({
var post = this.post;
e.preventDefault();
if(confirm("Are you sure?")){
Router.go("/");
Meteor.call("deletePostById", post._id, function(error) {
if (error) {
console.log(error);
flashMessage(error.reason, 'error');
Messages.flash(error.reason, 'error');
} else {
flashMessage(i18n.t('your_post_has_been_deleted'), 'success');
Messages.flash(i18n.t('your_post_has_been_deleted'), 'success');
}
});
}
}
});
});

View file

@ -1,13 +0,0 @@
<template name="posts_list">
<div class="posts-wrapper grid grid-module">
{{> UI.dynamic template=postsListIncoming data=incoming}}
<div class="posts list {{postsLayout}}">
{{#each postsCursor}}
{{> UI.dynamic template=before_post_item}}
{{> UI.dynamic template=post_item}}
{{> UI.dynamic template=after_post_item}}
{{/each}}
</div>
{{> UI.dynamic template=postsLoadMore}}
</div>
</template>

View file

@ -1,9 +0,0 @@
<template name="postsListIncoming">
{{#if count}}
<a class="more-button show-new grid-module" href="">
<span>
{{_ "view"}} {{count}} {{_ "new"}} {{pluralize count "post"}}
</span>
</a>
{{/if}}
</template>

View file

@ -1,5 +0,0 @@
Template[getTemplate('postsListIncoming')].events({
'click .show-new': function(e, instance) {
Session.set('listPopulatedAt', new Date());
}
});

View file

@ -1,13 +0,0 @@
<template name="postsLoadMore">
{{#if postsReady}}
{{#if hasPosts}}
{{#if hasMorePosts}}
<a class="more-button" href="#"><span>{{_ "load_more"}}</span></a>
{{/if}}
{{else}}
<div class="no-posts">{{_ "sorry_we_couldnt_find_any_posts"}}</div>
{{/if}}
{{else}}
<div class="loading-module">{{> spinner}}</div>
{{/if}}
</template>

View file

@ -1,21 +0,0 @@
Template[getTemplate('postsLoadMore')].helpers({
postsReady: function () {
return this.postsReady;
},
hasPosts: function () {
return !!this.postsCursor.count();
}
});
Template[getTemplate('postsLoadMore')].events({
'click .more-button': function (event, instance) {
event.preventDefault();
if (this.controllerInstance) {
// controller is a template
this.loadMoreHandler(this.controllerInstance);
} else {
// controller is router
this.loadMoreHandler();
}
}
});

View file

@ -0,0 +1,5 @@
<template name="postListTop">
{{#each postListTopModules}}
{{> Template.dynamic template=getTemplate}}
{{/each}}
</template>

View file

@ -0,0 +1,8 @@
Template[getTemplate('postListTop')].helpers({
postListTopModules: function () {
return _.sortBy(postListTopModules, 'order');
},
getTemplate: function () {
return getTemplate(this.template);
}
});

View file

@ -2,16 +2,16 @@ AutoForm.hooks({
submitPostForm: {
before: {
submitPost: function(doc, template) {
method: function(doc) {
template.$('button[type=submit]').addClass('loading');
this.template.$('button[type=submit]').addClass('loading');
var post = doc;
// ------------------------------ Checks ------------------------------ //
if (!Meteor.user()) {
flashMessage(i18n.t('you_must_be_logged_in'), 'error');
Messages.flash(i18n.t('you_must_be_logged_in'), 'error');
return false;
}
@ -26,19 +26,19 @@ AutoForm.hooks({
}
},
onSuccess: function(operation, post, template) {
template.$('button[type=submit]').removeClass('loading');
onSuccess: function(operation, post) {
this.template.$('button[type=submit]').removeClass('loading');
trackEvent("new post", {'postId': post._id});
Router.go('post_page', {_id: post._id});
if (post.status === STATUS_PENDING) {
flashMessage(i18n.t('thanks_your_post_is_awaiting_approval'), 'success');
Messages.flash(i18n.t('thanks_your_post_is_awaiting_approval'), 'success');
}
},
onError: function(operation, error, template) {
template.$('button[type=submit]').removeClass('loading');
flashMessage(error.message.split('|')[0], 'error'); // workaround because error.details returns undefined
clearSeenMessages();
onError: function(operation, error) {
this.template.$('button[type=submit]').removeClass('loading');
Messages.flash(error.message.split('|')[0], 'error'); // workaround because error.details returns undefined
Messages.clearSeen();
// $(e.target).removeClass('disabled');
if (error.error == 603) {
var dupePostId = error.reason.split('|')[1];
@ -47,4 +47,4 @@ AutoForm.hooks({
}
}
});
});

View file

@ -0,0 +1,18 @@
Template[getTemplate('postViewsNav')].helpers({
showNav: function () {
var navElements = getSetting('postViews', _.pluck(viewsMenu, 'route'));
var navCount = (typeof navElements === "array") ? navElements.length : _.keys(navElements).length;
return navCount > 1;
},
menuItems: function () {
var defaultViews = _.pluck(viewsMenu, 'route');
var menuItems = _.filter(viewsMenu, function (item) {
if (!_.contains(getSetting('postViews', defaultViews), item.route) || (item.adminOnly && !isAdmin(Meteor.user()))) {
// don't show the item
return false;
}
return true;
});
return menuItems;
}
});

View file

@ -0,0 +1,7 @@
<template name="postViewsNav">
{{#if showNav}}
<div class="posts-list-views grid-module">
{{> menuComponent menuName="view" menuItems=menuItems mode="list"}}
</div>
{{/if}}
</template>

View file

@ -1,6 +1,6 @@
<template name="userAccount">
<div class="grid-small grid-module dialog user-edit">
{{#if profileIncomplete}}
<div>
{{_ "please_complete_your_profile_below_before_continuing"}}
@ -24,7 +24,7 @@
<div class="control-group">
<label>{{_ "display_name"}}</label>
<div class="controls">
<input name="name" type="text" value="{{profile.name}}" />
<input name="name" type="text" value="{{profile.username}}" />
</div>
</div>
<div class="control-group">
@ -37,6 +37,12 @@
<label>{{_ "bio"}}</label>
<div class="controls"><textarea name="bio" type="text">{{profile.bio}}</textarea></div>
</div>
<div class="control-group">
<label>{{_ "city"}}</label>
<div class="controls">
<input name="city" type="text" value="{{profile.city}}" />
</div>
</div>
<div class="control-group">
<label>{{_ "twitter_username"}}</label>
<div class="controls">
@ -100,4 +106,4 @@
</div>
</form>
</div>
</template>
</template>

View file

@ -38,18 +38,19 @@ Template[getTemplate('userAccount')].events({
'submit #account-form': function(e){
e.preventDefault();
clearSeenMessages();
Messages.clearSeen();
if(!Meteor.user())
flashMessage(i18n.t('you_must_be_logged_in'), 'error');
Messages.flash(i18n.t('you_must_be_logged_in'), 'error');
var $target=$(e.target);
var name = $target.find('[name=name]').val();
var email = $target.find('[name=email]').val();
var user = this;
var update = {
"profile.name": name,
"profile.username": name,
"profile.slug": slugify(name),
"profile.bio": $target.find('[name=bio]').val(),
"profile.city": $target.find('[name=city]').val(),
"profile.email": email,
"profile.twitter": $target.find('[name=twitter]').val(),
"profile.github": $target.find('[name=github]').val(),
@ -67,7 +68,7 @@ Template[getTemplate('userAccount')].events({
Accounts.changePassword(old_password, new_password, function(error){
// TODO: interrupt update if there's an error at this point
if(error)
flashMessage(error.reason, "error");
Messages.flash(error.reason, "error");
});
}
@ -79,9 +80,9 @@ Template[getTemplate('userAccount')].events({
$set: update
}, function(error){
if(error){
flashMessage(error.reason, "error");
Messages.flash(error.reason, "error");
} else {
flashMessage(i18n.t('profile_updated'), 'success');
Messages.flash(i18n.t('profile_updated'), 'success');
}
Deps.afterFlush(function() {
var element = $('.grid > .error');
@ -89,7 +90,7 @@ Template[getTemplate('userAccount')].events({
});
});
Meteor.call('changeEmail', email);
Meteor.call('changeEmail', user._id, email);
}

View file

@ -0,0 +1,6 @@
<template name="usersDashboard">
<h2 class="users-dashboard-heading">All Users</h2>
<div class="users-dashboard">
{{> reactiveTable settings=settings}}
</div>
</template>

View file

@ -0,0 +1,23 @@
Template[getTemplate('usersDashboard')].helpers({
settings: function() {
return {
collection: 'all-users',
rowsPerPage: 20,
showFilter: true,
fields: [
{ key: 'avatar', label: '', tmpl: Template.users_list_avatar, sortable: false },
{ key: 'username', label: 'Username', tmpl: Template.users_list_username },
{ key: 'profile.username', label: 'Display Name' },
{ key: 'profile.email', label: 'Email', tmpl: Template.users_list_email },
{ key: 'createdAt', label: 'Member Since', tmpl: Template.users_list_created_at, sort: 'descending' },
{ key: 'postCount', label: 'Posts' },
{ key: 'commentCount', label: 'Comments' },
{ key: 'karma', label: 'Karma', fn: function(val){return Math.round(100*val)/100} },
{ key: 'inviteCount', label: 'Invites' },
{ key: 'isInvited', label: 'Invited', fn: function(val){return val ? 'Yes':'No'} },
{ key: 'isAdmin', label: 'Admin', fn: function(val){return val ? 'Yes':'No'} },
{ key: 'actions', label: 'Actions', tmpl: Template.users_list_actions, sortable: false }
]
};
}
});

View file

@ -0,0 +1,21 @@
<template name="users_list_actions">
<ul>
<li>
{{#if isInvited}}
<a class="uninvite-link" href="#">{{_ "uninvite"}}</a>
{{else}}
<a href="#" class="invite-link">{{_ "invite"}}</a>
{{/if}}
</li>
<li>
{{#if userIsAdmin}}
<a class="unadmin-link" href="#">{{_ "unadmin"}}</a>
{{else}}
<a href="#" class="admin-link">{{_ "make_admin"}}</a>
{{/if}}
</li>
<li>
<a class="delete-link" href="#">{{_ "delete_user"}}</a>
</li>
</ul>
</template>

View file

@ -0,0 +1,36 @@
Template[getTemplate('users_list_actions')].helpers({
isInvited: function() {
return this.isInvited;
},
userIsAdmin: function(){
return isAdmin(this);
},
});
Template[getTemplate('users_list_actions')].events({
'click .invite-link': function(e){
e.preventDefault();
Meteor.call('inviteUser', { userId : this._id });
},
'click .uninvite-link': function(e){
e.preventDefault();
Meteor.users.update(this._id,{
$set:{
isInvited: false
}
});
},
'click .admin-link': function(e){
e.preventDefault();
updateAdmin(this._id, true);
},
'click .unadmin-link': function(e){
e.preventDefault();
updateAdmin(this._id, false);
},
'click .delete-link': function(e){
e.preventDefault();
if(confirm(i18n.t("are_you_sure_you_want_to_delete")+getDisplayName(this)+"?"))
Meteor.users.remove(this._id);
}
});

View file

@ -0,0 +1,3 @@
<template name="users_list_avatar">
{{> avatar user=this shape="circle"}}
</template>

View file

@ -0,0 +1,4 @@
<template name="users_list_created_at">
<div class="date">{{formatDate createdAt 'LL'}}</div>
<div class="time-ago">{{timeAgo createdAt}}</div>
</template>

View file

@ -0,0 +1,3 @@
<template name="users_list_email">
<a href="mailto:{{profile.email}}">{{profile.email}}</a>
</template>

View file

@ -0,0 +1,3 @@
<template name="users_list_username">
<a href="{{profileUrl this}}">{{username}}</a>
</template>

View file

@ -2,7 +2,7 @@
<div class="user-profile grid grid-module">
<table>
<tr>
<td colspan="2">{{> avatar user=this size="large" shape="circle"}}</td>
<td colspan="2" aria-hidden="true">{{> avatar user=this size="large" shape="circle"}}</td>
</tr>
{{#if isAdmin}}
<tr>
@ -12,7 +12,7 @@
{{/if}}
<tr>
<td>{{_ "name"}}</td>
<td>{{profile.name}}</td>
<td>{{profile.username}}</td>
</tr>
<tr>
<td>{{_ "member_since"}}:</td>
@ -52,4 +52,4 @@
{{/if}}
{{/if}}
</div>
</template>
</template>

View file

@ -24,6 +24,6 @@ Template[getTemplate('userInfo')].helpers({
Template[getTemplate('userInfo')].events({
'click .invite-link': function(e, instance){
Meteor.call('inviteUser', instance.data.user._id);
flashMessage('Thanks, user has been invited.', "success");
Messages.flash('Thanks, user has been invited.', "success");
}
});

View file

@ -11,7 +11,7 @@ Template[getTemplate('user_email')].events({
'submit form': function(e){
e.preventDefault();
if(!Meteor.user())
flashMessage(i18n.t('you_must_be_logged_in'), 'error');
Messages.flash(i18n.t('you_must_be_logged_in'), 'error');
var $target=$(e.target);
var user=Session.get('selectedUserId')? Meteor.users.findOne(Session.get('selectedUserId')) : Meteor.user();
var update = {
@ -22,14 +22,14 @@ Template[getTemplate('user_email')].events({
// TODO: enable change email
var email = $target.find('[name=email]').val();
Meteor.users.update(user._id, {
$set: update
}, function(error){
if(error){
flashMessage(error.reason, "error");
Messages.flash(error.reason, "error");
} else {
flashMessage(i18n.t('thanks_for_signing_up'), "success");
Messages.flash(i18n.t('thanks_for_signing_up'), "success");
// Meteor.call('addCurrentUserToMailChimpList');
trackEvent("new sign-up", {'userId': user._id, 'auth':'twitter'});
Router.go('/');

View file

@ -1,6 +1,6 @@
<template name="user_item">
<tr class="user">
<td>{{> avatar user=this shape="circle"}}</td>
<td aria-hidden="true">{{> avatar user=this shape="circle"}}</td>
<td>
<a href="{{getProfileUrl}}">{{displayName}}</a>
<br/>

View file

@ -1,48 +0,0 @@
<template name="users">
<div class="grid grid-module">
<div class="user-table grid-block">
<h2>{{_ "users"}}</h2>
<div class="filter-sort">
<p class="filter">
<span>{{_ "filter_by"}}: </span>
<a class="{{activeClass 'all'}}" href="{{filterBy 'all'}}">{{_ "all"}}</a>
<a class="{{activeClass 'invited'}}" href="{{filterBy 'invited'}}">{{_ "invited"}}</a>
<a class="{{activeClass 'uninvited'}}" href="{{filterBy 'uninvited'}}">{{_ "uninvited"}}</a>
<a class="{{activeClass 'admin'}}" href="{{filterBy 'admin'}}">{{_ "admin"}}</a>
</p>
<p class="sort">
<span>{{_ "sort_by"}}: </span>
<a class="{{activeClass 'createdAt'}}" href="{{sortBy 'createdAt'}}">{{_ "created"}}</a>
<a class="{{activeClass 'karma'}}" href="{{sortBy 'karma'}}">{{_ "karma"}}</a>
<a class="{{activeClass 'username'}}" href="{{sortBy 'username'}}">{{_ "username"}}</a>
<a class="{{activeClass 'postCount'}}" href="{{sortBy 'postCount'}}">{{_ "posts"}}</a>
<a class="{{activeClass 'commentCount'}}" href="{{sortBy 'commentCount'}}">{{_ "comments_"}}</a>
<a class="{{activeClass 'invitedCount'}}" href="{{sortBy 'invitedCount'}}">{{_ "invitedcount"}}</a>
</p>
</div>
<table>
<thead>
<tr>
<td colspan="2">{{_ "name"}}</td>
<td>{{_ "member_since"}}</td>
<td>{{_ "posts"}}</td>
<td>{{_ "comments_"}}</td>
<td>{{_ "karma"}}</td>
<td>{{_ "invites"}}</td>
<td>{{_ "invited"}}</td>
<td>{{_ "admin"}}</td>
<td>{{_ "actions"}}</td>
</tr>
</thead>
<tbody>
{{#each users}}
{{> UI.dynamic template=user_item}}
{{/each}}
</tbody>
</table>
<div class="grid more-button {{#if allPostsLoaded}} hidden {{/if}}">
<a class="more-link" href="{{loadMoreUrl}}">{{_ "load_more"}}</a>
</div>
</div>
</div>
</template>

View file

@ -1,23 +0,0 @@
Template[getTemplate('users')].helpers({
user_item: function () {
return getTemplate('user_item');
},
loadMoreUrl: function(){
var count = parseInt(Session.get('usersLimit')) + 20;
return '/all-users/' + count + '?filterBy='+this.filterBy+'&sortBy='+this.sortBy;
},
allPostsLoaded: function () {
return false;
//TODO: hide load more button when all users have been loaded
},
activeClass: function (link) {
if(link == this.filterBy || link == this.sortBy)
return "active";
},
sortBy: function (parameter) {
return "?filterBy="+this.filterBy+"&sortBy="+parameter;
},
filterBy: function (parameter) {
return "?filterBy="+parameter+"&sortBy="+this.sortBy;
}
});

View file

@ -280,7 +280,7 @@ Meteor.methods({
isDeleted: true
}});
}else{
flashMessage("You don't have permission to delete this comment.", "error");
Messages.flash("You don't have permission to delete this comment.", "error");
}
}
});

View file

@ -16,6 +16,11 @@ var eventSchema = new SimpleSchema({
important: { // marking an event as important means it should never be erased
type: Boolean,
optional: true
},
properties: {
type: Object,
optional: true,
blackbox: true
}
});

View file

@ -1,15 +0,0 @@
if(Meteor.isClient){
// Local (client-only) collection
Messages = new Meteor.Collection(null);
flashMessage = function(message, type){
type = (typeof type === 'undefined') ? 'error': type;
// Store errors in the 'Messages' local collection
Messages.insert({message:message, type:type, seen: false, show:true});
};
clearSeenMessages = function(){
Messages.update({seen:true}, {$set: {show:false}}, {multi:true});
};
}

View file

@ -285,7 +285,6 @@ Posts.before.insert(function (userId, doc) {
Posts.before.update(function (userId, doc, fieldNames, modifier, options) {
// if body is being modified, update htmlBody too
if (Meteor.isServer && modifier.$set && modifier.$set.body) {
modifier.$set = modifier.$set || {};
modifier.$set.htmlBody = sanitize(marked(modifier.$set.body));
}
});
@ -324,7 +323,7 @@ submitPost = function (post) {
// ------------------------------ Properties ------------------------------ //
defaultProperties = {
var defaultProperties = {
createdAt: new Date(),
author: getDisplayNameById(userId),
upvotes: 0,
@ -336,12 +335,16 @@ submitPost = function (post) {
score: 0,
inactive: false,
sticky: false,
status: getDefaultPostStatus(),
postedAt: new Date()
status: getDefaultPostStatus()
};
post = _.extend(defaultProperties, post);
// if post is approved but doesn't have a postedAt date, give it a default date
// note: pending posts get their postedAt date only once theyre approved
if (post.status == STATUS_APPROVED && !post.postedAt)
post.postedAt = new Date();
// clean up post title
post.title = cleanUp(post.title);
@ -361,9 +364,9 @@ submitPost = function (post) {
if (Meteor.isServer) {
Meteor.defer(function () { // use defer to avoid holding up client
// run all post submit server callbacks on post object successively
post = postAfterSubmitMethodCallbacks.reduce(function(result, currentFunction) {
return currentFunction(result);
}, post);
postAfterSubmitMethodCallbacks.forEach(function(currentFunction) {
currentFunction(post);
});
});
}
@ -374,7 +377,6 @@ submitPost = function (post) {
// ----------------------------------------- Methods ----------------------------------------- //
// ------------------------------------------------------------------------------------------- //
postClicks = [];
postViews = [];
Meteor.methods({
@ -427,13 +429,13 @@ Meteor.methods({
// userId
// sticky (default to false)
// if user is not admin, go over each schema property and clear it if it's not editable
// if user is not admin, go over each schema property and throw an error if it's not editable
if (!hasAdminRights) {
_.keys(post).forEach(function (propertyName) {
var property = postSchemaObject[propertyName];
if (!property || !property.autoform || !property.autoform.editable) {
console.log("// Disallowed property detected: "+propertyName+" (nice try!)");
delete post[propertyName]
console.log('//' + i18n.t('disallowed_property_detected') + ": " + propertyName);
throw new Meteor.Error("disallowed_property", i18n.t('disallowed_property_detected') + ": " + propertyName);
}
});
}
@ -451,9 +453,10 @@ Meteor.methods({
return submitPost(post);
},
editPost: function (post, modifier, postId) {
editPost: function (modifier, postId) {
var user = Meteor.user();
var user = Meteor.user(),
hasAdminRights = isAdmin(user);
// ------------------------------ Checks ------------------------------ //
@ -461,6 +464,21 @@ Meteor.methods({
if (!user || !can.edit(user, Posts.findOne(postId)))
throw new Meteor.Error(601, i18n.t('sorry_you_cannot_edit_this_post'));
// if user is not admin, go over each schema property and throw an error if it's not editable
if (!hasAdminRights) {
// loop over each operation ($set, $unset, etc.)
_.each(modifier, function (operation) {
// loop over each property being operated on
_.keys(operation).forEach(function (propertyName) {
var property = postSchemaObject[propertyName];
if (!property || !property.autoform || !property.autoform.editable) {
console.log('//' + i18n.t('disallowed_property_detected') + ": " + propertyName);
throw new Meteor.Error("disallowed_property", i18n.t('disallowed_property_detected') + ": " + propertyName);
}
});
});
}
// ------------------------------ Callbacks ------------------------------ //
// run all post submit server callbacks on modifier successively
@ -474,10 +492,14 @@ Meteor.methods({
// ------------------------------ Callbacks ------------------------------ //
// run all post submit server callbacks on modifier object successively
modifier = postAfterEditMethodCallbacks.reduce(function(result, currentFunction) {
return currentFunction(result);
}, modifier);
if (Meteor.isServer) {
Meteor.defer(function () { // use defer to avoid holding up client
// run all post after edit method callbacks successively
postAfterEditMethodCallbacks.forEach(function(currentFunction) {
currentFunction(modifier, post);
});
});
}
// ------------------------------ After Update ------------------------------ //
@ -516,7 +538,7 @@ Meteor.methods({
}
}else{
flashMessage('You need to be an admin to do that.', "error");
Messages.flash('You need to be an admin to do that.', "error");
}
},
@ -524,7 +546,7 @@ Meteor.methods({
if(isAdmin(Meteor.user())){
Posts.update(post._id, {$set: {status: 1}});
}else{
flashMessage('You need to be an admin to do that.', "error");
Messages.flash('You need to be an admin to do that.', "error");
}
},
@ -535,20 +557,8 @@ Meteor.methods({
var view = {_id: postId, userId: this.userId, sessionId: sessionId};
if(_.where(postViews, view).length == 0){
postViews.push(view);
Posts.update(postId, { $inc: { viewCount: 1 }});
}
},
increasePostClicks: function(postId, sessionId){
this.unblock();
// only let clients increment a post's click counter once per session
var click = {_id: postId, userId: this.userId, sessionId: sessionId};
if(_.where(postClicks, click).length == 0){
postClicks.push(click);
Posts.update(postId, { $inc: { clickCount: 1 }});
postViews.push(view);
Posts.update(postId, { $inc: { viewCount: 1 }});
}
},

View file

@ -30,6 +30,27 @@ settingsSchemaObject = {
instructions: 'A short description used for SEO purposes.'
}
},
siteImage: {
type: String,
optional: true,
regEx: SimpleSchema.RegEx.Url,
autoform: {
group: "general",
instructions: "URL to an image for the open graph image tag for all pages"
}
},
navLayout: {
type: String,
optional: true,
autoform: {
group: 'general',
instructions: 'The layout used for the main menu',
options: [
{value: 'top-nav', label: 'Top'},
{value: 'side-nav', label: 'Side'}
]
}
},
requireViewInvite: {
type: Boolean,
optional: true,
@ -109,6 +130,22 @@ settingsSchemaObject = {
]
}
},
postViews: {
type: [String],
optional: true,
autoform: {
group: 'posts',
instructions: 'Posts views showed in the views menu',
editable: true,
noselect: true,
options: _.map(viewsMenu, function (item){
return {
value: item.route,
label: item.label
}
})
}
},
postInterval: {
type: Number,
optional: true,
@ -173,6 +210,13 @@ settingsSchemaObject = {
group: 'logo'
}
},
faviconUrl: {
type: String,
optional: true,
autoform: {
group: 'logo'
}
},
language: {
type: String,
defaultValue: 'en',
@ -181,10 +225,10 @@ settingsSchemaObject = {
group: 'general',
instructions: 'The app\'s language. Defaults to English.',
options: function () {
var languages = _.map(TAPi18n.languages_available_for_project, function (item, key) {
var languages = _.map(TAPi18n.getLanguages(), function (item, key) {
return {
value: key,
label: item[0]
label: item.name
}
});
return languages
@ -200,40 +244,52 @@ settingsSchemaObject = {
rows: 5
}
},
// secondaryColor: {
// type: String,
// optional: true
// },
buttonColor: {
accentColor: {
type: String,
optional: true,
autoform: {
group: 'colors',
// type: 'color'
instructions: 'Used for button backgrounds.'
}
},
buttonTextColor: {
accentContrastColor: {
type: String,
optional: true,
autoform: {
group: 'colors',
// type: 'color'
instructions: 'Used for button text.'
}
},
headerColor: {
secondaryColor: {
type: String,
optional: true,
autoform: {
group: 'colors',
// type: 'color'
instructions: 'Used for the navigation background.'
}
},
headerTextColor: {
secondaryContrastColor: {
type: String,
optional: true,
autoform: {
group: 'colors',
// type: 'color'
instructions: 'Used for header text.'
}
},
fontUrl: {
type: String,
optional: true,
autoform: {
group: 'fonts',
instructions: '@import URL (e.g. https://fonts.googleapis.com/css?family=Source+Sans+Pro)'
}
},
fontFamily: {
type: String,
optional: true,
autoform: {
group: 'fonts',
instructions: 'font-family (e.g. "Source Sans Pro", sans-serif)'
}
},
twitterAccount: {
@ -309,6 +365,30 @@ settingsSchemaObject = {
group: 'debug',
instructions: 'Enable debug mode for more details console logs'
}
},
authMethods: {
type: [String],
optional: true,
autoform: {
group: 'auth',
editable: true,
noselect: true,
options: [
{
value: 'email',
label: 'Email/Password'
},
{
value: 'twitter',
label: 'Twitter'
},
{
value: 'facebook',
label: 'Facebook'
}
],
instructions: 'Authentication methods (default to email only)'
}
}
};

304
i18n/ar.i18n.json Normal file
View file

@ -0,0 +1,304 @@
{
//Navigation
"view": "معاينة",
"menu": "قائمة",
"top": "اﻻكثر شعبية",
"new": "جديد",
"best": "اﻻفضل",
"digest": "ملخص",
"users": "مستخدمين",
"settings": "الإعدادات",
"admin": "المشرف",
"post": "ارسل",
"toolbox": "الأدوات",
"sign_up_sign_in": "دخول/تسجيل",
"my_account": "حسابي",
"view_profile": "مشاهدة الملف الشخصي",
"edit_account": "تعديل الحساب",
"pending": "معلق",
//Main
"new_posts": "مشاركات جديدة",
// Settings Schema
"title": "العنوان",
"siteUrl": "رابط الموقع",
"tagline": "شعار",
"requireViewInvite": "مشاهدة مقيدة",
"requirePostInvite": "مشاركة مقيدة",
"requirePostsApproval": "موافقة مطلوبة",
"defaultEmail": "البريد اﻻلكتروني",
"scoreUpdateInterval": "تحديث النتيجة",
"defaultView": "مشهد افتراضي",
"postInterval": "فاصل المشاركات",
"commentInterval": "فاصل التعليقات",
"maxPostsPerDay": "العدد اﻻقصى للمشاركات في اليوم",
"startInvitesCount": "الدعوات منذ البريداية",
"postsPerPage": "المشاركات في الصفحة",
"logoUrl": "رابط الشارة",
"logoHeight": "طول الشارة",
"logoWidth": "عرض الشارة",
"language": "اللغة",
"backgroundCSS": "CSS للخلفية",
"buttonColor": "لون اﻻزرار",
"buttonTextColor": "لون نص اﻻزرار",
"headerColor": "لون الجزء الرأسي",
"headerTextColor": "لون نص الجزء الراسي",
"twitterAccount": "حساب تويتر",
"googleAnalyticsId": "معرف قوقل تحليﻻت",
"mixpanelId": "ID Mixpanel",
"clickyId": "ID Clicky",
"footerCode": "شفرة الجزء السفلي",
"extraCode": "شفرات زائدة",
"emailFooter": "الجزء السفلي لﻻيميل",
"notes": "مﻻحظات",
"debug": "وضع المعالجة",
"fontUrl": "رابط الخط",
"fontFamily": "اسم الخط",
"authMethods": "أساليب المصادقة",
"faviconUrl": "رابط فافيكون",
"mailURL": "رابط اﻻيميل",
"postsLayout": "مشاركات ﻻيوت",
// Settings Fieldsets
"general": "عام",
"invites": "دعوة",
"email": "البريد اﻻلكتروني",
"scoring": "النتيجة",
"posts": "مشاركات",
"comments": "تعليقات",
"logo": "شارة",
"extras": "إضافات",
"colors": "اﻻلوان",
"integrations": "دمج",
// Settings Help Text
//Post Schema
"createdAt": "كتب على ",
"postedAt": "ارسل على",
"url": "رابط",
"title": "عنوان",
"body": "النص",
"htmlBody": "Texte HTML",
"viewCount": "عدد المشاهدات",
"commentCount": "تعليقات",
"commenters": "معلقون",
"lastCommentedAt": "اخر تعليق على",
"clickCount": "عدد النقرات",
"baseScore": "النقاط الأساسية",
"upvotes": "تصويت مع",
"upvoters": "الموصوتون مع",
"downvotes": "تصويت ضد",
"downvoters": "الموصوتون ضد",
"score": "النتيجة",
"status": "الوضع",
"sticky": "Mis en Avant",
"inactive": "غير نشط",
"author": "كاتب",
"userId": "مستخدم",
"sorry_we_couldnt_find_any_posts": "ﻻ توجد اي مشاركة",
//Commments
"your_comment_has_been_deleted": "قد تم حذف تعليقك",
"comment_": "تعليق",
"delete_comment": "احذف التعليق",
"add_comment": "اضف تعليق",
"upvote": "صوت مع",
"downvote": "صوت ضد",
"link": "رابط",
"edit": "تعديل",
"reply": "رد",
"no_comments": "ﻻ يوجد تعليق",
"please_sign_in_to_reply": "يتوجب الدخول ﻻضافة رد",
//Errors
"you_are_already_logged_in": "انت اﻻن متصل",
"sorry_this_is_a_private_site_please_sign_up_first": "يتوجب عليك الدخول",
"thanks_for_signing_up": "شكرا لقيامك بالتسجيل",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "الدخول الى الموقع يكون عن طريق الدعوة فقط. سوف نبلغك في أقرب وقت عندما يكو ن فيه مكانا متاحا.",
"sorry_you_dont_have_the_rights_to_view_this_page": "ﻻ يمكنك رؤية هذه الصفحة",
"not_found": "Oups",
"were_sorry_whatever_you_were_looking_for_isnt_here": "ما تبحث عنه غير موجود هنا",
//Notifications
"no_notifications": "0 تعليقات",
"1_notification": "1 تعليق",
"notifications": "تعليقات",
"mark_all_as_read": "اجعلها مقرؤة",
// Post deleted
"your_post_has_been_deleted": "مشاركتك قد تم حذفها.",
// Post submit & edit
"created": "استحدث",
"title": "عنوان",
"suggest_title": "اقترح عنوان",
"url": "رابط",
"short_url": "رابط قصير",
"body": "وصف",
"category": "مجموعة,",
"inactive_": "غير نشط؟",
"sticky_": "Mis en avant ?",
"submission_date": "تاريخ اﻻرسال",
"submission_time": "توقيت اﻻرسال",
"date": "تاريخ",
"submission": "ارسال",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "مﻻحظة:مشاركتك قيد المعاينة",
"user": "مستخدم",
"status_": "حاﻻت",
"approved": "مقبول",
"rejected": "مرفوض",
"delete_post": "احذف المشاركة",
"thanks_your_post_is_awaiting_approval": "شكرا, مشاركتك قيد العاينة",
"sorry_couldnt_find_a_title": "ﻻ يمكننا ايجاد عنوان واحد",
"please_fill_in_an_url_first": "يجب عليك كتابة الرابط",
// Post item
"share": "شارك",
"discuss": "ناقش",
"upvote_": "صوت",
"sticky": "Mis en avant",
"status": "status",
"votes": "اعدد الصوات",
"basescore": "النتيجة المبدئية",
"score": "النتيجة",
"clicks": "نقرات",
"views": "مشاهدات",
"inactive": "غير نشط",
"comment": "تعليق",
"comments": "تعليقات",
"point": "نقطة",
"points": "نقاط",
//User
"please_complete_your_profile_below_before_continuing": "شكرا لاستكمال ملفك الشخصي قبل المتابعة.",
"account": "حساب",
"username": "اسم المستخدم",
"display_name": "اﻻسم الحقيقي",
"email": "البريد اﻻلكتروني",
"bio": "السيرة الذاتية",
"password": "كلمة المرور",
"change_password": "تبديل كلمة المرور",
"old_password": "كلمة المرور القديمة",
"new_password": "كلمة المرور الجديدة",
"email_notifications": "إشعارات بالبريد الإلكتروني",
"new_posts": "مشاركة جديدة",
"comments_on_my_posts": "تعليقات على مشاركاتي",
"replies_to_my_comments": "اجابة تعليقاتي",
"forgot_password": "نسيت كلمة المرور؟",
"profile_updated": "تحديث الملف الشخصي",
"please_fill_in_your_email_below_to_finish_signing_up": "تفضل بأدخل بريدك الالكتروني لإنهاء إنشاء الحساب",
"invite": "قم بدعوة",
"uninvite": "الغاء الدعوة",
"make_admin": "عين مشرف",
"unadmin": "الغي مشرف",
"delete_user": "احذف مستخدم",
"are_you_sure_you_want_to_delete": "هل انت متاكد من الحذف؟ ",
"reset_password": "اعادة كلمة المرور",
"password_reset_link_sent": "قد تم ارسال رابط ﻻسترجاع كلمة المرور",
"name": "اﻻسم",
"posts": "المشاركات",
"comments_": "التعليقات",
"karma": "Karma",
"is_invited": "هل هو مدعو؟",
"is_admin": "هل هو مشرف؟",
"delete": "حذف",
"member_since": "عضو منذ",
"edit_profile": "تغيير الملف الشخصي",
"sign_in": "دخول",
"sign_in_": "دخول",
"sign_up_": "استحدث حساب",
"dont_have_an_account": "ﻻ تمتلك حساب؟",
"already_have_an_account": "تمتلك حساب؟",
"sign_up": "استحدث حساب",
"please_fill_in_all_fields": "يتوجب مل كل الخانات",
"invite_": "دعوة ",
"left": " باقي",
"invite_none_left": "دعوات (0 متبقي)",
"all": "الكل",
"invited": "مدعو",
"uninvited": "غير مدعو",
"filter_by": "فرز ب",
"sort_by": "ترتيب حسب",
//Helpers
"sorry_you_do_not_have_access_to_this_page": "عذرا, ﻻ يمكنك الدخول لهذه الصفحة",
"please_sign_in_first": "يتوجب عليك الدخول",
"sorry_you_have_to_be_an_admin_to_view_this_page": "عذرا, يتوجب عليك ان تكون مشرف لرؤية هذه الصفحة",
"sorry_you_dont_have_permissions_to_add_new_items": "ليس ليدك الصلحيات ﻻضافة مشاركات",
"sorry_you_cannot_edit_this_post": "ﻻ سنكنك التعديل على هذه المشاركة",
"sorry_you_cannot_edit_this_comment": "ﻻ يمكنك تعديل هذا التعليق",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "يجب أن تكون مشرف ومسجلا لإضافة مجموعة",
"you_need_to_login_or_be_invited_to_post_new_comments": "يجب أن تكون مسجلا و مدعو لإضافة التعليقات",
"please_wait": "Merci de patienter ",
"seconds_before_commenting_again": " ثواني قبل نشر تعليق جديد",
"your_comment_is_empty": "تعليقك فارغ",
"you_dont_have_permission_to_delete_this_comment": "ليس لديك إذن لحذف هذا التعليق",
"you_need_to_login_or_be_invited_to_post_new_stories": "يجب أن تكون مسجلا أو مدعو ﻻنشاء مشاركة جديدة",
"please_fill_in_a_headline": "اضف عنوان من فضلك",
"this_link_has_already_been_posted": "هذا الرابط موجود",
"sorry_you_cannot_submit_more_than": "ﻻ يمكنك اضافة اكثر من ",
"posts_per_day": " posts par jour",
"someone_replied_to_your_comment_on": "احدهم قام باضافة اجابة لتعليقك حول",
"has_replied_to_your_comment_on": " قام باضافة تعليق حول",
"read_more": "اقر اﻻتي",
"a_new_comment_on_your_post": "تعليق جديد حول مشاركتك",
"you_have_a_new_comment_by": "لديك تعليق جديد من",
"on_your_post": " حول مشاركتك",
"has_created_a_new_post": " اضاف مشاركة جديدة",
"your_account_has_been_approved": "قد تم قبول حسابك",
"welcome_to": "مرحبا بك في ",
"start_posting": "قم باضافة جديدة",
// Other
"please_fill_in_a_title": "قم باضافة عنوان",
"seconds_before_posting_again": " ثواني قبل نشر مشاركة جديدة.",
"upvoted": "مصوت لهذه",
"posted_date": "تاريخ التقديم",
"posted_time": "توقيت التقديم",
"profile": "الملف الشخصي",
"sign_out": "خروج",
"invitedcount": "اعضاء المدعون",
"invites": "دعوات",
"invited": "مدعو؟",
"admin": "مشرف",
"actions": "اعمال",
"invites_left": "الدعوات الباقية",
"id": "ID",
"name": "اﻻسم:",
"bio": "السيرة:",
"github": "GitHub",
"site": "الموقع",
"upvoted_posts": "المشاركات المصوت لها",
"downvoted_posts": "المشاركات المصوت ضدها",
"mark_as_read": "إجعلها مقروءة",
//Common
"pending": "في الانتظار",
"loading": "تحميل ...",
"submit": "ابعث",
"you_must_be_logged_in": "يتوجب عليك الدخول",
"are_you_sure": "هل انت متاكد؟",
"please_log_in_first": "يتوجب عليك الدخول",
"sign_in_sign_up_with_twitter": "تسجيل الدخول / تسجيل عبر تويتر",
"load_more": "تحميل أكثر",
"most_popular_posts": "اﻻكثر شعبية اﻻن",
"newest_posts": "أحدث المشاركات.",
"highest_ranked_posts_ever": "اﻻفضل في كل اﻻوقات",
"the_profile_of": "الملف الشخصى ل",
"posts_awaiting_moderation": "مشاركات تنتظر المصادقة",
"future_scheduled_posts": "المشاركات المقرر مستقبﻻ.",
"users_dashboard": "لوحة قيادة الخاصة بالمستخدمين",
"telescope_settings_panel": "لوحة اﻻعدادات",
"various_utilities": "المرافق المختلفة."
}

View file

@ -213,6 +213,18 @@
"you_must_be_logged_in": "Трябва да сте влезнали в системата.",
"are_you_sure": "Сигурни ли сте?",
"please_log_in_first": "Моля първо влезте в системата",
"sign_in_sign_up_with_twitter": "Влезте/Регистрирай се с Twitter",
"load_more": "Зареди повече"
"sign_in_sign_up_with_twitter": "Влезте/Регистрирайте се с Twitter",
"load_more": "Зареди повече",
"most_popular_posts": "Най-популярни публикации в момента.",
"newest_posts": "Най-нови публикации.",
"highest_ranked_posts_ever": "Топ публикации за всички времена.",
"the_profile_of": "Профилът на",
"posts_awaiting_moderation": "Публикации очакващи модерация.",
"future_scheduled_posts": "Планирани публикации.",
"users_dashboard": "Потребителски панел.",
"telescope_settings_panel": "Telescope настройки.",
"various_utilities": "Други услуги."
}

307
i18n/el.i18n.json Normal file
View file

@ -0,0 +1,307 @@
{
//Navigation
"menu": "Μενού",
"view": "Προβολή",
"top": "Κορυφαία",
"new": "Νέα",
"best": "Καλύτερα",
"digest": "Περίληψη",
"users": "Χρήστες",
"settings": "Ρυθμίσεις",
"admin": "Διαχειριστής",
"post": "Δημοσίευση",
"toolbox": "Εργαλειοθήκη",
"sign_up_sign_in": "Εγγραφή/Σύνδεση",
"my_account": "Ο λογαριασμός μου",
"view_profile": "Προβολή προφίλ",
"edit_account": "Επεξεργασία λογαριασμού",
//Main
"new_posts": "Νέες δημοσιέυσεις",
// Settings Schema
"title": "Τίτλος",
"description": "Περιγραφή",
"siteUrl": "URL Ιστοσελίδας",
"tagline": "Ετικέτα",
"requireViewInvite": "Να απαιτείται πρόσκληση για προβολή",
"requirePostInvite": "Να απαιτείται πρόσκληση για δημοσίευση",
"requirePostsApproval": "Να απαιτείται έγκριση των δημοσιεύσεων",
"defaultEmail": "Προεπιλεγμένο Email",
"scoreUpdateInterval": "Χρόνος ανανέωσης Σκορ",
"defaultView": "Προεπιλεγμένη Προβολή",
"postInterval": "Χρόνος ανανέωσης δημοσίευσης",
"commentInterval": "Χρόνος ανανέωσης σχολίου",
"maxPostsPerDay": "Μέγιστες δημοσιεύσεις ανα ημέρα",
"startInvitesCount": "Invites Start Count",
"postsPerPage": "Δημοσιεύσεις ανα ημέρα",
"logoUrl": "URL Λογότυπου",
"logoHeight": "Υψος Λογότυπου",
"logoWidth": "Πλάτος Λογότυπου",
"language": "Γλώσσα",
"backgroundCSS": "Background CSS",
"buttonColor": "Χρώμα κουμπιού",
"buttonTextColor": "Χρώμα κειμένου κουμπιού",
"headerColor": "Χρώμα Επικεφαλίδας",
"headerTextColor": "Χρώμα κειμένου Επικεφαλίδας",
"twitterAccount": "Λογαριασμός Twitter",
"googleAnalyticsId": "Google Analytics ID",
"mixpanelId": "Mixpanel ID",
"clickyId": "Clicky ID",
"footerCode": "Footer Code",
"extraCode": "Extra Code",
"emailFooter": "Email Footer",
"notes": "Σημειώσεις",
"debug": "Debug Mode",
"fontUrl": "Font URL",
"fontFamily": "Font Family",
"authMethods": "Authentication Methods",
"faviconUrl": "Favicon URL",
"mailURL": "MailURL",
"postsLayout": "Στύλ Δημοσιεύσεων",
// Settings Fieldsets
"general": "Γενικά",
"invites": "Προσκλήσεις",
"email": "Email",
"scoring": "Σκορ",
"posts": "Δημοσιέυσεις",
"comments": "Σχόλια",
"logo": "Λογότυπο",
"extras": "Extras",
"colors": "Χρώματα",
"integrations": "Προσθήκες",
// Settings Help Text
// Post Schema
"createdAt": "Δημιουργήθηκε στις",
"postedAt": "Δημοσιεύθηκε στις",
"url": "URL",
"title": "Τίτλος",
"body": "Κείμενο",
"htmlBody": "HTML κείμενο",
"viewCount": "Πλήθος προβολών",
"commentCount": "Πλήθος σχολίων",
"commenters": "Σχολιαστές",
"lastCommentedAt": "Τελευταίο σχόλιο στις",
"clickCount": "Πλήθος κλικ",
"baseScore": "Βασικό σκορ",
"upvotes": "Υπερψηφισμοί",
"upvoters": "Υπερψηφιστές",
"downvotes": "Καταψηφισμοί",
"downvoters": "Καταψηφιστές",
"score": "Σκορ",
"status": "Κατάσταση",
"sticky": "Προτεινόμενα",
"inactive": "Ανενεργά",
"author": "Δημιουργός",
"userId": "Χρήστης",
"sorry_we_couldnt_find_any_posts": "Μας συγχωρείτε, δεν βρήκαμε καμιά δημοσίευση.",
//Commments
"your_comment_has_been_deleted": "Το σχόλιο σας έχει διαγραφεί.",
"comment_": "Σχόλιο",
"delete_comment": "Διαγραφή σχολίου",
"add_comment": "Νέο σχόλιο",
"upvote": "Υπερ",
"downvote": "Κατά",
"link": "Σύνδεσμος",
"edit": "Επεξεργασία",
"reply": "Απάντηση",
"no_comments": "Κανένα σχόλιο.",
//Errors
"you_are_already_logged_in": "Είστε ήδη συνδεδεμένος",
"sorry_this_is_a_private_site_please_sign_up_first": "Μας συγχωρείτε αλλα πρέπει να εγγραφείτε για να συνεχίσετε.",
"thanks_for_signing_up": "Ευχαριστούμε για την εγγραφή σας!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "Δυστυχώς χρειάζεστε πρόσκληση για να εγγραφείτε. Θα σας ειδοποιήσουμε μόλις ανοίξουν πάλι οι εγγραφές.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Δεν έχετε δικαίωμα να δείτε αυτήν την σελίδα.",
"sorry_you_do_not_have_the_rights_to_comments": "Δεν έχετε δικαίωμα να κάνετε σχόλιο.",
"not_found": "Δεν βρέθηκε!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Αυτό που ψάχνετε δεν είναι εδώ!",
"disallowed_property_detected": "Παράνομη παράμετρος!",
//Notifications
"no_notifications": "Καμία ειδοποίηση",
"1_notification": "1 ειδοποίηση",
"notifications": "ειδοποίησεις",
"mark_all_as_read": "Μάρκαρε τα όλα ότι τα διάβασες",
// Post deleted
"your_post_has_been_deleted": "Η δημοσίευση σου έχει διαγραφεί.",
// Post submit & edit
"created": "Δημιουργήθηκε",
"title": "Τίτλος",
"suggest_title": "Πρότεινε ενα τίτλο",
"url": "URL",
"short_url": "Short URL",
"body": "Κείμενο",
"category": "Κατηγορία",
"inactive_": "Ανενεργό?",
"sticky_": "Προτεινόμενο?",
"submission_date": "Ημερομηνία Υποβολής",
"submission_time": "Ώρα Υποβολής",
"date": "Ημερομηνία",
"submission": "Υποβολή",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Note: this post is still pending so it has no submission timestamp yet.",
"user": "Χρήστης",
"status_": "Κατάσταση",
"approved": "Εγκρίθηκε",
"rejected": "Απορρίφθηκε",
"delete_post": "Διαγραφή δημοσίευσης",
"thanks_your_post_is_awaiting_approval": "Ευχαριστούμε, η δημοσίευση αναμένει εγκριση.",
"sorry_couldnt_find_a_title": "Συγγνώμη, ο τίτλος δεν βρέθηκε ",
"please_fill_in_an_url_first": "Παρακαλώ συμπληρώστε το URL πρώτα!",
// Post item
"share": "Μοιράσου",
"discuss": "Συζύτησε",
"upvote_": "Μου αρέσει",
"sticky": "Προτεινόμενο",
"status": "κατάσταση",
"votes": "Ψήφοι",
"basescore": "Βασικό Σκορ",
"score": "σκορ",
"clicks": "κλικ",
"views": "προβολές",
"inactive": "ανενεργό",
"comment": "σχόλιο",
"comments": "σχόλια",
"point": "πόντος",
"points": "πόντους",
//User /client/views/users/account/user_account.html
"please_complete_your_profile_below_before_continuing": "Παρακαλώ συμπληρώστε το προφίλ σας πριν συνεχισετε.",
"account": "Λογαριασμός",
"username": "Ονομα χρήστη",
"display_name": "Παρατσούκλι",
"email": "Email",
"bio": "Βιογραφία",
"twitter_username": "Ονομα χρήστη Twitter",
"github_username": "Ονομα χρήστη GitHub",
"site_url" : "URL Ιστοσελίδας",
"password": "κωδικός",
"change_password": "Αλλαγή κωδικού?",
"old_password": "Παλιός κωδικός",
"new_password": "Νέος κωδικός",
"email_notifications": "Ειδοποιήσεις μέσω Email",
"new_users" : "Νέοι Χρήστες",
"new_posts": "Νέες δημοσιεύσεις",
"comments_on_my_posts": "Σχόλια στις δημοσιέυσεις μου",
"replies_to_my_comments": "Απαντήσεις στα σχόλια μου",
"forgot_password": "Ξέχασες τον κωδικό σου;",
"profile_updated": "Το προφίλ ενημερώθηκε",
"please_fill_in_your_email_below_to_finish_signing_up": "Παρακαλώ συμπλήρωσε το email για να ολοκληρώσεις την εγγραφή σου.",
"invite": "Προσκληση",
"uninvite": "Διαγραφή πρόσκλησης",
"make_admin": "Δικαίωμα διαχειριστή",
"unadmin": "Διαγραφή δικαίωματος διαχειριστή",
"delete_user": "Διαγραφή χρήστη",
"are_you_sure_you_want_to_delete": "Είσαι σίγουρος για την διαγραφή",
"reset_password": "Επαναφορά κωδικού",
"password_reset_link_sent": "Στείλαμε σύνδεσμο επαναφοράς κωδικου στο email!",
"name": "Όνομα",
"posts": "Δημοσιεύσεις",
"comments_": "Σχόλια",
"karma": "Karma",
"is_invited": "Έχει προσκληση?",
"is_admin": "Είναι διαχειριστής?",
"delete": "Διαγραφή",
"member_since": "Μέλος από",
"edit_profile": "Επεξεργασία Προφίλ",
"sign_in": "Σύνδεση",
"sign_in_": "Σύνδεση!",
"sign_up_": "Εγγραφή!",
"dont_have_an_account": "Δεν έχεις λογαριασμό;",
"already_have_an_account": "Έχεις ήδη λογαριασμό;",
"sign_up": "Εγγραφλη",
"please_fill_in_all_fields": "Παρακαλώ συμπληρώστε τα πεδία",
"invite_": "Πρόσκληση ",
"left": " αριστερά",
"invite_none_left": "Πρόσκληση (κανένας αριστερά)",
"all": "Όλους",
"invited": "Αυτούς που έχουν πρόσκληση",
"uninvited": "Αυτούς που ΔΕΝ έχουν πρόσκληση",
"filter_by": "Δείξε ",
"sort_by": "Ταξινόμηση",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Συγγνώμη, δεν έχετε πρόσβαση σε αυτήν τη σελίδα",
"please_sign_in_first": "Πρέπει να συνδεθείς πρώτα.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Συγγνώμη, πρέπει να είσαι διαχειριστής για να δείς αυτήν τη σελίδα.",
"sorry_you_dont_have_permissions_to_add_new_items": "Συγγνώμη, Συγγνώμη, δεν έχετε δικαίωμα να προσθέσετε νέα στοιχεία.",
"sorry_you_cannot_edit_this_post": "Συγγνώμη, δεν μπορείς να επεξεργαστείς αυτήν την δημοσίευση.",
"sorry_you_cannot_edit_this_comment": "Συγγνώμη, δεν μπορείς να επεξεργαστείς συτό το σχόλιο.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Πρέπει να συνδεθείς για να προσθέσεις νέα κατηγορία.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Πρέπει να συνδεθείς ή να έχεις πρόσκληση για να κάνεις σχόλια.",
"please_wait": "Παρακαλώ περιμένετε ",
"seconds_before_commenting_again": " δευτερόλεπτα πριν μπορείτε να ξανα σχολιάσετε.",
"your_comment_is_empty": "Το σχόλιό σας είναι άδειο.",
"you_dont_have_permission_to_delete_this_comment": "Συγγνώμη, Συγγνώμη, δεν έχετε δικαίωμα να διαγράψετε αυτό το σχόλιο.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Πρέπει να συνδεθείς ή να έχεις πρόσκληση για να δημοσιέυσεις.",
"please_fill_in_a_headline": "Παρακαλώ συμπληρώστε την επικεφαλίδα",
"this_link_has_already_been_posted": "Αυτός ο σύνδεσμος υπάρχει ήδη",
"sorry_you_cannot_submit_more_than": "Δεν μπορείς να υποβάλεις περισσότερα από ",
"posts_per_day": " σχόλια την ημέρα",
"someone_replied_to_your_comment_on": "Κάποιος απάντησε στο σχόλιό σου",
"has_replied_to_your_comment_on": " απάντησε στο σχόλιό σου",
"read_more": "Διάβασε περισσότερα",
"a_new_comment_on_your_post": "Νέο σχόλιο στη δημοσίευση σου",
"you_have_a_new_comment_by": "Νέο σχόλιο από",
"on_your_post": " στη δημοσίευση σου",
"has_created_a_new_post": " έκανε μια νέα δημοσίευση",
"your_account_has_been_approved": "Ο λογαριασμό σου έχει εγκριθεί.",
"welcome_to": "Καλωσορίσατε στο ",
"start_posting": "Ξεκινήστε να δημοσιεύετε.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Παρακαλώ συμπληρώστε τον τίτλο",
"seconds_before_posting_again": " δευτερόλεπτα πριν ξανα δημοσιεύσετε",
"upvoted": "Υπερψηφισμένο",
"posted_date": "Ημερομηνία δημοσίευσης",
"posted_time": "Ωρα δημοσίευσης",
"profile": "Προφίλ",
"sign_out": "Αποσύνδεση",
"you_ve_been_signed_out": "Εχετε αποσυνδεθεί!",
"invitedcount": "Πλήθος προσκλήσεων",
"invites": "Προσκλήσεις",
"invited": "Προσκεκλημενος?",
"admin": "Διαχειριστής",
"actions": "Ενέργειες",
"invites_left": "Προσκλήσεις που απομενουν",
"id": "ID",
"name": "Όνομα:",
"bio": "Βιογραφία:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Δημοσιεύσεις που μου αρέσουν",
"downvoted_posts": "Δημοσιεύσεις που ΔΕΝ μου αρέσουν",
"mark_as_read": "To διάβασα",
//Common
"pending": "Εκκρεμούν",
"loading": "Περιμένετε...",
"submit": "Υποβολή",
"you_must_be_logged_in": "Πρέπει να συνδεθείτε.",
"are_you_sure": "Είστε σίγουρος?",
"please_log_in_first": "Πρέπει να συνδεθείτε πρώτα.",
"please_log_in_to_comment": "Πρέπει να συνδεθείτε για να κάνετε σχόλιο.",
"sign_in_sign_up_with_twitter": "Εγγραφείτε με το Twitter σας",
"load_more": "Περισσότερα",
"most_popular_posts": "Οι πιο δημοφιλής δημοσιεύσεις.",
"newest_posts": "Οι πιο καινούριες δημοσιεύσεις.",
"highest_ranked_posts_ever": "Οι πιο υπερψηφισμένες δημοσιεύσεις.",
"the_profile_of": "Το προφίλ του",
"posts_awaiting_moderation": "Δημοσιεύσεις που αναμένουν έγγριση.",
"future_scheduled_posts": "Μελλοντικές δημοσιεύσεις.",
"users_dashboard": "Πίνακας Χρηστών.",
"telescope_settings_panel": "Γενικές Ρυθμίσεις.",
"various_utilities": "Διάφορα εργαλεία."
}

View file

@ -6,21 +6,25 @@
"new": "New",
"best": "Best",
"digest": "Digest",
"scheduled": "Scheduled",
"users": "Users",
"settings": "Settings",
"admin": "Admin",
"post": "Post",
"toolbox": "Toolbox",
"sign_up_sign_in": "Sign Up/Sign In",
"sign_up_sign_in": "Register/Sign In",
"my_account": "My Account",
"view_profile": "View Profile",
"edit_account": "Edit Account",
"view_your_profile": "View your profile.",
"edit_your_profile": "Edit your profile",
//Main
"new_posts": "New Posts",
// Settings Schema
"title": "Title",
"description": "Description",
"siteUrl": "Site URL",
"tagline": "Tagline",
"requireViewInvite": "Require Invite to View",
@ -52,25 +56,39 @@
"emailFooter": "Email Footer",
"notes": "Notes",
"debug": "Debug Mode",
"fontUrl": "Font URL",
"fontFamily": "Font Family",
"authMethods": "Authentication Methods",
"faviconUrl": "Favicon URL",
"mailURL": "MailURL",
"postsLayout": "Posts Layout",
"siteImage": "Site Image",
// Settings Fieldsets
"general": "General",
"invites": "Invites",
"email": "Email",
"email": "Email",
"scoring": "Scoring",
"posts": "Posts",
"comments": "Comments",
"comments": "Comments",
"logo": "Logo",
"extras": "Extras",
"colors": "Colors",
"integrations": "Integrations",
"accentColor": "Accent Color",
"accentContrastColor": "Accent Contrast Color",
"secondaryColor": "Secondary Color",
"secondaryContrastColor": "Secondary Contrast Color",
"postViews": "Post Views",
"navLayout": "Navigation Layout",
"mailUrl": "Mail URL",
// Settings Help Text
// Post Schema
"createdAt": "Created At",
"postedAt": "Posted At",
"url": "URL",
"url": "URL",
"title": "Title",
"body": "Body",
"htmlBody": "HTML Body",
@ -103,17 +121,19 @@
"edit": "Edit",
"reply": "Reply",
"no_comments": "No comments.",
"please_sign_in_to_reply": "Please sign in to reply",
//Errors
"you_are_already_logged_in": "You are already logged in",
"sorry_this_is_a_private_site_please_sign_up_first": "Sorry, this is a private site. Please sign up first.",
"thanks_for_signing_up": "Thanks for signing up!",
"sorry_this_is_a_private_site_please_sign_up_first": "Sorry, this is a private site. Please register first.",
"thanks_for_signing_up": "Thanks for registering!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "The site is currently invite-only, but we will let you know as soon as a spot opens up.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Sorry, you don't have the rights to view this page.",
"sorry_you_do_not_have_the_rights_to_comments": "Sorry, you do not have the rights to leave comments at this time.",
"not_found": "Not Found!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "We're sorry; whatever you were looking for isn't here..",
"disallowed_property_detected": "Disallowed property detected",
//Notifications
"no_notifications": "No notifications",
"1_notification": "1 notification",
@ -171,6 +191,7 @@
"display_name": "Display Name",
"email": "Email",
"bio": "Bio",
"city": "City",
"twitter_username": "Twitter Username",
"github_username": "GitHub Username",
"site_url" : "Site URL",
@ -185,7 +206,7 @@
"replies_to_my_comments": "Replies to my comments",
"forgot_password": "Forgot password?",
"profile_updated": "Profile updated",
"please_fill_in_your_email_below_to_finish_signing_up": "Please fill in your email below to finish signing up.",
"please_fill_in_your_email_below_to_finish_signing_up": "Please fill in your email below to finish the registration.",
"invite": "Invite",
"uninvite": "Uninvite",
"make_admin": "Make admin",
@ -205,10 +226,10 @@
"edit_profile": "Edit profile",
"sign_in": "Sign In",
"sign_in_": "Sign in!",
"sign_up_": "Sign up!",
"sign_up_": "Register!",
"dont_have_an_account": "Don't have an account?",
"already_have_an_account": "Already have an account?",
"sign_up": "Sign Up",
"sign_up": "Register",
"please_fill_in_all_fields": "Please fill in all fields",
"invite_": "Invite ",
"left": " left",
@ -256,8 +277,6 @@
"upvoted": "Upvoted",
"posted_date": "Posted Date",
"posted_time": "Posted Time",
"posted_date": "Posted Date",
"posted_time": "Posted Time",
"profile": "Profile",
"sign_out": "Sign Out",
"you_ve_been_signed_out": "You've been signed out. Come back soon!",
@ -284,7 +303,7 @@
"are_you_sure": "Are you sure?",
"please_log_in_first": "Please log in first.",
"please_log_in_to_comment": "Please log in to comment.",
"sign_in_sign_up_with_twitter": "Sign In/Sign Up with Twitter",
"sign_in_sign_up_with_twitter": "Register/Sign Up with Twitter",
"load_more": "Load More",
"most_popular_posts": "The most popular posts right now.",
@ -292,7 +311,7 @@
"highest_ranked_posts_ever": "The all-time highest-ranked posts.",
"the_profile_of": "The profile of",
"posts_awaiting_moderation": "Posts awaiting moderation.",
"future_scheduled_posts": "Future scheduled posts.",
"users_dashboard": "Users dashboard.",

View file

@ -1,8 +1,8 @@
{
//Navigation
"view": "Vista",
"menu": "Menu",
"top": "Todos",
"view": "Explorar",
"menu": "Menú",
"top": "Top",
"new": "Nuevos",
"digest": "Resumen",
"users": "Usuarios",
@ -10,7 +10,7 @@
"admin": "Admin",
"post": "Post",
"toolbox": "Herramientas",
"sign_up_sign_in": "Connectarse/Crear una cuenta",
"sign_up_sign_in": "Registrarse/Iniciar sesión",
"my_account": "Mi Cuenta",
"view_profile": "Ver perfil",
"edit_account": "Editar cuenta",
@ -21,7 +21,7 @@
//Commments
"your_comment_has_been_deleted": "Tu comentario ha sido borrado",
"comment_": "Comentario",
"delete_comment": "Borrar el comentario",
"delete_comment": "Borrar comentario",
"add_comment": "Añadir comentario",
"upvote": "Voto Positivo",
"downvote": "Voto Negativo",
@ -34,10 +34,10 @@
"you_are_already_logged_in": "Ya estás conectado",
"sorry_this_is_a_private_site_please_sign_up_first": "Lo sentimos pero esta pagina es privada. Por favor, conéctese para verla",
"thanks_for_signing_up": "Gracias por registrarte",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "El sitio solo es accesible mediante invitación, pero te lo haremos saber tan pronto como abra al público.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Lo sentimos pero no tienes los derechos suficientes para ver esta pagina",
"not_found": "No encontramos nada!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Lo sentimos pero aqui no hay nada.. ",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "El sitio solo es accesible mediante invitación, pero te haremos saber pronto cuando este disponible para el público.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Lo sentimos pero no tienes los permisos suficientes para ver esta pagina",
"not_found": "¡No encontramos nada!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Lo sentimos pero aqui no hay nada... ",
//Notifications
"no_notifications": "Ninguna notificación",
@ -56,8 +56,8 @@
"short_url": "URL Corta",
"body": "Descripción",
"category": "Categoría",
"inactive_": "Inactivo?",
"sticky_": "Pegado?",
"inactive_": "Inactivo",
"sticky_": "Destacar",
"submission_date": "Fecha de entrega",
"submission_time": "Hora de entrega",
"date": "Fecha",
@ -66,17 +66,17 @@
"user": "Usuario",
"status_": "Estado",
"approved": "Aprobado",
"rejected": "Rechezado",
"rejected": "Rechazado",
"delete_post": "Borrar este post",
"thanks_your_post_is_awaiting_approval": "Gracias, su post esta esperando validación.",
"sorry_couldnt_find_a_title": "Lo sentimos, impossible de encontrar este título.",
"please_fill_in_an_url_first": "Tienes que poner una URL.",
"thanks_your_post_is_awaiting_approval": "Gracias, su post esta esperando aprobación.",
"sorry_couldnt_find_a_title": "Lo sentimos, imposible de encontrar este título.",
"please_fill_in_an_url_first": "Tienes que introducir una URL.",
// Post item
"share": "Compartir",
"discuss": "Comentar",
"upvote_": "Votar",
"sticky": "Pegado",
"sticky": "Destacado",
"status": "Estado",
"votes": "votos",
"basescore": "baseScore",
@ -106,21 +106,21 @@
"replies_to_my_comments": "Respuestas a mis comentarios",
"forgot_password": "Olvidaste tu contraseña?",
"profile_updated": "Perfil actualizado",
"please_fill_in_your_email_below_to_finish_signing_up": "Por favor, introduzca su email para terminar de inscribirse.",
"please_fill_in_your_email_below_to_finish_signing_up": "Por favor, introduzca su email para terminar de registrarse.",
"invite": "Invitar",
"uninvite": "Cancelar la invitación",
"make_admin": "Hacer admin",
"unadmin": "Borrar de admin",
"delete_user": "Borrar usuario",
"are_you_sure_you_want_to_delete": "Está seguro de que desea eliminar",
"are_you_sure_you_want_to_delete": "¿Está seguro de que desea eliminar?",
"reset_password": "Restablecer contraseña",
"password_reset_link_sent": "Enlace de restablecimiento de contraseña enviado!!",
"password_reset_link_sent": "Enlace de restablecimiento de contraseña enviado a su email.",
"name": "Nombre",
"posts": "Posts",
"comments_": "Comentarios",
"karma": "Karma",
"is_invited": "Esta invitado?",
"is_admin": "Es admin?",
"is_invited": "¿Esta invitado?",
"is_admin": "¿Es admin?",
"delete": "Borrar",
"member_since": "Miembro desde",
"edit_profile": "Modificar el perfil",
@ -141,10 +141,10 @@
"sort_by": "Ordenar por",
//Helpers
"sorry_you_do_not_have_access_to_this_page": "Lo sentimos, usted no tiene acceso a esta página",
"please_sign_in_first": "Tiene que registrarse primero.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Lo sentimos, usted tiene que ser un administrador para ver esta página.",
"sorry_you_dont_have_permissions_to_add_new_items": "Lo sentimos, usted no tiene permisos para agregar nuevos elementos.",
"sorry_you_do_not_have_access_to_this_page": "Lo sentimos, no tienes acceso a esta página",
"please_sign_in_first": "Tienes que registrarte primero.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Lo sentimos, tienes que ser un administrador para ver esta página.",
"sorry_you_dont_have_permissions_to_add_new_items": "Lo sentimos, no tiene permisos para agregar nuevos elementos.",
"sorry_you_cannot_edit_this_post": "Lo sentimos, no puede editar este post.",
"sorry_you_cannot_edit_this_comment": "Lo sentimos, no puede editar este comentario.",
@ -171,37 +171,35 @@
"start_posting": "Empezar a publicar",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Please fill in a title",
"seconds_before_posting_again": " seconds before posting again",
"upvoted": "Upvoted",
"posted_date": "Posted Date",
"posted_time": "Posted Time",
"posted_date": "Posted Date",
"posted_time": "Posted Time",
"profile": "Profile",
"sign_out": "Sign Out",
"invitedcount": "InvitedCount",
"invites": "Invites",
"invited": "Invited?",
"admin": "Admin?",
"actions": "Actions",
"invites_left": "invites left",
"please_fill_in_a_title": "Por favor, agrega un título",
"seconds_before_posting_again": "segundos antes de postear de nuevo",
"upvoted": "Voto a favor",
"posted_date": "Fecha de publicación",
"posted_time": "Tiempo de publicación",
"profile": "Perfil",
"sign_out": "Cerrar sesión",
"invitedcount": "Total de invitados",
"invites": "Invitaciones",
"invited": "¿Invitado?",
"admin": "¿Administrador?",
"actions": "Acciones",
"invites_left": "Invitaciones pendientes",
"id": "ID",
"name": "Name:",
"bio": "Bio:",
"name": "Nombre:",
"bio": "Biografía:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Upvoted Posts",
"downvoted_posts": "Downvoted Posts",
"mark_as_read": "Mark as read",
"site": "Sitio",
"upvoted_posts": "Posts votados a favor",
"downvoted_posts": "Posts votados en contra",
"mark_as_read": "Marcar como leído",
//Common
"pending": "Pendiente",
"loading": "Cargando...",
"submit": "Enviar",
"you_must_be_logged_in": "Debe estar conectado",
"are_you_sure": "¿Está seguro? ",
"you_must_be_logged_in": "Debes estar conectado",
"are_you_sure": "¿Estás seguro? ",
"please_log_in_first": "Por favor, inicia sesión",
"sign_in_sign_up_with_twitter": "Inicia sesión/Inscribete con Twitter",
"load_more": "Cargar más"
"sign_in_sign_up_with_twitter": "Regístrate/Inicia sesión con Twitter",
"load_more": "Mostrar más"
}

View file

@ -14,48 +14,48 @@
"sign_up_sign_in": "Connexion/Créer un compte",
"my_account": "Mon compte",
"view_profile": "Voir le profil",
"edit_account": "Editer le compte",
"edit_account": "Modifier le compte",
//Main
"new_posts": "Nouveaux Posts",
// Settings Schema
"title": "Titre",
"siteUrl": "URL du Site",
"siteUrl": "URL du site",
"tagline": "Slogan",
"requireViewInvite": "Consultation Restrainte",
"requirePostInvite": "Participation Restrainte",
"requirePostsApproval": "Modération Obligatoire",
"defaultEmail": "Email par Défaut",
"scoreUpdateInterval": "Mise à Jour du Score",
"defaultView": "Vue Par Défaut",
"postInterval": "Interval des Posts",
"commentInterval": "Interval des Commentaires",
"maxPostsPerDay": "Posts par Jour Max",
"startInvitesCount": "Invitations au Départ",
"postsPerPage": "Posts par Page",
"logoUrl": "URL du Logo",
"logoHeight": "Hauteur du Logo",
"logoWidth": "Largeur du Logo",
"language": "Language",
"backgroundCSS": "CSS de Fond",
"buttonColor": "Couleur des Boutons",
"buttonTextColor": "Couleur du Texte des Boutons",
"headerColor": "Couleur du Header",
"headerTextColor": "Couleur du Texte du Header",
"requireViewInvite": "Consultation restrainte",
"requirePostInvite": "Participation restrainte",
"requirePostsApproval": "Modération obligatoire",
"defaultEmail": "Email par défaut",
"scoreUpdateInterval": "Mise à jour du score",
"defaultView": "Vue par défaut",
"postInterval": "Interval des posts",
"commentInterval": "Interval des commentaires",
"maxPostsPerDay": "Max posts par jour",
"startInvitesCount": "Invitations de départ",
"postsPerPage": "Posts par page",
"logoUrl": "URL du logo",
"logoHeight": "Hauteur du logo",
"logoWidth": "Largeur du logo",
"language": "Langue",
"backgroundCSS": "CSS de fond",
"buttonColor": "Couleur des boutons",
"buttonTextColor": "Couleur du texte des boutons",
"headerColor": "Couleur de l'entête",
"headerTextColor": "Couleur du texte de l'entête",
"twitterAccount": "Compte Twitter",
"googleAnalyticsId": "ID Google Analytics",
"mixpanelId": "ID Mixpanel",
"clickyId": "ID Clicky",
"footerCode": "Code du Footer",
"extraCode": "Code en Plus",
"emailFooter": "Footer des Emails",
"footerCode": "Code du pied de page",
"extraCode": "Code en plus",
"emailFooter": "Pied de page des mails",
"notes": "Notes",
// Settings Fieldsets
"general": "Général",
"invites": "Invitations",
"email": "Email",
"email": "Adresse mail",
"scoring": "Score",
"posts": "Posts",
"comments": "Commentaires",
@ -67,25 +67,25 @@
// Settings Help Text
//Post Schema
"createdAt": "Créé à",
"postedAt": "Posté à",
"createdAt": "Créé le",
"postedAt": "Posté le",
"url": "Lien",
"title": "Titre",
"body": "Texte",
"htmlBody": "Texte HTML",
"viewCount": "Vues",
"commentCount": "Commentaires",
"commenters": "Commentateurs",
"lastCommentedAt": "Dernier Commentaire à",
"viewCount": "vues",
"commentCount": "commentaires",
"commenters": "commentateurs",
"lastCommentedAt": "Dernier commentaire le",
"clickCount": "Clics",
"baseScore": "Score de Base",
"baseScore": "Score de base",
"upvotes": "Upvotes",
"upvoters": "Upvoteurs",
"downvotes": "Downvotes",
"downvoters": "Downvoteurs",
"score": "Score",
"status": "Statut",
"sticky": "Mis en Avant",
"sticky": "Mis en exergue",
"inactive": "Inactif",
"author": "Auteur",
"userId": "Utilisateur",
@ -98,7 +98,7 @@
"upvote": "upvote",
"downvote": "downvote",
"link": "lien",
"edit": "Editer",
"edit": "Modifier",
"reply": "Répondre",
"no_comments": "Aucun commentaire.",
@ -108,8 +108,8 @@
"thanks_for_signing_up": "Merci pour votre inscription !",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "L'accès au site se fait uniquement par invitation. Nous vous informerons dès qu'une place se libère.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Désolé, vous n'avez pas le droit de voir cette page.",
"not_found": "Oups",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Désolé, mais ce que vous cherchez ne se trouve pas ici...",
"not_found": "Oups ! La page est introuvable.",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Désolé, mais ce que vous cherchiez ne se trouve pas là...",
// Post deleted
"your_post_has_been_deleted": "Votre post a été supprimé.",
@ -122,15 +122,15 @@
"short_url": "URL Courte",
"body": "Description",
"category": "Catégorie",
"inactive_": "Inactif ?",
"sticky_": "Mis en avant ?",
"inactive_": "Inactif ? ",
"sticky_": "Mis en exergue ? ",
"submission_date": "Date de soumission",
"submission_time": "Heure de soumission",
"date": "Date",
"submission": "Soumission",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Note : ce post est en cours de validation, il n'a pas encore de timestamp.",
"user": "Utilisateur",
"status_": "Status",
"status_": "Statut ",
"approved": "Approuvé",
"rejected": "Rejeté",
"delete_post": "Supprimer le post",
@ -142,13 +142,13 @@
"share": "Partager",
"discuss": "Discuter",
"upvote_": "Voter",
"sticky": "Mis en avant",
"status": "status",
"sticky": "Mis en exergue",
"status": "statut",
"votes": "votes",
"basescore": "baseScore",
"basescore": "Score de base",
"score": "score",
"clicks": "clics",
"views": "views",
"views": "vues",
"inactive": "inactif",
"comment": "commentaire",
"comments": "commentaires",
@ -160,14 +160,14 @@
"account": "Compte",
"username": "Nom d'utilisateur",
"display_name": "Nom réel",
"email": "Email",
"email": "Adresse mail",
"bio": "Bio",
"password": "Mot de passe",
"change_password": "Changer de mot de passe",
"change_password": "Changer le mot de passe",
"old_password": "Ancien mot de passe",
"new_password": "Nouveau mot de passe",
"email_notifications": "Notifications par email",
"new_posts": "Nouveau Post",
"email_notifications": "Notifications par mail",
"new_posts": "Nouveau post",
"comments_on_my_posts": "Commentaires sur mes posts",
"replies_to_my_comments": "Reponses à mes commentaires",
"forgot_password": "Mot de passe oublié ?",
@ -178,7 +178,7 @@
"make_admin": "Rendre admin",
"unadmin": "Supprimer les droits d'admin",
"delete_user": "Supprimer l'utilisateur",
"are_you_sure_you_want_to_delete": "Etes-vous sur de vouloir supprimer ",
"are_you_sure_you_want_to_delete": "Etes-vous sur de vouloir supprimer ?",
"reset_password": "Redéfinir le mot de passe",
"password_reset_link_sent": "Un lien pour redéfinir votre mot de passe a été envoyé !",
"name": "Nom",
@ -192,17 +192,17 @@
"edit_profile": "Modifier le profil",
"sign_in": "Connexion",
"sign_in_": "Connexion",
"sign_up_": "Créer un compte !",
"dont_have_an_account": "Pas encore de compte ?",
"sign_up_": "Créer un compte.",
"dont_have_an_account": "Pas de compte ?",
"already_have_an_account": "Déjà un compte ?",
"sign_up": "Créer un compte",
"please_fill_in_all_fields": "Vous devez remplir tous les champs",
"please_fill_in_all_fields": "Vous devez remplir tous les champs.",
"invite_": "Invitation ",
"left": " restante",
"invite_none_left": "Invitation (aucune restante)",
"all": "All",
"invited": "Invité",
"uninvited": "Pas invité",
"all": "Tout(e)s",
"invited": "Invité(e)",
"uninvited": "Pas invité(e)",
"filter_by": "Filtrer par",
"sort_by": "Trier par",
@ -228,7 +228,7 @@
"posts_per_day": " posts par jour",
"someone_replied_to_your_comment_on": "Quelqu'un à répondu à votre commentaire sur",
"has_replied_to_your_comment_on": " a répondu à votre commentaire sur",
"read_more": "Lire la suite",
"read_more": "Lire la suite.",
"a_new_comment_on_your_post": "Un nouveau commentaire sur votre post",
"you_have_a_new_comment_by": "Vous avez un nouveau commentaire de ",
"on_your_post": " sur votre post",
@ -247,7 +247,7 @@
"sign_out": "Déconnexion",
"invitedcount": "Membres Invités",
"invites": "Invitations",
"invited": "Invité?",
"invited": "Invité(e) ?",
"admin": "Admin",
"actions": "Actions",
"invites_left": "Invitations restantes",
@ -256,17 +256,17 @@
"bio": "Bio:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Posts Upvotés",
"downvoted_posts": "Posts Downvotés",
"upvoted_posts": "Posts upvotés",
"downvoted_posts": "Posts downvotés",
"mark_as_read": "Marquer comme lu",
//Common
"pending": "En attente",
"loading": "Chargement...",
"submit": "Envoyer",
"you_must_be_logged_in": "Vous devez être connecté",
"you_must_be_logged_in": "Vous devez être connecté.",
"are_you_sure": "Etes-vous sur ?",
"please_log_in_first": "Vous devez être connecté",
"please_log_in_first": "Vous devez être connecté.",
"sign_in_sign_up_with_twitter": "Connexion/Créer un compte avec Twitter",
"load_more": "Charger plus"

308
i18n/nl.i18n.json Normal file
View file

@ -0,0 +1,308 @@
{
//Navigation
"menu": "Menu",
"view": "Weergave",
"top": "Top",
"new": "Nieuw",
"best": "Beste",
"digest": "Samenvatting",
"users": "Gebruikers",
"settings": "Instellingen",
"admin": "Beheerder",
"post": "Artikel",
"toolbox": "Toolbox",
"sign_up_sign_in": "Registreren/Login",
"my_account": "Mijn profiel",
"view_profile": "Profiel bekijken",
"edit_account": "Profiel bewerken",
//Main
"new_posts": "Nieuw artikel",
// Settings Schema
"title": "Titel",
"description": "Beschrijving",
"siteUrl": "Website adres",
"tagline": "Onderschrift",
"requireViewInvite": "Uitnodiging verplicht om te lezen",
"requirePostInvite": "Uitnodiging verplicht om te plaatsen",
"requirePostsApproval": "Goedkeuring nieuwe artikel",
"defaultEmail": "Standaard Email",
"scoreUpdateInterval": "Score verversen interval",
"defaultView": "Normale weergave",
"postInterval": "Artikel interval",
"commentInterval": "Reacties interval",
"maxPostsPerDay": "Max. artikelen per dag",
"startInvitesCount": "Begin aantal uitnodigingen",
"postsPerPage": "Artikelen per pagina",
"logoUrl": "Logo URL",
"logoHeight": "Logo hoogte",
"logoWidth": "Logo breedte",
"language": "Taal",
"backgroundCSS": "Achtergrond CSS",
"buttonColor": "Knop kleur",
"buttonTextColor": "Knop tekst kleur",
"headerColor": "Kop kleur",
"headerTextColor": "Kop tekst kleur",
"twitterAccount": "Twitter account",
"googleAnalyticsId": "Google Analytics ID",
"mixpanelId": "Mixpanel ID",
"clickyId": "Clicky ID",
"footerCode": "Footer code",
"extraCode": "Extra code",
"emailFooter": "Email footer",
"notes": "Notities",
"debug": "Debug modus",
"fontUrl": "Lettertype URL",
"fontFamily": "Lettertype familie",
"authMethods": "Authenticatie methoden",
"faviconUrl": "Favicon URL",
"mailURL": "Mail URL",
"postsLayout": "Artikelen weergave",
// Settings Fieldsets
"general": "Algemeen",
"invites": "Uitnodigingen",
"email": "Email",
"scoring": "Score",
"posts": "Artikelen",
"comments": "Reacties",
"logo": "Logo",
"extras": "Extras",
"colors": "Kleuren",
"integrations": "Integraties",
// Settings Help Text
// Post Schema
"createdAt": "Geschreven",
"postedAt": "Ingestuurd",
"url": "URL",
"title": "Titel",
"body": "Beschrijving",
"htmlBody": "HTML Body",
"viewCount": "Weergaven",
"commentCount": "Reacties",
"commenters": "Reageerders",
"lastCommentedAt": "Laatste reactie",
"clickCount": "Aantal klikken",
"baseScore": "Basis score",
"upvotes": "Omhoog stemmen",
"upvoters": "Omhoog stemmers",
"downvotes": "Stemmen omlaag",
"downvoters": "Omlaag stemmers",
"score": "Score",
"status": "Status",
"sticky": "Vastgezet",
"inactive": "Inactief",
"author": "Auteur",
"userId": "Gebruiker",
"sorry_we_couldnt_find_any_posts": "Sorry, geen artikelen gevonden.",
//Commments
"your_comment_has_been_deleted": "Jouw reactie is verwijderd.",
"comment_": "Reactie",
"delete_comment": "Verwijder reactie",
"add_comment": "Reactie toevoegen",
"upvote": "omhoog",
"downvote": "omlaag",
"link": "link",
"edit": "Bewerk",
"reply": "Reageer",
"no_comments": "Geen reacties.",
"please_sign_in_to_reply": "Login om te kunnen reageren.",
//Errors
"you_are_already_logged_in": "Je bent al ingelogd",
"sorry_this_is_a_private_site_please_sign_up_first": "Sorry, dit is een privé website. Eerst registreren alstublieft.",
"thanks_for_signing_up": "Bedankt voor het registreren!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "De website is op dit moment alleen op basis van uitnodiging, maar zodra er een plek vrij is hoor je het gelijk van ons.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Sorry, je hebt geen rechten om deze pagina te bekijken.",
"sorry_you_do_not_have_the_rights_to_comments": "Sorry, op dit moment heb je rechten om te reageren.",
"not_found": "Niet gevonden!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Het spijt ons; we hebben niet kunnen vinden waar je naar op zoek was..",
"disallowed_property_detected": "Verboden toegang",
//Notifications
"no_notifications": "Geen berichten",
"1_notification": "1 bericht",
"notifications": "notificaties",
"mark_all_as_read": "Markeer alles als gelezen",
// Post deleted
"your_post_has_been_deleted": "Jouw artikel is verwijderd.",
// Post submit & edit
"created": "Ingestuurd",
"title": "Titel",
"suggest_title": "Titel suggestie",
"url": "URL",
"short_url": "Korte URL",
"body": "Beschrijving",
"category": "Categorie",
"inactive_": "Inactief?",
"sticky_": "Vastgezet?",
"submission_date": "Datum van insturen",
"submission_time": "Tijd van insturen",
"date": "Datum",
"submission": "Inzending",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Let op: dit bericht wacht nog op goedkeuring en heeft daardoor nog geen datum van inzending.",
"user": "Gberuiker",
"status_": "Status",
"approved": "Goedgekeurd",
"rejected": "Afgewezen",
"delete_post": "Verwijder artikel",
"thanks_your_post_is_awaiting_approval": "Bedankt, je bericht wacht op goedkeuring.",
"sorry_couldnt_find_a_title": "Sorry, kon geen titel vinden..",
"please_fill_in_an_url_first": "Vul eerst een URL in!",
// Post item
"share": "Delen",
"discuss": "Discusieer",
"upvote_": "Omhoog",
"sticky": "Vastgezet",
"status": "status",
"votes": "stemmen",
"basescore": "basisScore",
"score": "score",
"clicks": "klikken",
"views": "weergaven",
"inactive": "inactief",
"comment": "reactie",
"comments": "reacties",
"point": "punt",
"points": "punten",
//User /client/views/users/account/user_account.html
"please_complete_your_profile_below_before_continuing": "Maak eerst je profiel af alvorens verder te gaan.",
"account": "Account",
"username": "Gebruikersnaam",
"display_name": "Weergave naam",
"email": "Email",
"bio": "Bio",
"twitter_username": "Twitter gebruikersnaam",
"github_username": "GitHub gebruikersnaam",
"site_url" : "Website URL",
"password": "Wachtwoord",
"change_password": "Wachtwoord veranderen?",
"old_password": "Oud wachtwoord",
"new_password": "Nieuw wachtwoord",
"email_notifications": "Email Notificaties",
"new_users" : "Nieuwe gebruikers",
"new_posts": "Nieuwe artikelen",
"comments_on_my_posts": "Reacties op mijn artikelen",
"replies_to_my_comments": "Antwoorden op mijn reacties",
"forgot_password": "Wachtwoord vergeten?",
"profile_updated": "Profiel bijgewerkt",
"please_fill_in_your_email_below_to_finish_signing_up": "Vul je email in om de registratie af te ronden.",
"invite": "Uitnodigen",
"uninvite": "Uitnodiging intrekken",
"make_admin": "Beheerder maken",
"unadmin": "Beheer rechten ontnemen",
"delete_user": "Gberuiker verwijderen",
"are_you_sure_you_want_to_delete": "Verwijder ",
"reset_password": "Reset wachtwoord",
"password_reset_link_sent": "Wacthwoord reset link verstuurd!",
"name": "Naam",
"posts": "Artikelen",
"comments_": "Reacties",
"karma": "Karma",
"is_invited": "Is uitgenodigd?",
"is_admin": "Is beheerder?",
"delete": "Verwijder",
"member_since": "Lid sinds",
"edit_profile": "Bewerk profiel",
"sign_in": "Inloggen",
"sign_in_": "Inloggen!",
"sign_up_": "Registreren!",
"dont_have_an_account": "Geen account?",
"already_have_an_account": "Heb je al een account?",
"sign_up": "Registreren",
"please_fill_in_all_fields": "Alle velden invullen a.u.b.",
"invite_": "Uitnodiging sturen aan ",
"left": " resterend",
"invite_none_left": "Invite (geen resterend)",
"all": "Alles",
"invited": "Uitgenodigd",
"uninvited": "Uitnoding ongedaan gemaakt",
"filter_by": "Filteren",
"sort_by": "Sorteer",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Sorry, je hebt geen toegang tot deze pagina",
"please_sign_in_first": "Log eerst in.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Sorry, alleen beheerders kunnen deze pagina bekijken.",
"sorry_you_dont_have_permissions_to_add_new_items": "Sorry, je hebt geen rechten om toe te voegen.",
"sorry_you_cannot_edit_this_post": "Sorry, je kan dit artikel niet bewerken.",
"sorry_you_cannot_edit_this_comment": "Sorry, je kan deze reactie niet bewerken.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Je moet eerst inloggen en een beheerder zijn om een categorie aan te maken.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Je moet eerst inloggen of uitgenodigd worden om een reactie te kunnen plaatsen.",
"please_wait": "Moment geduld ",
"seconds_before_commenting_again": " seconden voordat je opnieuw kunt reageren",
"your_comment_is_empty": "Je reactie is leeg.",
"you_dont_have_permission_to_delete_this_comment": "Je hebt geen rechten om deze reactie te verwijderen.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Je moet eerst inloggen of uitgenoegd worden om artikelen te kunnen plaatsen.",
"please_fill_in_a_headline": "Vul een titel in",
"this_link_has_already_been_posted": "Dit adres is al een keer ingestuurd.",
"sorry_you_cannot_submit_more_than": "Sorry, je kunt niet meer dan ",
"posts_per_day": " artikelen per dag plaatsen",
"someone_replied_to_your_comment_on": "Iemand heeft gereageerd op ",
"has_replied_to_your_comment_on": " heeft gereageerd op jouw reactie op ",
"read_more": "Verder lezen",
"a_new_comment_on_your_post": "Nieuwe reactie op je artikel",
"you_have_a_new_comment_by": "Nieuwe reactie van ",
"on_your_post": " op jouw artikel",
"has_created_a_new_post": " heeft een nieuw artikel geplaatst",
"your_account_has_been_approved": "Jouw account is goedgekeurd.",
"welcome_to": "Welkom bij ",
"start_posting": "Begin met plaatsen.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Vul een titel in",
"seconds_before_posting_again": " voor het opnieuw kunnen plaatsen.",
"upvoted": "Omhoog gestemd",
"posted_date": "Datum plaatsing",
"posted_time": "Tijd plaatsing",
"profile": "Profiel",
"sign_out": "Uitloggen",
"you_ve_been_signed_out": "Je bent uitgelogd. Tot snel!",
"invitedcount": "Aantal uitgenodigd",
"invites": "Uitnodigingen",
"invited": "Uitgenodigd?",
"admin": "Beheerder",
"actions": "Acties",
"invites_left": "uitnodigingen over",
"id": "ID",
"name": "Naam:",
"bio": "Bio:",
"github": "GitHub",
"site": "Website",
"upvoted_posts": "Omhoog gestemd",
"downvoted_posts": "Omlaag gestemd",
"mark_as_read": "Markeer als gelezen",
//Common
"pending": "In behandeling",
"loading": "Laden...",
"submit": "Verzenden",
"you_must_be_logged_in": "Je moet ingelogd zijn.",
"are_you_sure": "Zeker weten?",
"please_log_in_first": "Log eerst in.",
"please_log_in_to_comment": "Log eerst in om een reactie te kunnen plaatsen.",
"sign_in_sign_up_with_twitter": "Registreer/Registreer met Twitter",
"load_more": "Meer laden",
"most_popular_posts": "De meest populaire artikelen.",
"newest_posts": "De nieuwste artikelen.",
"highest_ranked_posts_ever": "Artikelen met de meeste stemmen.",
"the_profile_of": "Profiel van",
"posts_awaiting_moderation": "Artikelen die op goedkeuring wachten.",
"future_scheduled_posts": "Ingeplande artikelen.",
"users_dashboard": "Gebruikers dashboard.",
"telescope_settings_panel": "Telescope intellingen pagina.",
"various_utilities": "Verschillende voorzieningen."
}

302
i18n/pl.i18n.json Normal file
View file

@ -0,0 +1,302 @@
{
//Navigation
"menu": "Menu",
"view": "Widok",
"top": "Na topie",
"new": "Najnowsze",
"best": "Najlepsze",
"digest": "Dzisiaj",
"users": "Użytkownicy",
"settings": "Ustawienia",
"admin": "Admin",
"post": "Nowy temat",
"toolbox": "Narzędzia",
"sign_up_sign_in": "Zarejestruj/Zaloguj",
"my_account": "Moje konto",
"view_profile": "Profil",
"edit_account": "Edytuj konto",
//Main
"new_posts": "Nowe Posty",
// Settings Schema
"title": "Tytuł",
"siteUrl": "URL strony",
"tagline": "Podtytuł",
"requireViewInvite": "Wymagaj zaproszenia żeby przeglądać",
"requirePostInvite": "Wymagaj zaproszenia żeby pisać",
"requirePostsApproval": "Zatwierdzanie nowych postów",
"defaultEmail": "Standardowy Email",
"scoreUpdateInterval": "Częstotliwość przeliczania punktów",
"defaultView": "Standardowy widok",
"postInterval": "Interwał czasowy dla nowych postów",
"commentInterval": "Interwał czasowy dla nowych komentarzy",
"maxPostsPerDay": "Maksymalna liczba postów w jednym dniu",
"startInvitesCount": "Licznik zaproszeń",
"postsPerPage": "Postów na stronę",
"logoUrl": "URL Logo",
"logoHeight": "Wysokość Logo",
"logoWidth": "Szerokość Logo",
"language": "Język",
"backgroundCSS": "Tło CSS",
"buttonColor": "Kolor przycisków",
"buttonTextColor": "Kolor tekstu na przyciskach",
"headerColor": "Kolor dla nagłówka",
"headerTextColor": "Kolor tekstu dla nagłówka",
"twitterAccount": "Konto Twitter",
"googleAnalyticsId": "Google Analytics ID",
"mixpanelId": "Mixpanel ID",
"clickyId": "Clicky ID",
"footerCode": "Kod w stopce",
"extraCode": "Dodatkowy kod",
"emailFooter": "Stopka Email",
"notes": "Notatki",
"debug": "Debug Mode",
// Settings Fieldsets
"general": "Główne",
"invites": "Zaproszenia",
"email": "Email",
"scoring": "Scoring",
"posts": "Posty",
"comments": "Comments",
"logo": "Logo",
"extras": "Extras",
"colors": "Kolory",
"integrations": "Integracje",
// Settings Help Text
// Post Schema
"createdAt": "Utworzony",
"postedAt": "Dodany",
"url": "URL",
"title": "Tytuł",
"body": "Treść",
"htmlBody": "Treść HTML",
"viewCount": "Liczba odświeżeń",
"commentCount": "Liczba komentarzy",
"commenters": "Komentujący",
"lastCommentedAt": "Ostatnio komentował",
"clickCount": "Liczba kliknięć",
"baseScore": "Bazowy wynik",
"upvotes": "Pozytywne",
"upvoters": "Głosujący pozytywnie",
"downvotes": "Negatywne",
"downvoters": "Głosujący negatywnie",
"score": "Wynik",
"status": "Status",
"sticky": "Przyklejony",
"inactive": "Nieaktywny",
"author": "Autor",
"userId": "Użytkownik",
"sorry_we_couldnt_find_any_posts": "Przepraszamy, ale w tej chwili nie ma tutaj żadnych postów.",
//Commments
"your_comment_has_been_deleted": "Twój komentarz został usunięty.",
"comment_": "Komentuj",
"delete_comment": "Usuń komentarz",
"add_comment": "Dodaj komentarz",
"upvote": "plus",
"downvote": "minus",
"link": "link",
"edit": "Edytuj",
"reply": "Odpowiedz",
"no_comments": "Brak komentarzy.",
//Errors
"you_are_already_logged_in": "Jesteś już zalogowany",
"sorry_this_is_a_private_site_please_sign_up_first": "Musisz się najpierw zarejestrować.",
"thanks_for_signing_up": "Dzięki za rejestrację!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "Tą stronę mogą oglądać jedynie zaproszone osoby",
"sorry_you_dont_have_the_rights_to_view_this_page": "Niestety nie masz odpowiednich praw dostępu żeby widzieć tą stronę.",
"sorry_you_do_not_have_the_rights_to_comments": "Niestety nie masz odpowiednich praw dostępu żeby móc dodawać komentarze.",
"not_found": "Nie znaleziono!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Niestety nie ma tutaj tego czego szukałeś...",
//Notifications
"no_notifications": "Brak powiadomień",
"1_notification": "1 powiadomienie",
"notifications": "powiadomień",
"mark_all_as_read": "Oznacz wszystkie jako przeczytane",
// Post deleted
"your_post_has_been_deleted": "Twój post został usunięty.",
// Post submit & edit
"created": "Utworzone",
"title": "Tytuł",
"suggest_title": "Zasugeruj tytuł",
"url": "URL",
"short_url": "Krótki URL",
"body": "Body",
"category": "Kategoria",
"categories": "Kategorie",
"inactive_": "Nieaktywny?",
"sticky_": "Przyklejony?",
"submission_date": "Data utworzenia",
"submission_time": "Godzina utworzenia",
"date": "Data",
"submission": "Wpis",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Ten post ciągle czeka na zatwierdzenie.",
"user": "Użytkownik",
"status_": "Status",
"approved": "Zaakceptowany",
"rejected": "Odrzucony",
"delete_post": "Usuń post",
"thanks_your_post_is_awaiting_approval": "Twój post czeka na zatwierdzenie.",
"sorry_couldnt_find_a_title": "Podaj tytuł...",
"please_fill_in_an_url_first": "Podaj URL",
// Post item
"share": "Udostępnij",
"discuss": "Komentuj",
"upvote_": "Plus",
"sticky": "Przyklejony",
"status": "status",
"votes": "głosy",
"basescore": "wynik bazowy",
"score": "wynik",
"clicks": "kliknięcia",
"views": "wyświetlenia",
"inactive": "nieaktywny",
"comment": "komentarz",
"comments": "komentarze",
"point": "punkt",
"points": "punktów",
//User /client/views/users/account/user_account.html
"please_complete_your_profile_below_before_continuing": "Uzupełnij profil.",
"account": "Konto",
"username": "Nick",
"display_name": "Nazwa wyświetlana",
"email": "Email",
"bio": "Bio",
"twitter_username": "Twitter",
"github_username": "GitHub",
"site_url" : "Strona WWW",
"password": "Hasło",
"change_password": "Zmienić hasło?",
"old_password": "Stare hasło",
"new_password": "Nowe hasło",
"email_notifications": "Notyfikacje email",
"new_users" : "Nowi użytkownicy",
"new_posts": "Nowe posty",
"comments_on_my_posts": "Komentarze do moich postów",
"replies_to_my_comments": "Odpowiedzi na moje komentarze",
"forgot_password": "Zapomniałeś hasło?",
"profile_updated": "Profil został zaktualizowany",
"please_fill_in_your_email_below_to_finish_signing_up": "Uzupełnij email.",
"invite": "Zaproś",
"uninvite": "Wyproś",
"make_admin": "Mianuj admina",
"unadmin": "Zdejmij admina",
"delete_user": "Usuń użytkownika",
"are_you_sure_you_want_to_delete": "Jesteś pewny, że chcesz usunąć ",
"reset_password": "Resetuj hasło",
"password_reset_link_sent": "Link z nowym hasłem został wysłany!",
"name": "Imię",
"posts": "Posty",
"comments_": "Komentarze",
"karma": "Karma",
"is_invited": "Czy jest zaproszony?",
"is_admin": "Czy jest adminem?",
"delete": "Usuń",
"member_since": "Zarejestrowany od",
"edit_profile": "Edytuj profil",
"sign_in": "Zaloguj",
"sign_in_": "Zaloguj!",
"sign_up_": "Zarejestruj!",
"dont_have_an_account": "Nie masz konta?",
"already_have_an_account": "Masz już konto?",
"sign_up": "Zarejestruj",
"please_fill_in_all_fields": "Uzupełnij pola",
"invite_": "Zaproś ",
"left": " left",
"invite_none_left": "Zaproszenia (brak)",
"all": "Wszyscy",
"invited": "Zaproszeni",
"uninvited": "Niezaproszeni",
"filter_by": "Filtruj po",
"sort_by": "Sortuj po",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Przepraszamy, nie masz dostępu.",
"please_sign_in_first": "Zaloguj się.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Musisz być adminem żeby to zobaczyć.",
"sorry_you_dont_have_permissions_to_add_new_items": "Nie masz uprawnień do dodawania.",
"sorry_you_cannot_edit_this_post": "Nie możesz edytować tego postu.",
"sorry_you_cannot_edit_this_comment": "Nie możesz edytować tego komentarza.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Musisz się zalogować jako admin aby móc dodawać nowe kategorie.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Musisz być zalogowany lub zaproszony aby dodawaćc nowe komentarze.",
"please_wait": "Proszę czekać ",
"seconds_before_commenting_again": " sekund zanim znowu będziesz móc komentować",
"your_comment_is_empty": "Twój komentarz jest pusty.",
"you_dont_have_permission_to_delete_this_comment": "Nie możesz usunąć tego komentarza.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Musisz być zalogowany lub zaproszony aby dodawać nowe posty.",
"please_fill_in_a_headline": "Please fill in a headline",
"this_link_has_already_been_posted": "Ten link już istnieje",
"sorry_you_cannot_submit_more_than": "Nie możesz dodawać więcej niż ",
"posts_per_day": " postów na dzień",
"someone_replied_to_your_comment_on": "Ktoś odpowiedział na twój komentarz w",
"has_replied_to_your_comment_on": " odpowiedział na twój komentarz w",
"read_more": "Czytaj dalej",
"a_new_comment_on_your_post": "Nowy komentarz",
"you_have_a_new_comment_by": "Pojawił się nowy komentarz ",
"on_your_post": " dla twojego posta",
"has_created_a_new_post": " utworzył nowy post",
"your_account_has_been_approved": "Twoje konto zostało zaakceptowane.",
"welcome_to": "Witaj na ",
"start_posting": "Zacznij pisać.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Wypełnij tytuł",
"seconds_before_posting_again": " sekund zanim znowu będziesz mógł napisać",
"upvoted": "minus",
"posted_date": "Data",
"posted_time": "Godzina",
"posted_date": "Data",
"posted_time": "Godzina",
"profile": "Profil",
"sign_out": "Wyloguj się",
"you_ve_been_signed_out": "Zostałeś prawidłowo wylogowany!",
"invitedcount": "Liczba zaproszeń",
"invites": "Zaproszenia",
"invited": "Zaproszony?",
"admin": "Admin",
"actions": "Akcje",
"invites_left": "zaproszeń pozostało",
"id": "ID",
"name": "Imię:",
"bio": "Bio:",
"github": "GitHub",
"site": "Strona WWW",
"upvoted_posts": "Głosy pozytywne",
"downvoted_posts": "Głosy negatywne",
"mark_as_read": "Oznacz jako przeczytane",
//Common
"pending": "Oczekuje",
"loading": "Ładowanie...",
"submit": "Wyślij",
"you_must_be_logged_in": "Musisz być zalogowany.",
"are_you_sure": "Jesteś pewny?",
"please_log_in_first": "Najpierw się zaloguj.",
"please_log_in_to_comment": "Aby komentować musisz być zalogowany.",
"sign_in_sign_up_with_twitter": "Zarejestruj/Zaloguj się przez Twitter",
"load_more": "Więcej",
"most_popular_posts": "Aktualnie najpopularniejsze posty.",
"newest_posts": "Najnowsze posty.",
"highest_ranked_posts_ever": "Najwyżej oceniane posty wszechczasów.",
"the_profile_of": "Profil",
"posts_awaiting_moderation": "Posty czekające na moderację.",
"future_scheduled_posts": "Posty na przyszłość.",
"users_dashboard": "Pulpit użytkowników.",
"telescope_settings_panel": "Ustawienia.",
"various_utilities": "Narzędzia."
}

308
i18n/pt-BR.i18n.json Normal file
View file

@ -0,0 +1,308 @@
{
//Navigation
"menu": "Menu",
"view": "Visão",
"top": "Topo",
"new": "Novo",
"best": "Melhor",
"digest": "Resumo",
"users": "Usuários",
"settings": "Configurações",
"admin": "Admin",
"post": "Postar",
"toolbox": "Toolbox",
"sign_up_sign_in": "Registrar/Entrar",
"my_account": "Minha Conta",
"view_profile": "Ver Perfil",
"edit_account": "Editar Conta",
//Main
"new_posts": "Novas Postagens",
// Settings Schema
"title": "Título",
"description": "Descrição",
"siteUrl": "URL do site",
"tagline": "Tagline",
"requireViewInvite": "Exigir Convite para Ver",
"requirePostInvite": "Exigir Convite para Postar",
"requirePostsApproval": "Exigir Postagens serem Aprovadas",
"defaultEmail": "Email Padrão",
"scoreUpdateInterval": "Definir Intervalo de Atualização",
"defaultView": "Visão Padrão",
"postInterval": "Intervalo de Postagens",
"commentInterval": "Intervalo de Comentários",
"maxPostsPerDay": "Máx de Postagens Por Dia",
"startInvitesCount": "Número Inicial de Convites",
"postsPerPage": "Postagens Por Página",
"logoUrl": "URL do Logo",
"logoHeight": "Altura do Logo",
"logoWidth": "Comprimento do Logo",
"language": "Linguagem",
"backgroundCSS": "Background CSS",
"buttonColor": "Cor do Botão",
"buttonTextColor": "Cor do Texto do Botão",
"headerColor": "Cor do Cabeçalho",
"headerTextColor": "Cor do Texto do Cabeçalho",
"twitterAccount": "Conta do Twitter",
"googleAnalyticsId": "ID do Google Analytics",
"mixpanelId": "ID do Mixpanel",
"clickyId": "ID do Clicky",
"footerCode": "Código para o Rodapé",
"extraCode": "Código Extra",
"emailFooter": "Rodapé do Email",
"notes": "Notas",
"debug": "Modo de Debug",
"fontUrl": "URL da Fonte",
"fontFamily": "Família da Fonte",
"authMethods": "Métodos de Autenticação",
"faviconUrl": "URL do Favicon",
"mailURL": "MailURL",
"postsLayout": "Layout dos Posts",
// Settings Fieldsets
"general": "Geral",
"invites": "Convites",
"email": "Email",
"scoring": "Classificação",
"posts": "Postagens",
"comments": "Comentários",
"logo": "Logo",
"extras": "Extras",
"colors": "Cores",
"integrations": "Integrações",
// Settings Help Text
// Post Schema
"createdAt": "Criado em",
"postedAt": "Postado em",
"url": "URL",
"title": "Título",
"body": "Corpo",
"htmlBody": "Corpo HTML",
"viewCount": "Ver Contagem",
"commentCount": "Contagem de Comentários",
"commenters": "Comentaristas",
"lastCommentedAt": "Comentado por último em",
"clickCount": "Contagem de cliques",
"baseScore": "Classificação Básica",
"upvotes": "Votos Positivos",
"upvoters": "Votadores Positivos",
"downvotes": "Votos Negativos",
"downvoters": "Votadores Negativos",
"score": "Classificação",
"status": "Estado",
"sticky": "Fixo",
"inactive": "Inativo",
"author": "Autor",
"userId": "Usuário",
"sorry_we_couldnt_find_any_posts": "Desculpe, não conseguimos encontrar nenhuma postagem.",
//Commments
"your_comment_has_been_deleted": "Seu comentário foi deletado.",
"comment_": "Comentário",
"delete_comment": "Deletar Comentário",
"add_comment": "Adicionar Comentário",
"upvote": "+",
"downvote": "-",
"link": "link",
"edit": "Editar",
"reply": "Responder",
"no_comments": "Sem comentários.",
"please_sign_in_to_reply": "Por favor, registre-se para responder",
//Errors
"you_are_already_logged_in": "Você já está logado",
"sorry_this_is_a_private_site_please_sign_up_first": "Desculpe, mas este é um site privado. Registre-se primeiro.",
"thanks_for_signing_up": "Obrigado por se registrar!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "O site está atualmente apenas para convidados, mas nós iremos avisá-lo assim que abrirmos ao público geral.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Desculpe, você não pode ver esta página.",
"sorry_you_do_not_have_the_rights_to_comments": "Desculpe, você não pode comentar neste momento.",
"not_found": "Não Encontrado!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Nos desculpe; o que estava procurando não se encontra aqui...",
"disallowed_property_detected": "Propriedade não permitida detectada",
//Notifications
"no_notifications": "Sem notificações",
"1_notification": "1 notificação",
"notifications": "notificações",
"mark_all_as_read": "Marcar todas como lidas",
// Post deleted
"your_post_has_been_deleted": "Sua postagem foi deletada.",
// Post submit & edit
"created": "Criado",
"title": "Título",
"suggest_title": "Sugerir título",
"url": "URL",
"short_url": "URL curta",
"body": "Corpo",
"category": "Categoria",
"inactive_": "Inativo?",
"sticky_": "Fixo?",
"submission_date": "Data de Submissão",
"submission_time": "Hora de Submissão",
"date": "Data",
"submission": "Submissão",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Nota: esta postagem continua pendente e não possui data de submissão ainda.",
"user": "Usuário",
"status_": "Estado",
"approved": "Aprovada",
"rejected": "Rejeitada",
"delete_post": "Deletar Postagem",
"thanks_your_post_is_awaiting_approval": "Obrigado, sua postagem está aguardando aprovação.",
"sorry_couldnt_find_a_title": "Desculpe, não encontramos um título...",
"please_fill_in_an_url_first": "Por favor, inclua a URL antes!",
// Post item
"share": "Compartilhar",
"discuss": "Discutir",
"upvote_": "Votar",
"sticky": "Fixo",
"status": "estado",
"votes": "votos",
"basescore": "classificaçaoBase",
"score": "classificação",
"clicks": "cliques",
"views": "visualizações",
"inactive": "inativo",
"comment": "comentário",
"comments": "comentários",
"point": "ponto",
"points": "pontos",
//User /client/views/users/account/user_account.html
"please_complete_your_profile_below_before_continuing": "Por favor, complete seu perfil abaixo antes de continuar.",
"account": "Conta",
"username": "Nome de usuário",
"display_name": "Nome de exibição",
"email": "Email",
"bio": "Bio",
"twitter_username": "Twitter",
"github_username": "GitHub",
"site_url" : "URL do Site",
"password": "Senha",
"change_password": "Mudar Senha?",
"old_password": "Senha Antiga",
"new_password": "Nova Senha",
"email_notifications": "Notificações por Email",
"new_users" : "Novos usuários",
"new_posts": "Novas Postagens",
"comments_on_my_posts": "Comentários em minhas postagens",
"replies_to_my_comments": "Respostas aos meus comentários",
"forgot_password": "Esqueceu sua senha?",
"profile_updated": "Perfil atualizado",
"please_fill_in_your_email_below_to_finish_signing_up": "Por favor, preencha seu email abaixo para finalizar o registro.",
"invite": "Convite",
"uninvite": "Desconvidar",
"make_admin": "Tornar admin",
"unadmin": "Retirar do admin",
"delete_user": "Deletar Usuário",
"are_you_sure_you_want_to_delete": "Está certo de que deseja deletar ",
"reset_password": "Resetar Senhar",
"password_reset_link_sent": "Link de reset de senha enviado!",
"name": "Nome",
"posts": "Postagens",
"comments_": "Comentários",
"karma": "Carma",
"is_invited": "Foi Convidado?",
"is_admin": "É Admin?",
"delete": "Deletar",
"member_since": "Membro desde",
"edit_profile": "Editar perfil",
"sign_in": "Entrar",
"sign_in_": "Entrar!",
"sign_up_": "Registrar!",
"dont_have_an_account": "Não possui uma conta?",
"already_have_an_account": "Já possui uma conta?",
"sign_up": "Registrar",
"please_fill_in_all_fields": "Por favor, preencha todos os campos",
"invite_": "Convidar ",
"left": " restantes",
"invite_none_left": "Convidar (nenhum restante)",
"all": "Todos",
"invited": "Convidado",
"uninvited": "Desconvidado",
"filter_by": "Filtrar por",
"sort_by": "Distribuir por",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Desculpe, você não possui acesso a esta página",
"please_sign_in_first": "Por favor, entre com sua conta primeiro.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Desculpe, você precisa ser admin para ver esta página.",
"sorry_you_dont_have_permissions_to_add_new_items": "Desculpe, você não possui permissão para adicionar novos itens.",
"sorry_you_cannot_edit_this_post": "Desculpe, você não pode estar esta postagem.",
"sorry_you_cannot_edit_this_comment": "Desculpe, você não pode editar este comentário.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Você precisa se logar e ser um admin para adicionar uma nova categoria.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Você precisa se logar ou ser convidado para postar novos comentários.",
"please_wait": "Por favor aguarde ",
"seconds_before_commenting_again": " segundos antes de comentar novamente",
"your_comment_is_empty": "Seu comentário está vazio.",
"you_dont_have_permission_to_delete_this_comment": "Você não possui permissão para deletar este comentário.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Você precisa se logar ou ser convidado para novas postagens.",
"please_fill_in_a_headline": "Por favor, preencha uma chamada",
"this_link_has_already_been_posted": "Este link já foi publicado",
"sorry_you_cannot_submit_more_than": "Desculpe, você não pode submeter mais do que ",
"posts_per_day": " postagens por dia",
"someone_replied_to_your_comment_on": "Alguém respondeu ao seu comentário em",
"has_replied_to_your_comment_on": " respondeu ao seu comentário em",
"read_more": "Ler mais",
"a_new_comment_on_your_post": "Um novo comentário em sua postagem",
"you_have_a_new_comment_by": "Você possui um novo comentário por ",
"on_your_post": " em sua postagem",
"has_created_a_new_post": " criou uma nova postagem",
"your_account_has_been_approved": "Sua conta foi aprovada.",
"welcome_to": "Bem vindo para ",
"start_posting": "Comece a postar.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Por favor preencha um título",
"seconds_before_posting_again": " segundos antes de postar novamente",
"upvoted": "Votado",
"posted_date": "Data da Postagem",
"posted_time": "Hora da da Postagem",
"profile": "Perfil",
"sign_out": "Sair",
"you_ve_been_signed_out": "Você saiu com sucesso. Volte logo!",
"invitedcount": "ContagemConvites",
"invites": "Convites",
"invited": "Convidado?",
"admin": "Admin",
"actions": "Ações",
"invites_left": "invites left",
"id": "ID",
"name": "Nome:",
"bio": "Bio:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Postagens votadas",
"downvoted_posts": "Postagens contra",
"mark_as_read": "Marcar como lido",
//Common
"pending": "Pendente",
"loading": "Carregando...",
"submit": "Submeter",
"you_must_be_logged_in": "Você deve estar logado.",
"are_you_sure": "Você está certo?",
"please_log_in_first": "Por favor, entre primeiro.",
"please_log_in_to_comment": "Por favor entre para comentário.",
"sign_in_sign_up_with_twitter": "Registrar/Entrar com Twitter",
"load_more": "Carregar Mais",
"most_popular_posts": "As postagens mais populares neste momento.",
"newest_posts": "As postagens mais novas.",
"highest_ranked_posts_ever": "As melhores postagens de todos os tempos.",
"the_profile_of": "O perfil de",
"posts_awaiting_moderation": "Postagens aguardando moderação.",
"future_scheduled_posts": "Postagens agendadas para o futuro.",
"users_dashboard": "Painel dos usuários.",
"telescope_settings_panel": "Painel de Configurações do Telescope.",
"various_utilities": "Várias utilidades."
}

207
i18n/ro.i18n.json Normal file
View file

@ -0,0 +1,207 @@
{
//Navigation
"menu": "Meniu",
"top": "Top Știri",
"new": "Noutăți",
"digest": "Rezumat",
"users": "Utilizatori",
"settings": "Setari",
"admin": "Administrare",
"post": "Postează",
"toolbox": "Trusa de scule",
"sign_up_sign_in": "Inregistrare/Logare",
"my_account": "Contul meu",
"view_profile": "Afiseaza profil",
"edit_account": "Modifica profil",
//Main
"new_posts": "Postări Noi",
//Commments
"your_comment_has_been_deleted": "Comentariul tău a fost șters",
"comment_": "Comentare",
"delete_comment": "Sterge comentariu",
"add_comment": "Adaugă comentariu",
"upvote": "+1",
"downvote": "-1",
"link": "link",
"edit": "editează",
"reply": "răspunde",
"no_comments": "Nici un comentariu.",
//Errors
"you_are_already_logged_in": "Sunteți deja logat.",
"sorry_this_is_a_private_site_please_sign_up_first": "Ne cerem scuze, acesta este un site care necesită înscriere.",
"thanks_for_signing_up": "Mulțumim pentru înregistrare!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "Momentan nu acceptăm decât înscrieri pe bază de invitație, dar vă vom anunța de îndată ce avem un loc disponibil!",
"sorry_you_dont_have_the_rights_to_view_this_page": "Ne cerem scuze, însă nu aveți drepturi de a accesa această pagină.",
"not_found": "Inexistent!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Ne pare rău, dar ceea ce ați căutat nu pare a fi disponibil.",
//Notifications
"no_notifications": "Nici o notificare",
"1_notification": "1 Notificare",
"notifications": "Notificări",
"mark_all_as_read": "Marchează toate ca citite",
// Post deleted
"your_post_has_been_deleted": "Postarea ta a fost ștersă.",
// Post submit & edit
"created": "Creat",
"title": "Titlu",
"suggest_title": "Propune un titlu",
"url": "URL",
"short_url": "Prescurtare-URL",
"body": "Descriere",
"category": "Categorie",
"inactive_": "Inactiv?",
"sticky_": "Arhivează?",
"submission_date": "Data înregistrării",
"submission_time": "Ora înregistrării",
"date": "Data",
"submission": "Înregistrare",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Informare: Această contribuție este încă în curs de aprobare, de aceea nu există o dată și o oră de înregistrare.",
"user": "Utilizator",
"status_": "Status",
"approved": "Aprobat",
"rejected": "Respins",
"delete_post": "Șterge postarea",
"thanks_your_post_is_awaiting_approval": "Mulțumim, postarea ta este în curs de verificare.",
"sorry_couldnt_find_a_title": "Ai uitat oare să specifici un titlu?",
"please_fill_in_an_url_first": "Trebuie să specifici un URL/Link!",
// Post item
"share": "Share",
"discuss": "Comentarii",
"upvote_": "Votează",
"sticky": "Actual",
"status": "Status",
"votes": "Voturi",
"basescore": "Scor de bază",
"score": "Punctaj",
"clicks": "Click-uri",
"views": "Afișări",
"inactive": "Inactiv",
"comment": "Comentariu",
"comments": "Comentarii",
"point": "Punct",
"points": "Puncte",
//User
"please_complete_your_profile_below_before_continuing": "Te rugăm să completezi toate datele înainte de a trece mai departe.",
"account": "Profil",
"username": "Nume utilizator",
"display_name": "Nume afișat public",
"email": "Email",
"bio": "Despre tine",
"password": "Parola",
"change_password": "Schimbă parola?",
"old_password": "Parola veche",
"new_password": "Parola nouă",
"email_notifications": "Notificări prin email",
"new_posts": "Postări noi",
"comments_on_my_posts": "Comentarii la postările mele",
"replies_to_my_comments": "Răspunsuri la postările mele",
"forgot_password": "Ați uitat parola?",
"profile_updated": "Profilul a fost actualizat",
"please_fill_in_your_email_below_to_finish_signing_up": "Vă rugăm treceți adresa de email pentru a finaliza înregistrarea.",
"invite": "Invație",
"uninvite": "Retrage invitația",
"make_admin": "Promovează ca administrator",
"unadmin": "Retrage dreptul de administrator",
"delete_user": "Șterge utilizator",
"are_you_sure_you_want_to_delete": "Ești sigur că vrei să ștergi următoarele: ",
"reset_password": "Resetează parola",
"password_reset_link_sent": "Un link pentru resetarea parolei tocmai a fost trimis!",
"name": "Nume",
"posts": "Postări",
"comments_": "Comentarii",
"karma": "Karma",
"is_invited": "Este invitat?",
"is_admin": "Este administrator?",
"delete": "Șterge",
"member_since": "Vechime",
"edit_profile": "Editează profilul",
"sign_in": "Logare",
"sign_in_": "Logare!",
"sign_up_": "Înregistrare!",
"dont_have_an_account": "Nu ești înregistrat?",
"already_have_an_account": "Ești deja înregistrat?",
"sign_up": "Înregistrează-te",
"please_fill_in_all_fields": "Te rugăm să completezi toate câmpurile necesare.",
"invite_": "Invitați(i) ",
"left": " rămase",
"invite_none_left": "Număr de invitații epuizat",
"all": "Toți",
"invited": "cei invitați",
"uninvited": "cei neinvitați",
"filter_by": "Filtreză după",
"sort_by": "Sorteză după",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Ne pare rău, dar nu ai acces la acestă pagină",
"please_sign_in_first": "Este nevoie să te autentifici.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Ne pare rău, trebuie să ai drepturi de administrare pentru a accesa această pagină.",
"sorry_you_dont_have_permissions_to_add_new_items": "Ne pare rău, nu ai drepturi de a adăuga înregistrări.",
"sorry_you_cannot_edit_this_post": "Ne pare rău, nu poți edita această postare.",
"sorry_you_cannot_edit_this_comment": "Ne pare rău, nu poți edita aceast comentariu.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Trebuie să fi autentificat și să ai drepturi de administrare pentru a adăuga noi categorii.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Trebuie să fi autentificat și să ai drepturi de administrare pentru a adăuga comentarii.",
"please_wait": "Te rugăm să aștepți ",
"seconds_before_commenting_again": " Secunde, până vei putea adăuga comentarii.",
"your_comment_is_empty": "Comentariul nu conține nici un text.",
"you_dont_have_permission_to_delete_this_comment": "Nu ai drepturi de a șterge acest comentariu.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Trebuie să fi autentificat sau invitat pentru a putea posta.",
"please_fill_in_a_headline": "Te rugăm să introduci un titlu",
"this_link_has_already_been_posted": "Acest link a fost deja publicat",
"sorry_you_cannot_submit_more_than": "Ne pare rău insă nu poți publica mai mult de ",
"posts_per_day": " postări pe zi",
"someone_replied_to_your_comment_on": "Cineva a lăsat un comentariu la",
"has_replied_to_your_comment_on": " a răspuns la comentariul tău la",
"read_more": "mai mult",
"a_new_comment_on_your_post": "Un nou comentariu la postarea ta",
"you_have_a_new_comment_by": "Ai un nou comentariu de la ",
"on_your_post": " la postarea ta",
"has_created_a_new_post": " a publicat o nouă postare",
"your_account_has_been_approved": "Profilul tău a fost activat.",
"welcome_to": "Bine ai venit ",
"start_posting": "Poți începe să publici.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Te rugăm să alegi un titlu",
"seconds_before_posting_again": " secunde până să poți publica iar",
"upvoted": "Votat",
"posted_date": "Data Postării",
"posted_time": "Ora Postării",
"posted_date": "Data Postării",
"posted_time": "Ora Postării",
"profile": "Profil",
"sign_out": "De-logare",
"invitedcount": "Număr de invitați",
"invites": "Invitații trimise",
"invited": "Invitat de",
"admin": "Admin",
"actions": "Actiuni",
"invites_left": "invitații rămase",
"id": "ID",
"name": "Nume:",
"bio": "Despre:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Postări promvate",
"downvoted_posts": "Postări în trend",
"mark_as_read": "Postări contra trend-ului",
//Common
"pending": "în așteptare",
"loading": "se âncarcă...",
"submit": "Trimite",
"you_must_be_logged_in": "Trebuie să fi autentificat.",
"are_you_sure": "Ești sigur?",
"please_log_in_first": "Te rugăm să te autentifici mai întâi",
"sign_in_sign_up_with_twitter": "Autentificare/Înregistrare cu Twitter",
"load_more": "Afișează noutăți"
}

View file

@ -25,7 +25,7 @@
"upvote": "1",
"downvote": "-1",
"link": "link",
"edit": "Ayarla",
"edit": "Düzenle",
"reply": "Cevap",
"no_comments": "Yorum yok",
@ -35,8 +35,8 @@
"thanks_for_signing_up": "Kayıt olduğunuz için teşekkür ederiz",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "Bu site sadece davetliler için ama bir yer açılınca size haber vereceğiz",
"sorry_you_dont_have_the_rights_to_view_this_page": "Özür dileriz, bu sayfaya erişiminiz yok",
"not_found": "Bulunmadı!",
"ere_sorry_whatever_you_were_looking_for_isnt_here": "Özür dileriz, neye bakıyorsanız burada değil..",
"not_found": "Bulunamadı!",
"ere_sorry_whatever_you_were_looking_for_isnt_here": "Özür dileriz, aradığınız şey burada değil.",
//Notifications
"no_notifications": "Bildirim yok",
@ -61,7 +61,7 @@
"submission_time": "Yayın zamanı",
"date": "Tarih",
"submission": "Yayın",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Bu paylaşım hala onay bekliyor, onun için yayın tarihi yok",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Bu paylaşım hala onay bekliyor, bu nedenle henüz yayın tarihi yok",
"user": "Kullanıcı",
"status": "Durum",
"approved": "Onaylandı",
@ -104,11 +104,11 @@
"replies_to_my_comments": "Yorumlarıma cevaplar",
"forgot_password": "Şifreyi unuttunuz mu?",
"profile_updated": "Profil güncellendi",
"please_fill_in_your_email_below_to_finish_signing_up": "Lütfen kaydınızı tamamlamak için aşağıya e-postanızı giriniz",
"please_fill_in_your_email_below_to_finish_signing_up": "Lütfen kaydınızı tamamlamak için aşağıya e-posta adresinizi giriniz",
"invite": "Davet et",
"uninvite": "Daveti geri al",
"make_admin": "Admin yap",
"unadmin": "Admini kaldır",
"unadmin": "Adminliği kaldır",
"delete_user": "Kullanıcıyı sil",
"are_you_sure_you_want_to_delete": "Silmek istediğinize emin misiniz?",
"reset_password": "Şifreyi sıfırla",
@ -139,10 +139,10 @@
"sort_by": "Sıralama kıstası",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Özür dileriz, bu sayfaya erişiminiz yok",
"sorry_you_do_not_have_access_to_this_page": "Özür dileriz, bu sayfaya erişim izniniz yok",
"please_sign_in_first": "Lütfen önce giriş yapın",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Özür dileriz, sadece adminler bu sayfayı görebilir",
"sorry_you_dont_have_permissions_to_add_new_items": "Özür dileriz, yeni birşeyler eklemeye yetkiniz yok",
"sorry_you_dont_have_permissions_to_add_new_items": "Özür dileriz, yeni bir şeyler eklemeye yetkiniz yok",
"sorry_you_cannot_edit_this_post": "Özür dileriz, bu paylaşımı değiştiremezsiniz",
"sorry_you_cannot_edit_this_comment": "Özür dileriz, bu yorumu değiştiremezsiniz",
@ -150,19 +150,19 @@
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Yeni kategori eklemek için admin olarak giriş yapmanız lazım",
"you_need_to_login_or_be_invited_to_post_new_comments": "Yorum yapmak için giriş yapmanız veya davet edilmeniz lazım",
"please_wait": "Lütfen bekleyin ",
"seconds_before_commenting_again": " saniye daha beklemiz lazım tekrar yorum yapmadan önce",
"seconds_before_commenting_again": " saniye daha beklemeniz lazım tekrar yorum yapmadan önce",
"your_comment_is_empty": "Yorumunuz boş",
"you_dont_have_permission_to_delete_this_comment": "Bu yorumu silmek için izniniz yok",
"you_need_to_login_or_be_invited_to_post_new_stories": "Paylaşım yapmak için giriş yapmanız veya davet edilmeniz lazım",
"you_need_to_login_or_be_invited_to_post_new_stories": "Paylaşım yapmak için giriş yapmanız ya da davet edilmiş olmanız lazım",
"please_fill_in_a_headline": "Lütfen bir başlık girin",
"this_link_has_already_been_posted": "Bu bağlantı daha önce paylaşılmıştı",
"sorry_you_cannot_submit_more_than": "Özür dileriz, bundan daha fazla paylaşamazsınız ",
"sorry_you_cannot_submit_more_than": "Özür dileriz, bu sayıdan daha fazla paylaşamazsınız: ",
"posts_per_day": " paylaşım / gün",
"someone_replied_to_your_comment_on": "Birisi yorumunuza cevap verdi şu konu hakkında",
"has_replied_to_your_comment_on": " yorumunuza cevap verdi şu konu hakkında",
"someone_replied_to_your_comment_on": "Birisi yorumunuza cevap verdi şu konu hakkında: ",
"has_replied_to_your_comment_on": " yorumunuza cevap verdi şu konu hakkında:",
"read_more": "Daha fazla oku",
"a_new_comment_on_your_post": "Yeni bir yorum paylaşımınızda",
"you_have_a_new_comment_by": "Yeni bir yorum geldi ",
"a_new_comment_on_your_post": "Şu paylaşımınıza yeni bir yorum yapıldı: ",
"you_have_a_new_comment_by": "Şu kişiden yeni bir yorum aldınız: ",
"on_your_post": " paylaşımınızda",
"has_created_a_new_post": " yeni bir paylaşım yaptı",
"your_account_has_been_approved": "Hesabınız onaylandı",
@ -171,7 +171,7 @@
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "Lütfen bir başlık girin",
"seconds_before_posting_again": " saniye kaldı bir paylaşım daha yapmadan önce",
"seconds_before_posting_again": " saniye daha beklemeniz lazım tekrar paylaşım yapmadan önce",
"upvoted": "Yukarı oylandı",
"posted_date": "Paylaşım Tarihi",
"posted_time": "Paylaşım Zamanı",
@ -188,9 +188,9 @@
"bio": "Bio:",
"github": "GitHub",
"site": "Site",
"upvoted_posts": "Yukarı oy alan paylaşımlar",
"upvoted_posts": "Yukarı oy alan paylaşımlar",
"downvoted_posts": "Aşağı oy alan paylaşımlar",
"mark_as_read": "Okundu gibi işaretle",
"mark_as_read": "Okundu olarak işaretle",
//Common
@ -200,7 +200,7 @@
"you_must_be_logged_in": "Giriş yapmanız lazım",
"are_you_sure": "Emin misiniz?",
"please_log_in_first": "Lütfen önce giriş yapın",
"sign_in_sign_up_with_twitter": "Twitter ile kayıt ol/ giriş yap",
"load_more": "Daha Fazla yükle"
"sign_in_sign_up_with_twitter": "Twitter ile kayıt ol/giriş yap",
"load_more": "Daha fazla yükle"
}

301
i18n/vn.i18n.json Normal file
View file

@ -0,0 +1,301 @@
{
//Navigation
"menu": "Danh mục",
"view": "Xem",
"top": "Top",
"new": "New",
"best": "Best",
"digest": "Digest",
"users": "Người dùng",
"settings": "Settings",
"admin": "Admin",
"post": "Bài",
"toolbox": "Toolbox",
"sign_up_sign_in": "Đăng ký/Đăng nhập",
"my_account": "Tài khoản",
"view_profile": "Xem hồ sơ",
"edit_account": "Chỉnh sửa",
//Main
"new_posts": "Bài mới",
// Settings Schema
"title": "Tiêu đề",
"siteUrl": "Địa chỉ URL",
"tagline": "Tagline",
"requireViewInvite": "Require Invite to View",
"requirePostInvite": "Require Invite to Post",
"requirePostsApproval": "Require Posts to be Approved",
"defaultEmail": "Default Email",
"scoreUpdateInterval": "Score Update Interval",
"defaultView": "Default View",
"postInterval": "Post Interval",
"commentInterval": "Comment Interval",
"maxPostsPerDay": "Max Posts Per Day",
"startInvitesCount": "Invites Start Count",
"postsPerPage": "Posts Per Page",
"logoUrl": "Logo URL",
"logoHeight": "Logo Height",
"logoWidth": "Logo Width",
"language": "Language",
"backgroundCSS": "Background CSS",
"buttonColor": "Button Color",
"buttonTextColor": "Button Text Color",
"headerColor": "Header Color",
"headerTextColor": "Header Text Color",
"twitterAccount": "Twitter Account",
"googleAnalyticsId": "Google Analytics ID",
"mixpanelId": "Mixpanel ID",
"clickyId": "Clicky ID",
"footerCode": "Footer Code",
"extraCode": "Extra Code",
"emailFooter": "Email Footer",
"notes": "Notes",
"debug": "Debug Mode",
// Settings Fieldsets
"general": "General",
"invites": "Invites",
"email": "Email",
"scoring": "Scoring",
"posts": "Posts",
"comments": "Comments",
"logo": "Logo",
"extras": "Extras",
"colors": "Colors",
"integrations": "Integrations",
// Settings Help Text
// Post Schema
"createdAt": "Tạo lúc",
"postedAt": "Đăng lúc",
"url": "URL",
"title": "Tiêu đề",
"body": "Nội dung",
"htmlBody": "HTML Body",
"viewCount": "Số lần xem",
"commentCount": "Số lần bình luận",
"commenters": "Bình luận",
"lastCommentedAt": "Bình luận lúc",
"clickCount": "Click Count",
"baseScore": "Base Score",
"upvotes": "Upvotes",
"upvoters": "Upvoters",
"downvotes": "Downvotes",
"downvoters": "Downvoters",
"score": "Score",
"status": "Status",
"sticky": "Sticky",
"inactive": "Inactive",
"author": "Author",
"userId": "User",
"sorry_we_couldnt_find_any_posts": "Xin lỗi, thông tin không được tìm thấy.",
//Commments
"your_comment_has_been_deleted": "Ý kiến của bạn đã được xóa.",
"comment_": "Ý kiến",
"delete_comment": "Xóa ý kiến",
"add_comment": "Thêm ý kiến",
"upvote": "Thích",
"downvote": "Không thích",
"link": "link",
"edit": "Sửa",
"reply": "Trả lời",
"no_comments": "Không ý kiến.",
//Errors
"you_are_already_logged_in": "Bạn đã đăng nhập",
"sorry_this_is_a_private_site_please_sign_up_first": "Xin lỗi, bạn cần đăng ký để xem thông tin.",
"thanks_for_signing_up": "Cám ơn bạn đã đăng ký!",
"the_site_is_currently_invite_only_but_we_will_let_you_know_as_soon_as_a_spot_opens_up": "Trang này hiện chỉ dùng cho những người được mời, chúng tôi sẽ cho bạn biết khi sẵn sàng.",
"sorry_you_dont_have_the_rights_to_view_this_page": "Xin lỗi, bạn không có quyền để xem trang này.",
"sorry_you_do_not_have_the_rights_to_comments": "Xin lỗi, hiện tại bạn không có quyền để đăng ý kiến.",
"not_found": "Không tìm thấy!",
"were_sorry_whatever_you_were_looking_for_isnt_here": "Chúng tôi xin lỗi vì không có thông tin bạn đang tìm kiếm...",
//Notifications
"no_notifications": "Không có thông báo",
"1_notification": "1 thông báo",
"notifications": "Thông báo",
"mark_all_as_read": "Đánh dấu đã đọc",
// Post deleted
"your_post_has_been_deleted": "Bài của bạn đã được xóa.",
// Post submit & edit
"created": "Tạo",
"title": "Tiêu đề",
"suggest_title": "Gợi ý tiêu đề",
"url": "URL",
"short_url": "URL ngắn",
"body": "Nội dung",
"category": "Loại",
"inactive_": "Ngừng kích hoạt?",
"sticky_": "Sticky?",
"submission_date": "Ngày đăng",
"submission_time": "Giờ đăng",
"date": "Ngày",
"submission": "Đăng",
"note_this_post_is_still_pending_so_it_has_no_submission_timestamp_yet": "Lưu ý: bài này đang đợi xét duyệt nên chưa có thời gian đăng bài.",
"user": "Người dùng",
"status_": "Trạng thái",
"approved": "Đồng ý",
"rejected": "Từ chối",
"delete_post": "Xóa bài",
"thanks_your_post_is_awaiting_approval": "Cảm ơn, bài của bạn đang đợi phê duyệt.",
"sorry_couldnt_find_a_title": "Xin lỗi, không có tiêu đề...",
"please_fill_in_an_url_first": "Làm ơn nhập địa chỉ website!",
// Post item
"share": "Chia sẻ",
"discuss": "Bình luận",
"upvote_": "Thích",
"sticky": "Sticky",
"status": "trạng thái",
"votes": "phiếu",
"basescore": "baseScore",
"score": "điểm",
"clicks": "clicks",
"views": "xem",
"inactive": "inactive",
"comment": "ý kiến",
"comments": "ý kiến",
"point": "điểm",
"points": "điểm",
//User /client/views/users/account/user_account.html
"please_complete_your_profile_below_before_continuing": "Xin điền thông tin hồ sơ của bạn để tiếp tục.",
"account": "Tài khoản",
"username": "Tên đăng nhập",
"display_name": "Tên xuất hiện",
"email": "Email",
"bio": "Bio",
"twitter_username": "Tài khoản Twitter",
"github_username": "Tài khoản GitHub",
"site_url" : "Địa chỉ website",
"password": "Mật khẩu",
"change_password": "Thay đổi mật khẩu?",
"old_password": "Mật khẩu cũ",
"new_password": "Mật khẩu mới",
"email_notifications": "Email thông báo",
"new_users" : "Người dùng mới",
"new_posts": "Bài mới",
"comments_on_my_posts": "Bình luận trên bài của tôi",
"replies_to_my_comments": "Trả lời ý kiến của tôi",
"forgot_password": "Quyên mật khẩu?",
"profile_updated": "Cập nhật hồ sơ",
"please_fill_in_your_email_below_to_finish_signing_up": "Xin nhập email của bạn dưới đây để hoàn thành việc đăng ký.",
"invite": "Mời",
"uninvite": "Không mời",
"make_admin": "Thiết lập Admin",
"unadmin": "Ngắt Admin",
"delete_user": "Xóa người dùng",
"are_you_sure_you_want_to_delete": "Bạn có chắc muốn xóa?",
"reset_password": "Thiết lập lại mật khẩu",
"password_reset_link_sent": "Mật khẩu đã được gửi!",
"name": "Tên",
"posts": "Bài",
"comments_": "Ý kiến",
"karma": "Karma",
"is_invited": "Được mời?",
"is_admin": "Admin?",
"delete": "Xóa",
"member_since": "Thành viên từ",
"edit_profile": "Sửa hồ sơ",
"sign_in": "Đăng nhập",
"sign_in_": "Đăng nhập!",
"sign_up_": "Đăng ký!",
"dont_have_an_account": "Bạn không có tài khoản?",
"already_have_an_account": "Bạn đã có tài khoản?",
"sign_up": "Đăng ký",
"please_fill_in_all_fields": "Nhập thông tin",
"invite_": "Mời ",
"left": " left",
"invite_none_left": "Invite (none left)",
"all": "Tất cả",
"invited": "Mời",
"uninvited": "Không mời",
"filter_by": "Lọc theo",
"sort_by": "Sắp xếp theo",
//helpers
"sorry_you_do_not_have_access_to_this_page": "Xin lỗi, bạn không có quyền truy cập vào trang này",
"please_sign_in_first": "Xin đăng nhập trước.",
"sorry_you_have_to_be_an_admin_to_view_this_page": "Xin lỗi, bản phải có quyền Admin để xem trang này.",
"sorry_you_dont_have_permissions_to_add_new_items": "Xin lỗi, bạn không có quyền thêm.",
"sorry_you_cannot_edit_this_post": "Xin lỗi, bạn không thể sửa bài này.",
"sorry_you_cannot_edit_this_comment": "Xin lỗi, bạn không thể sửa ý kiến này.",
//Collections
"you_need_to_login_and_be_an_admin_to_add_a_new_category": "Bạn phải đăng nhập và là Admin để tạo thẻ.",
"you_need_to_login_or_be_invited_to_post_new_comments": "Bạn phải đăng nhập và được mời để đăng ý kiến.",
"please_wait": "Làm ơn đợi ",
"seconds_before_commenting_again": " một vài giây để đăng ý kiến tiếp",
"your_comment_is_empty": "Xin nhập ý kiến.",
"you_dont_have_permission_to_delete_this_comment": "Bạn không có quyền để xóa ý kiến này.",
"you_need_to_login_or_be_invited_to_post_new_stories": "Bạn phải đăng nhập và được mời để đăng bài mới.",
"please_fill_in_a_headline": "Xin nhập thông tin",
"this_link_has_already_been_posted": "Đường dẫn này đã được đăng",
"sorry_you_cannot_submit_more_than": "Xin lỗi, bạn không thể đăng nhiều hơn ",
"posts_per_day": " bài mỗi ngày",
"someone_replied_to_your_comment_on": "Có người trả lời ý kiến của bạn",
"has_replied_to_your_comment_on": " đã trả lời ý kiến của bạn",
"read_more": "Xem tiếp",
"a_new_comment_on_your_post": "Có ý kiến mới trên bài của bạn",
"you_have_a_new_comment_by": "Bạn có ý kiến mới bởi ",
"on_your_post": " trên bài của bạn",
"has_created_a_new_post": " đã bạo bài mới",
"your_account_has_been_approved": "Tài khoản của bạn đã được đồng ý.",
"welcome_to": "Xin chào ",
"start_posting": "Bắt đầu đăng bài.",
// Translation needed (found during migration to tap:i18n)
"please_fill_in_a_title": "xin nhập tiêu đề",
"seconds_before_posting_again": " một vài giây để đăng lại",
"upvoted": "Thích",
"posted_date": "Ngày đăng",
"posted_time": "Giờ đăng",
"posted_date": "Ngày đăng",
"posted_time": "Giờ đăng",
"profile": "Hồ sơ",
"sign_out": "Đăng xuất",
"you_ve_been_signed_out": "Bạn đã đăng xuất, hẹn sớm gặp lại",
"invitedcount": "đếmMoi",
"invites": "Mời",
"invited": "Được mời?",
"admin": "Admin",
"actions": "Actions",
"invites_left": "invites left",
"id": "ID",
"name": "Tên:",
"bio": "Bio:",
"github": "GitHub",
"site": "website",
"upvoted_posts": "Thích bài",
"downvoted_posts": "Không thích bài",
"mark_as_read": "Đã đọc",
//Common
"pending": "Pending",
"loading": "Tải...",
"submit": "Gửi",
"you_must_be_logged_in": "Bạn phải đăng nhập.",
"are_you_sure": "Bạn có chắn?",
"please_log_in_first": "Xin đăng nhập trước.",
"please_log_in_to_comment": "Đăng nhập để bình luận",
"sign_in_sign_up_with_twitter": "Đăng ký/Đăng nhập với Twitter",
"load_more": "Xem thêm",
"most_popular_posts": "Những bài được xem nhiều nhất",
"newest_posts": "Những bài mới nhất.",
"highest_ranked_posts_ever": "Những bài được thích nhất.",
"the_profile_of": "Hồ sơ của",
"posts_awaiting_moderation": "Bài đang đợi để sửa",
"future_scheduled_posts": "Bài đăng theo lịch",
"users_dashboard": "Bảng người dùng.",
"telescope_settings_panel": "Bản thiết lập Telescope.",
"various_utilities": "Một số tiện ích."
}

Some files were not shown because too many files have changed in this diff Show more