diff --git a/app/lang/nb_NO/pagination.php b/app/lang/nb_NO/pagination.php
new file mode 100644
index 000000000000..c57908251668
--- /dev/null
+++ b/app/lang/nb_NO/pagination.php
@@ -0,0 +1,20 @@
+ '« Tilbake',
+
+ 'next' => 'Neste »',
+
+);
\ No newline at end of file
diff --git a/app/lang/nb_NO/reminders.php b/app/lang/nb_NO/reminders.php
new file mode 100644
index 000000000000..1859730c720c
--- /dev/null
+++ b/app/lang/nb_NO/reminders.php
@@ -0,0 +1,24 @@
+ "Passord må være minst seks tegn og samsvare med bekreftelsen.",
+
+ "user" => "Vi kan ikke finne en bruker med den e-postadressen.",
+
+ "token" => "Denne tilbakestillingsnøkkelen er ugyldig.",
+
+ "sent" => "Passord påminnelse sendt!",
+
+);
\ No newline at end of file
diff --git a/app/lang/nb_NO/texts.php b/app/lang/nb_NO/texts.php
new file mode 100644
index 000000000000..a5b919fff342
--- /dev/null
+++ b/app/lang/nb_NO/texts.php
@@ -0,0 +1,423 @@
+ 'Organization',
+ 'name' => 'Name',
+ 'website' => 'Website',
+ 'work_phone' => 'Phone',
+ 'address' => 'Address',
+ 'address1' => 'Street',
+ 'address2' => 'Apt/Suite',
+ 'city' => 'City',
+ 'state' => 'State/Province',
+ 'postal_code' => 'Postal Code',
+ 'country_id' => 'Country',
+ 'contacts' => 'Contacts',
+ 'first_name' => 'First Name',
+ 'last_name' => 'Last Name',
+ 'phone' => 'Phone',
+ 'email' => 'Email',
+ 'additional_info' => 'Additional Info',
+ 'payment_terms' => 'Payment Terms',
+ 'currency_id' => 'Currency',
+ 'size_id' => 'Size',
+ 'industry_id' => 'Industry',
+ 'private_notes' => 'Private Notes',
+
+ // invoice
+ 'invoice' => 'Invoice',
+ 'client' => 'Client',
+ 'invoice_date' => 'Invoice Date',
+ 'due_date' => 'Due Date',
+ 'invoice_number' => 'Invoice Number',
+ 'invoice_number_short' => 'Invoice #',
+ 'po_number' => 'PO Number',
+ 'po_number_short' => 'PO #',
+ 'frequency_id' => 'How often',
+ 'discount' => 'Discount',
+ 'taxes' => 'Taxes',
+ 'tax' => 'Tax',
+ 'item' => 'Item',
+ 'description' => 'Description',
+ 'unit_cost' => 'Unit Cost',
+ 'quantity' => 'Quantity',
+ 'line_total' => 'Line Total',
+ 'subtotal' => 'Subtotal',
+ 'paid_to_date' => 'Paid to Date',
+ 'balance_due' => 'Balance Due',
+ 'invoice_design_id' => 'Design',
+ 'terms' => 'Terms',
+ 'your_invoice' => 'Your Invoice',
+
+ 'remove_contact' => 'Remove contact',
+ 'add_contact' => 'Add contact',
+ 'create_new_client' => 'Create new client',
+ 'edit_client_details' => 'Edit client details',
+ 'enable' => 'Enable',
+ 'learn_more' => 'Learn more',
+ 'manage_rates' => 'Manage rates',
+ 'note_to_client' => 'Note to client',
+ 'invoice_terms' => 'Invoice terms',
+ 'save_as_default_terms' => 'Save as default terms',
+ 'download_pdf' => 'Download PDF',
+ 'pay_now' => 'Pay Now',
+ 'save_invoice' => 'Save Invoice',
+ 'clone_invoice' => 'Clone Invoice',
+ 'archive_invoice' => 'Archive Invoice',
+ 'delete_invoice' => 'Delete Invoice',
+ 'email_invoice' => 'Email Invoice',
+ 'enter_payment' => 'Enter Payment',
+ 'tax_rates' => 'Tax Rates',
+ 'rate' => 'Rate',
+ 'settings' => 'Settings',
+ 'enable_invoice_tax' => 'Enable specifying an invoice tax',
+ 'enable_line_item_tax' => 'Enable specifying line item taxes',
+
+ // navigation
+ 'dashboard' => 'Dashboard',
+ 'clients' => 'Clients',
+ 'invoices' => 'Invoices',
+ 'payments' => 'Payments',
+ 'credits' => 'Credits',
+ 'history' => 'History',
+ 'search' => 'Search',
+ 'sign_up' => 'Sign Up',
+ 'guest' => 'Guest',
+ 'company_details' => 'Company Details',
+ 'online_payments' => 'Online Payments',
+ 'notifications' => 'Notifications',
+ 'import_export' => 'Import/Export',
+ 'done' => 'Done',
+ 'save' => 'Save',
+ 'create' => 'Create',
+ 'upload' => 'Upload',
+ 'import' => 'Import',
+ 'download' => 'Download',
+ 'cancel' => 'Cancel',
+ 'close' => 'Close',
+ 'provide_email' => 'Please provide a valid email address',
+ 'powered_by' => 'Powered by',
+ 'no_items' => 'No items',
+
+ // recurring invoices
+ 'recurring_invoices' => 'Recurring Invoices',
+ 'recurring_help' => '
Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually.
+ Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.
+ Examples of dynamic invoice variables:
+
+ - "Gym membership for the month of :MONTH" => "Gym membership for the month of July"
+ - ":YEAR+1 yearly subscription" => "2015 Yearly Subscription"
+ - "Retainer payment for :QUARTER+1" => "Retainer payment for Q2"
+
',
+
+ // dashboard
+ 'in_total_revenue' => 'in total revenue',
+ 'billed_client' => 'billed client',
+ 'billed_clients' => 'billed clients',
+ 'active_client' => 'active client',
+ 'active_clients' => 'active clients',
+ 'invoices_past_due' => 'Invoices Past Due',
+ 'upcoming_invoices' => 'Upcoming invoices',
+ 'average_invoice' => 'Average invoice',
+
+ // list pages
+ 'archive' => 'Archive',
+ 'delete' => 'Delete',
+ 'archive_client' => 'Archive client',
+ 'delete_client' => 'Delete client',
+ 'archive_payment' => 'Archive payment',
+ 'delete_payment' => 'Delete payment',
+ 'archive_credit' => 'Archive credit',
+ 'delete_credit' => 'Delete credit',
+ 'show_archived_deleted' => 'Show archived/deleted',
+ 'filter' => 'Filter',
+ 'new_client' => 'New Client',
+ 'new_invoice' => 'New Invoice',
+ 'new_payment' => 'New Payment',
+ 'new_credit' => 'New Credit',
+ 'contact' => 'Contact',
+ 'date_created' => 'Date Created',
+ 'last_login' => 'Last Login',
+ 'balance' => 'Balance',
+ 'action' => 'Action',
+ 'status' => 'Status',
+ 'invoice_total' => 'Invoice Total',
+ 'frequency' => 'Frequency',
+ 'start_date' => 'Start Date',
+ 'end_date' => 'End Date',
+ 'transaction_reference' => 'Transaction Reference',
+ 'method' => 'Method',
+ 'payment_amount' => 'Payment Amount',
+ 'payment_date' => 'Payment Date',
+ 'credit_amount' => 'Credit Amount',
+ 'credit_balance' => 'Credit Balance',
+ 'credit_date' => 'Credit Date',
+ 'empty_table' => 'No data available in table',
+ 'select' => 'Select',
+ 'edit_client' => 'Edit Client',
+ 'edit_invoice' => 'Edit Invoice',
+
+ // client view page
+ 'create_invoice' => 'Create Invoice',
+ 'enter_credit' => 'Enter Credit',
+ 'last_logged_in' => 'Last logged in',
+ 'details' => 'Details',
+ 'standing' => 'Standing',
+ 'credit' => 'Credit',
+ 'activity' => 'Activity',
+ 'date' => 'Date',
+ 'message' => 'Message',
+ 'adjustment' => 'Adjustment',
+ 'are_you_sure' => 'Are you sure?',
+
+ // payment pages
+ 'payment_type_id' => 'Payment type',
+ 'amount' => 'Amount',
+
+ // account/company pages
+ 'work_email' => 'Email',
+ 'language_id' => 'Language',
+ 'timezone_id' => 'Timezone',
+ 'date_format_id' => 'Date format',
+ 'datetime_format_id' => 'Date/Time Format',
+ 'users' => 'Users',
+ 'localization' => 'Localization',
+ 'remove_logo' => 'Remove logo',
+ 'logo_help' => 'Supported: JPEG, GIF and PNG. Recommended size: 200px width by 120px height',
+ 'payment_gateway' => 'Payment Gateway',
+ 'gateway_id' => 'Provider',
+ 'email_notifications' => 'Email Notifications',
+ 'email_sent' => 'Email me when an invoice is sent',
+ 'email_viewed' => 'Email me when an invoice is viewed',
+ 'email_paid' => 'Email me when an invoice is paid',
+ 'site_updates' => 'Site Updates',
+ 'custom_messages' => 'Custom Messages',
+ 'default_invoice_terms' => 'Set default invoice terms',
+ 'default_email_footer' => 'Set default email signature',
+ 'import_clients' => 'Import Client Data',
+ 'csv_file' => 'Select CSV file',
+ 'export_clients' => 'Export Client Data',
+ 'select_file' => 'Please select a file',
+ 'first_row_headers' => 'Use first row as headers',
+ 'column' => 'Column',
+ 'sample' => 'Sample',
+ 'import_to' => 'Import to',
+ 'client_will_create' => 'client will be created',
+ 'clients_will_create' => 'clients will be created',
+
+ // application messages
+ 'created_client' => 'Successfully created client',
+ 'created_clients' => 'Successfully created :count clients',
+ 'updated_settings' => 'Successfully updated settings',
+ 'removed_logo' => 'Successfully removed logo',
+ 'sent_message' => 'Successfully sent message',
+ 'invoice_error' => 'Please make sure to select a client and correct any errors',
+ 'limit_clients' => 'Sorry, this will exceed the limit of :count clients',
+ 'payment_error' => 'There was an error processing your payment. Please try again later.',
+ 'registration_required' => 'Please sign up to email an invoice',
+ 'confirmation_required' => 'Please confirm your email address',
+
+ 'updated_client' => 'Successfully updated client',
+ 'created_client' => 'Successfully created client',
+ 'archived_client' => 'Successfully archived client',
+ 'archived_clients' => 'Successfully archived :count clients',
+ 'deleted_client' => 'Successfully deleted client',
+ 'deleted_clients' => 'Successfully deleted :count clients',
+
+ 'updated_invoice' => 'Successfully updated invoice',
+ 'created_invoice' => 'Successfully created invoice',
+ 'cloned_invoice' => 'Successfully cloned invoice',
+ 'emailed_invoice' => 'Successfully emailed invoice',
+ 'and_created_client' => 'and created client',
+ 'archived_invoice' => 'Successfully archived invoice',
+ 'archived_invoices' => 'Successfully archived :count invoices',
+ 'deleted_invoice' => 'Successfully deleted invoice',
+ 'deleted_invoices' => 'Successfully deleted :count invoices',
+
+ 'created_payment' => 'Successfully created payment',
+ 'archived_payment' => 'Successfully archived payment',
+ 'archived_payments' => 'Successfully archived :count payments',
+ 'deleted_payment' => 'Successfully deleted payment',
+ 'deleted_payments' => 'Successfully deleted :count payments',
+ 'applied_payment' => 'Successfully applied payment',
+
+ 'created_credit' => 'Successfully created credit',
+ 'archived_credit' => 'Successfully archived credit',
+ 'archived_credits' => 'Successfully archived :count credits',
+ 'deleted_credit' => 'Successfully deleted credit',
+ 'deleted_credits' => 'Successfully deleted :count credits',
+
+ // Emails
+ 'confirmation_subject' => 'Invoice Ninja Account Confirmation',
+ 'confirmation_header' => 'Account Confirmation',
+ 'confirmation_message' => 'Please access the link below to confirm your account.',
+ 'invoice_subject' => 'New invoice from :account',
+ 'invoice_message' => 'To view your invoice for :amount, click the link below.',
+ 'payment_subject' => 'Payment Received',
+ 'payment_message' => 'Thank you for your payment of :amount.',
+ 'email_salutation' => 'Dear :name,',
+ 'email_signature' => 'Regards,',
+ 'email_from' => 'The InvoiceNinja Team',
+ 'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/company/notifications',
+ 'invoice_link_message' => 'To view your client invoice click the link below:',
+ 'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client',
+ 'notification_invoice_sent_subject' => 'Invoice :invoice was sent to :client',
+ 'notification_invoice_viewed_subject' => 'Invoice :invoice was viewed by :client',
+ 'notification_invoice_paid' => 'A payment of :amount was made by client :client towards Invoice :invoice.',
+ 'notification_invoice_sent' => 'The following client :client was emailed Invoice :invoice for :amount.',
+ 'notification_invoice_viewed' => 'The following client :client viewed Invoice :invoice for :amount.',
+ 'reset_password' => 'You can reset your account password by clicking the following link:',
+ 'reset_password_footer' => 'If you did not request this password reset please email our support: ' . CONTACT_EMAIL,
+
+
+ // Payment page
+ 'secure_payment' => 'Secure Payment',
+ 'card_number' => 'Card number',
+ 'expiration_month' => 'Expiration month',
+ 'expiration_year' => 'Expiration year',
+ 'cvv' => 'CVV',
+
+ // Security alerts
+ 'confide' => [
+ 'too_many_attempts' => 'Too many attempts. Try again in few minutes.',
+ 'wrong_credentials' => 'Incorrect email or password.',
+ 'confirmation' => 'Your account has been confirmed!',
+ 'wrong_confirmation' => 'Wrong confirmation code.',
+ 'password_forgot' => 'The information regarding password reset was sent to your email.',
+ 'password_reset' => 'Your password has been changed successfully.',
+ 'wrong_password_reset' => 'Invalid password. Try again',
+ ],
+
+ // Pro Plan
+ 'pro_plan' => [
+ 'remove_logo' => ':link to remove the Invoice Ninja logo by joining the Pro Plan',
+ 'remove_logo_link' => 'Click here',
+ ],
+
+ 'logout' => 'Log Out',
+ 'sign_up_to_save' => 'Sign up to save your work',
+ 'agree_to_terms' =>'I agree to the Invoice Ninja :terms',
+ 'terms_of_service' => 'Terms of Service',
+ 'email_taken' => 'The email address is already registered',
+ 'working' => 'Working',
+ 'success' => 'Success',
+ 'success_message' => 'You have succesfully registered. Please visit the link in the account confirmation email to verify your email address.',
+ 'erase_data' => 'This will permanently erase your data.',
+ 'password' => 'Password',
+
+ 'pro_plan_product' => 'Pro Plan',
+ 'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
+ 'pro_plan_success' => 'Thanks for choosing Invoice Ninja\'s Pro plan!
+ Next StepsA payable invoice has been sent to the email
+ address associated with your account. To unlock all of the awesome
+ Pro features, please follow the instructions on the invoice to pay
+ for a year of Pro-level invoicing.
+ Can\'t find the invoice? Need further assistance? We\'re happy to help
+ -- email us at contact@invoiceninja.com',
+
+ 'unsaved_changes' => 'You have unsaved changes',
+ 'custom_fields' => 'Custom fields',
+ 'company_fields' => 'Company Fields',
+ 'client_fields' => 'Client Fields',
+ 'field_label' => 'Field Label',
+ 'field_value' => 'Field Value',
+ 'edit' => 'Edit',
+ 'set_name' => 'Set your company name',
+ 'view_as_recipient' => 'View as recipient',
+
+ // product management
+ 'product_library' => 'Product Library',
+ 'product' => 'Product',
+ 'products' => 'Products',
+ 'fill_products' => 'Auto-fill products',
+ 'fill_products_help' => 'Selecting a product will automatically fill in the description and cost',
+ 'update_products' => 'Auto-update products',
+ 'update_products_help' => 'Updating an invoice will automatically update the product library',
+ 'create_product' => 'Create Product',
+ 'edit_product' => 'Edit Product',
+ 'archive_product' => 'Archive Product',
+ 'updated_product' => 'Successfully updated product',
+ 'created_product' => 'Successfully created product',
+ 'archived_product' => 'Successfully archived product',
+ 'pro_plan_custom_fields' => ':link to enable custom fields by joining the Pro Plan',
+
+ 'advanced_settings' => 'Advanced Settings',
+ 'pro_plan_advanced_settings' => ':link to enable the advanced settings by joining the Pro Plan',
+ 'invoice_design' => 'Invoice Design',
+ 'specify_colors' => 'Specify colors',
+ 'specify_colors_label' => 'Select the colors used in the invoice',
+
+ 'chart_builder' => 'Chart Builder',
+ 'ninja_email_footer' => 'Use :site to invoice your clients and get paid online for free!',
+ 'go_pro' => 'Go Pro',
+
+ // Quotes
+ 'quote' => 'Quote',
+ 'quotes' => 'Quotes',
+ 'quote_number' => 'Quote Number',
+ 'quote_number_short' => 'Quote #',
+ 'quote_date' => 'Quote Date',
+ 'quote_total' => 'Quote Total',
+ 'your_quote' => 'Your Quote',
+ 'total' => 'Total',
+ 'clone' => 'Clone',
+
+ 'new_quote' => 'New Quote',
+ 'create_quote' => 'Create Quote',
+ 'edit_quote' => 'Edit Quote',
+ 'archive_quote' => 'Archive Quote',
+ 'delete_quote' => 'Delete Quote',
+ 'save_quote' => 'Save Quote',
+ 'email_quote' => 'Email Quote',
+ 'clone_quote' => 'Clone Quote',
+ 'convert_to_invoice' => 'Convert to Invoice',
+ 'view_invoice' => 'View Invoice',
+ 'view_client' => 'View Client',
+ 'view_quote' => 'View Quote',
+
+ 'updated_quote' => 'Successfully updated quote',
+ 'created_quote' => 'Successfully created quote',
+ 'cloned_quote' => 'Successfully cloned quote',
+ 'emailed_quote' => 'Successfully emailed quote',
+ 'archived_quote' => 'Successfully archived quote',
+ 'archived_quotes' => 'Successfully archived :count quotes',
+ 'deleted_quote' => 'Successfully deleted quote',
+ 'deleted_quotes' => 'Successfully deleted :count quotes',
+ 'converted_to_invoice' => 'Successfully converted quote to invoice',
+
+ 'quote_subject' => 'New quote from :account',
+ 'quote_message' => 'To view your quote for :amount, click the link below.',
+ 'quote_link_message' => 'To view your client quote click the link below:',
+ 'notification_quote_sent_subject' => 'Quote :invoice was sent to :client',
+ 'notification_quote_viewed_subject' => 'Quote :invoice was viewed by :client',
+ 'notification_quote_sent' => 'The following client :client was emailed Quote :invoice for :amount.',
+ 'notification_quote_viewed' => 'The following client :client viewed Quote :invoice for :amount.',
+
+ 'session_expired' => 'Your session has expired.',
+
+ 'invoice_fields' => 'Invoice Fields',
+ 'invoice_options' => 'Invoice Options',
+ 'hide_quantity' => 'Hide quantity',
+ 'hide_quantity_help' => 'If your line items quantities are always 1, then you can declutter invoices by no longer displaying this field.',
+ 'hide_paid_to_date' => 'Hide paid to date',
+ 'hide_paid_to_date_help' => 'Only display the "Paid to Date" area on your invoices once a payment has been received.',
+
+ 'charge_taxes' => 'Charge taxes',
+ 'user_management' => 'User Management',
+ 'add_user' => 'Add User',
+ 'send_invite' => 'Send invitation',
+ 'sent_invite' => 'Successfully sent invitation',
+ 'updated_user' => 'Successfully updated user',
+ 'invitation_message' => 'You\'ve been invited by :invitor. ',
+ 'register_to_add_user' => 'Please sign up to add a user',
+ 'user_state' => 'State',
+ 'edit_user' => 'Edit User',
+ 'delete_user' => 'Delete User',
+ 'active' => 'Active',
+ 'pending' => 'Pending',
+ 'deleted_user' => 'Successfully deleted user',
+ 'limit_users' => 'Sorry, this will exceed the limit of ' . MAX_NUM_USERS . ' users',
+
+);
\ No newline at end of file
diff --git a/app/lang/nb_NO/validation.php b/app/lang/nb_NO/validation.php
new file mode 100644
index 000000000000..68b39c68af2f
--- /dev/null
+++ b/app/lang/nb_NO/validation.php
@@ -0,0 +1,102 @@
+ "The :attribute must be accepted.",
+ "active_url" => "The :attribute is not a valid URL.",
+ "after" => "The :attribute must be a date after :date.",
+ "alpha" => "The :attribute may only contain letters.",
+ "alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
+ "alpha_num" => "The :attribute may only contain letters and numbers.",
+ "array" => "The :attribute must be an array.",
+ "before" => "The :attribute must be a date before :date.",
+ "between" => array(
+ "numeric" => "The :attribute must be between :min - :max.",
+ "file" => "The :attribute must be between :min - :max kilobytes.",
+ "string" => "The :attribute must be between :min - :max characters.",
+ "array" => "The :attribute must have between :min - :max items.",
+ ),
+ "confirmed" => "The :attribute confirmation does not match.",
+ "date" => "The :attribute is not a valid date.",
+ "date_format" => "The :attribute does not match the format :format.",
+ "different" => "The :attribute and :other must be different.",
+ "digits" => "The :attribute must be :digits digits.",
+ "digits_between" => "The :attribute must be between :min and :max digits.",
+ "email" => "The :attribute format is invalid.",
+ "exists" => "The selected :attribute is invalid.",
+ "image" => "The :attribute must be an image.",
+ "in" => "The selected :attribute is invalid.",
+ "integer" => "The :attribute must be an integer.",
+ "ip" => "The :attribute must be a valid IP address.",
+ "max" => array(
+ "numeric" => "The :attribute may not be greater than :max.",
+ "file" => "The :attribute may not be greater than :max kilobytes.",
+ "string" => "The :attribute may not be greater than :max characters.",
+ "array" => "The :attribute may not have more than :max items.",
+ ),
+ "mimes" => "The :attribute must be a file of type: :values.",
+ "min" => array(
+ "numeric" => "The :attribute must be at least :min.",
+ "file" => "The :attribute must be at least :min kilobytes.",
+ "string" => "The :attribute must be at least :min characters.",
+ "array" => "The :attribute must have at least :min items.",
+ ),
+ "not_in" => "The selected :attribute is invalid.",
+ "numeric" => "The :attribute must be a number.",
+ "regex" => "The :attribute format is invalid.",
+ "required" => "The :attribute field is required.",
+ "required_if" => "The :attribute field is required when :other is :value.",
+ "required_with" => "The :attribute field is required when :values is present.",
+ "required_without" => "The :attribute field is required when :values is not present.",
+ "same" => "The :attribute and :other must match.",
+ "size" => array(
+ "numeric" => "The :attribute must be :size.",
+ "file" => "The :attribute must be :size kilobytes.",
+ "string" => "The :attribute must be :size characters.",
+ "array" => "The :attribute must contain :size items.",
+ ),
+ "unique" => "The :attribute has already been taken.",
+ "url" => "The :attribute format is invalid.",
+
+ "positive" => "The :attribute must be greater than zero.",
+ "has_credit" => "The client does not have enough credit.",
+ "notmasked" => "The values are masked",
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify custom validation messages for attributes using the
+ | convention "attribute.rule" to name the lines. This makes it quick to
+ | specify a specific custom language line for a given attribute rule.
+ |
+ */
+
+ 'custom' => array(),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap attribute place-holders
+ | with something more reader friendly such as E-Mail Address instead
+ | of "email". This simply helps us make messages a little cleaner.
+ |
+ */
+
+ 'attributes' => array(),
+
+);