├── .gitignore ├── .s2i ├── .gitkeep └── bin │ ├── .gitkeep │ ├── README │ ├── assemble │ └── run ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── amber.gemspec ├── bin └── amber ├── lib ├── amber.rb └── amber │ ├── cli.rb │ ├── i18n.rb │ ├── logger.rb │ ├── menu.rb │ ├── page_array.rb │ ├── render │ ├── apache.rb │ ├── asset.rb │ ├── filter │ │ ├── autolink.rb │ │ ├── bracketlink.rb │ │ └── variables.rb │ ├── helpers │ │ ├── blog_helper.rb │ │ ├── date_helper.rb │ │ ├── haml_helper.rb │ │ ├── html_helper.rb │ │ ├── language_helper.rb │ │ └── navigation_helper.rb │ ├── layout.rb │ ├── sass_helper.rb │ ├── table_of_contents.rb │ ├── template.rb │ └── view.rb │ ├── server.rb │ ├── site.rb │ ├── site_configuration.rb │ ├── static_page.rb │ ├── static_page │ ├── filesystem.rb │ ├── page_properties.rb │ ├── property_set.rb │ └── render.rb │ ├── templates │ ├── apache_config.erb │ ├── apache_config_with_prefix.erb │ ├── config.rb │ └── htaccess.erb │ └── version.rb ├── locales └── rails-i18n │ ├── MIT-LICENSE.txt │ ├── README.md │ ├── af.yml │ ├── ar.yml │ ├── az.yml │ ├── bg.yml │ ├── bn.yml │ ├── bs.yml │ ├── ca.yml │ ├── cs.yml │ ├── cy.yml │ ├── da.yml │ ├── de-AT.yml │ ├── de-CH.yml │ ├── de.yml │ ├── el.yml │ ├── en-AU.yml │ ├── en-CA.yml │ ├── en-GB.yml │ ├── en-IE.yml │ ├── en-IN.yml │ ├── en-NZ.yml │ ├── en-US.yml │ ├── en-ZA.yml │ ├── en.yml │ ├── eo.yml │ ├── es-419.yml │ ├── es-AR.yml │ ├── es-CL.yml │ ├── es-CO.yml │ ├── es-CR.yml │ ├── es-EC.yml │ ├── es-MX.yml │ ├── es-PA.yml │ ├── es-PE.yml │ ├── es-US.yml │ ├── es-VE.yml │ ├── es.yml │ ├── et.yml │ ├── eu.yml │ ├── fa.yml │ ├── fi.yml │ ├── fr-CA.yml │ ├── fr-CH.yml │ ├── fr.yml │ ├── gl.yml │ ├── he.yml │ ├── hi-IN.yml │ ├── hi.yml │ ├── hr.yml │ ├── hu.yml │ ├── id.yml │ ├── is.yml │ ├── iso-639-2 │ ├── csb.yml │ ├── dsb.yml │ ├── fur.yml │ ├── gsw-CH.yml │ ├── hsb.yml │ ├── pap-AW.yml │ ├── pap-CW.yml │ └── scr.yml │ ├── it-CH.yml │ ├── it.yml │ ├── ja.yml │ ├── km.yml │ ├── kn.yml │ ├── ko.yml │ ├── lo.yml │ ├── lt.yml │ ├── lv.yml │ ├── mk.yml │ ├── mn.yml │ ├── ms.yml │ ├── nb.yml │ ├── ne.yml │ ├── nl.yml │ ├── nn.yml │ ├── or.yml │ ├── pl.yml │ ├── pt-BR.yml │ ├── pt.yml │ ├── rm.yml │ ├── ro.yml │ ├── ru.yml │ ├── sk.yml │ ├── sl.yml │ ├── sr.yml │ ├── sv.yml │ ├── sw.yml │ ├── ta.yml │ ├── th.yml │ ├── tl.yml │ ├── tr.yml │ ├── uk.yml │ ├── ur.yml │ ├── uz.yml │ ├── vi.yml │ ├── wo.yml │ ├── zh-CN.yml │ ├── zh-HK.yml │ ├── zh-TW.yml │ └── zh-YUE.yml └── test ├── files └── toc.yml ├── site ├── amber │ ├── config.rb │ ├── layouts │ │ └── default.html.haml │ ├── locales │ │ └── en.yml │ └── menu.txt ├── apache.conf ├── apache_with_prefix.conf └── pages │ ├── aaa │ ├── asset.css │ ├── de.md │ └── en.md │ ├── autoalias │ ├── blue │ │ ├── en.md │ │ └── purple │ │ │ └── en.md │ ├── en.md │ └── red │ │ ├── blue │ │ ├── en.md │ │ └── green │ │ │ └── en.md │ │ ├── en.md │ │ └── orange │ │ └── en.md │ ├── bbb │ ├── ccc │ │ ├── de.md │ │ └── en.md │ ├── ddd.md │ └── en.md │ ├── de.md │ ├── en.md │ ├── fff.de.md │ ├── fff.en.md │ └── rtl.md ├── test_helper.rb └── unit ├── apache_test.rb ├── property_test.rb ├── render_test.rb ├── test_helper.rb └── toc_test.rb /.gitignore: -------------------------------------------------------------------------------- 1 | test/site/public 2 | notes.txt 3 | *.gem 4 | Gemfile.lock 5 | test/site/apache.log -------------------------------------------------------------------------------- /.s2i/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/.s2i/.gitkeep -------------------------------------------------------------------------------- /.s2i/bin/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/.s2i/bin/.gitkeep -------------------------------------------------------------------------------- /.s2i/bin/README: -------------------------------------------------------------------------------- 1 | This folder can contain scripts that can be used during various points in the 2 | S2I process. For more information on the types of scripts that can be placed 3 | here, and their required details, please see: 4 | https://github.com/openshift/source-to-image/blob/master/docs/builder_image.md#s2i-scripts 5 | -------------------------------------------------------------------------------- /.s2i/bin/assemble: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | export RACK_ENV=${RACK_ENV:-"production"} 6 | 7 | echo "---> Installing application source ..." 8 | cp -Rf /tmp/src/. ./ 9 | 10 | echo "---> Building your Ruby application from source ..." 11 | if [ -f Gemfile ]; then 12 | ADDTL_BUNDLE_ARGS="" 13 | if [ -f Gemfile.lock ]; then 14 | ADDTL_BUNDLE_ARGS="--deployment" 15 | fi 16 | 17 | if [[ "$RAILS_ENV" == "development" || "$RACK_ENV" == "development" ]]; then 18 | BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"test"} 19 | elif [[ "$RAILS_ENV" == "test" || "$RACK_ENV" == "test" ]]; then 20 | BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"development"} 21 | else 22 | BUNDLE_WITHOUT=${BUNDLE_WITHOUT:-"development:test"} 23 | fi 24 | 25 | echo "---> Running 'bundle install ${ADDTL_BUNDLE_ARGS}' ..." 26 | bundle install --path ./bundle ${ADDTL_BUNDLE_ARGS} 27 | 28 | echo "---> Cleaning up unused ruby gems ..." 29 | bundle clean -V 30 | fi 31 | 32 | # Fix source directory permissions 33 | fix-permissions ./ 34 | 35 | # Make the ./tmp folder world writeable as Rails or other frameworks might use 36 | # it to store temporary data (uploads/cache/sessions/etcd). 37 | # The ./db folder has to be writeable as well because when Rails complete the 38 | # migration it writes the schema version into ./db/schema.db 39 | set +e 40 | [[ -d ./tmp ]] && chgrp -R 0 ./tmp && chmod -R g+rw ./tmp 41 | [[ -d ./db ]] && chgrp -R 0 ./db && chmod -R g+rw ./db 42 | set -e 43 | 44 | echo "---> CUSTOM S2I ASSEMBLE COMPLETE" 45 | -------------------------------------------------------------------------------- /.s2i/bin/run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | export RACK_ENV=${RACK_ENV:-"production"} 6 | 7 | echo "---> CUSTOM S2I RUN COMPLETE" 8 | 9 | cd test/site 10 | bundle exec amber server 0.0.0.0 11 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gemspec 3 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "rake/testtask" 2 | 3 | ## 4 | ## TESTING 5 | ## 6 | 7 | Rake::TestTask.new do |t| 8 | t.pattern = "test/unit/*_test.rb" 9 | t.verbose = false 10 | t.warning = false 11 | end 12 | task :default => :test 13 | -------------------------------------------------------------------------------- /amber.gemspec: -------------------------------------------------------------------------------- 1 | require File.join([File.dirname(__FILE__),'lib','amber','version.rb']) 2 | 3 | Gem::Specification.new do |s| 4 | s.name = "amber" 5 | s.version = Amber::VERSION 6 | s.summary = "Static website generator" 7 | s.description = "Amber is a super simple and super flexible static website generator with support for nice localization and navigation." 8 | s.authors = ["Elijah Sparrow"] 9 | s.email = ["elijah@leap.se"] 10 | s.files = Dir["{lib}/**/*.rb", "{lib}/**/*.erb", "{locales}/**/*.yml", "bin/*", "LICENSE", "*.md"] 11 | s.homepage = "https://github.com/leapcode/amber" 12 | s.license = "AGPL-1.0" 13 | s.executables << 'amber' 14 | s.bindir = 'bin' 15 | s.required_ruby_version = '>= 1.9' 16 | 17 | s.add_runtime_dependency 'i18n', '> 0.8.0' 18 | s.add_runtime_dependency 'haml', '> 5.0.0', '< 6.0.0' 19 | s.add_runtime_dependency 'haml-contrib', '~> 1.0' 20 | s.add_runtime_dependency 'RedCloth', '~> 4.3' 21 | s.add_runtime_dependency 'rdiscount', '~> 2.1' 22 | s.add_runtime_dependency 'tilt', '~> 2.0' 23 | s.add_runtime_dependency 'sass', '~> 3.2' 24 | 25 | # security pinnings 26 | s.add_runtime_dependency 'nokogiri', '>= 1.8.5' 27 | s.add_runtime_dependency 'ffi', '>= 1.9.24' 28 | end 29 | -------------------------------------------------------------------------------- /bin/amber: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | if ARGV.include?('--debug') 4 | if RUBY_VERSION =~ /^2/ 5 | require 'byebug' 6 | else 7 | require 'debugger' 8 | end 9 | end 10 | 11 | begin 12 | require 'amber' 13 | rescue LoadError 14 | base_dir = File.expand_path('..', File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__)) 15 | ["#{base_dir}/lib"].each do |path| 16 | $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path) 17 | end 18 | require 'amber' 19 | end 20 | 21 | def process_command_line_arguments 22 | @command = nil 23 | @command_arg = nil 24 | @verbose = false 25 | loop do 26 | case ARGV[0] 27 | when 'init' then @command = ARGV.shift; @command_arg = ARGV.shift 28 | when 'build' then @command = ARGV.shift 29 | when 'rebuild' then @command = ARGV.shift 30 | when 'clean' then @command = 'clear'; ARGV.shift 31 | when 'clear' then @command = ARGV.shift 32 | when 'server' then @command = ARGV.shift; @command_arg = ARGV.shift 33 | when 'apache' then @command = ARGV.shift; @command_arg = ARGV.shift 34 | when 'version' then version 35 | when '--version' then version 36 | when '--debug' then ARGV.shift 37 | when '--help' then usage 38 | when 'help' then usage 39 | when '-h' then usage 40 | when '-v' then @verbose = true; ARGV.shift 41 | when /^-/ then usage("Unknown option: #{ARGV[0].inspect}") 42 | else break 43 | end 44 | end 45 | usage("No command given") unless @command 46 | end 47 | 48 | def usage(msg=nil) 49 | $stderr.puts(msg) if msg 50 | $stderr.puts 51 | $stderr.puts("Usage: #{File.basename($0)} [OPTIONS] COMMAND") 52 | $stderr.puts 53 | $stderr.puts("COMMAND may be one or more of: 54 | init DIRECTORY -- Create a new amber site in DIRECTORY. 55 | build -- Render static html pages. 56 | rebuild -- Runs `clear` then `build`. 57 | server [[HOST][:PORT]] -- Runs mini web server bound to HOST:PORT (defaults to #{Amber::DEFAULT_HOST}:#{Amber::DEFAULT_PORT}). 58 | clear -- Erase static HTML pages. 59 | clean -- Alias for `clear`. 60 | apache DIRECTORY -- Prints out appropriate apache2 config for the given DIRECTORY. 61 | help -- This message. 62 | version -- Print version and exit.") 63 | $stderr.puts 64 | $stderr.puts("OPTIONS may be one or more of: 65 | -v -- Run in verbose mode. 66 | --version -- Print version and exit. 67 | --debug -- Enable debugger.") 68 | exit(2) 69 | end 70 | 71 | def version 72 | puts Amber::VERSION 73 | exit 74 | end 75 | 76 | def main 77 | process_command_line_arguments 78 | if @verbose 79 | Amber.logger.level = Logger::DEBUG 80 | end 81 | Amber::CLI.new(Dir.pwd).send(@command, {:port => @port, :verbose => @verbose, :arg => @command_arg}) 82 | end 83 | 84 | main -------------------------------------------------------------------------------- /lib/amber.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | require 'logger' 4 | 5 | # ensure that we load sass from a gem, not the sass included in some 6 | # versions of haml. 7 | gem 'sass' 8 | require 'sass' 9 | require 'haml' 10 | 11 | module Amber 12 | 13 | class MissingTemplate < StandardError 14 | end 15 | 16 | # Possible page suffixes. Only files with these suffixes are treated as pages 17 | PAGE_SUFFIXES = %w(haml md markdown text textile rst html html.haml) 18 | 19 | # Possible variable file suffixes. Only files with these suffixesare treated 20 | # as variable files. 21 | VAR_SUFFIXES = %w(json yaml yml) 22 | 23 | DEFAULT_HOST = '127.0.0.1' 24 | DEFAULT_PORT = '8000' 25 | 26 | def self.env 27 | if defined?(TESTING) && TESTING==true 28 | :test 29 | elsif defined?(Amber::Server) 30 | :developmet 31 | else 32 | :production 33 | end 34 | end 35 | 36 | end 37 | 38 | require 'amber/version' 39 | require 'amber/cli' 40 | require 'amber/logger' 41 | require 'amber/i18n' 42 | 43 | require 'amber/menu' 44 | require 'amber/site' 45 | require 'amber/site_configuration' 46 | 47 | require 'amber/static_page' 48 | require 'amber/static_page/filesystem' 49 | require 'amber/static_page/render' 50 | require 'amber/static_page/property_set' 51 | require 'amber/static_page/page_properties' 52 | require 'amber/page_array' 53 | 54 | require 'amber/render/layout' 55 | require 'amber/render/view' 56 | require 'amber/render/template' 57 | require 'amber/render/asset' 58 | require 'amber/render/table_of_contents' 59 | require 'amber/render/apache' 60 | require 'amber/render/filter/autolink' 61 | require 'amber/render/filter/bracketlink' 62 | require 'amber/render/filter/variables' 63 | require 'amber/render/sass_helper' 64 | -------------------------------------------------------------------------------- /lib/amber/cli.rb: -------------------------------------------------------------------------------- 1 | require 'fileutils' 2 | 3 | module Amber 4 | class CLI 5 | 6 | def initialize(root, *args) 7 | @options = {} 8 | @options = args.pop if args.last.is_a?(::Hash) 9 | @root = File.expand_path(root) 10 | end 11 | 12 | def init(options) 13 | new_dir = options[:arg] 14 | mkdir(new_dir, nil) 15 | mkdir('amber', new_dir) 16 | copy_template_file('config.rb', 'amber', new_dir) 17 | touch('amber/menu.txt', new_dir) 18 | mkdir('amber/layouts', new_dir) 19 | mkdir('amber/locales', new_dir) 20 | mkdir('public', new_dir) 21 | mkdir('pages', new_dir) 22 | end 23 | 24 | def build(options) 25 | site = Site.new(@root) 26 | site.load_pages 27 | site.render 28 | end 29 | 30 | def clear(options) 31 | site = Site.new(@root) 32 | site.clear 33 | end 34 | 35 | def clean(options) 36 | clear(options) 37 | end 38 | 39 | def rebuild(options) 40 | site = Site.new(@root) 41 | site.continue_on_error = false 42 | site.load_pages 43 | FileUtils.mkdir_p(site.dest_dir) unless File.exist?(site.dest_dir) 44 | gitkeep = File.exist?(File.join(site.dest_dir, '.gitkeep')) 45 | temp_render = File.join(File.dirname(site.dest_dir), 'public-tmp') 46 | temp_old_pages = File.join(File.dirname(site.dest_dir), 'remove-me') 47 | site.with_destination(temp_render) do 48 | site.render 49 | end 50 | FileUtils.mv(site.dest_dir, temp_old_pages) 51 | FileUtils.mv(temp_render, site.dest_dir) 52 | site.with_destination(temp_old_pages) do 53 | site.clear 54 | FileUtils.rm_r(temp_old_pages) 55 | end 56 | if gitkeep 57 | FileUtils.touch(File.join(site.dest_dir, '.gitkeep')) 58 | end 59 | ensure 60 | # cleanup if something goes wrong. 61 | FileUtils.rm_r(temp_render) if temp_render && File.exist?(temp_render) 62 | FileUtils.rm_r(temp_old_pages) if temp_old_pages && File.exist?(temp_old_pages) 63 | end 64 | 65 | def server(options) 66 | require 'amber/server' 67 | host = nil 68 | port = nil 69 | if options[:arg] 70 | host, port = options[:arg].split(':') 71 | end 72 | if host.nil? || host.empty? 73 | host = DEFAULT_HOST 74 | end 75 | if port.nil? || port.empty? 76 | port = DEFAULT_PORT 77 | end 78 | site = Site.new(@root) 79 | Amber::Server.start(:port => port, :host => host, :site => site) 80 | end 81 | 82 | def apache(options) 83 | site = Site.new(@root) 84 | directory = options[:arg] 85 | unless directory 86 | puts "Missing DIRECTORY argument" 87 | exit 1 88 | end 89 | directory = directory.gsub(%r{^/|/$}, '') 90 | Amber::Render::Apache.echo_config(site, directory) 91 | end 92 | 93 | private 94 | 95 | def mkdir(dir, context) 96 | if context 97 | path = File.join(context, dir) 98 | print_path = File.join(File.basename(context), dir) 99 | else 100 | path = dir 101 | print_path = dir 102 | end 103 | unless Dir.exist?(path) 104 | if File.exist?(path) 105 | puts "Could not make directory `#{print_path}`. File already exists." 106 | exit(1) 107 | end 108 | FileUtils.mkdir_p(path) 109 | puts "* Creating `#{print_path}`" 110 | end 111 | end 112 | 113 | def touch(file, context) 114 | path = File.join(context, file) 115 | unless File.exist?(path) 116 | FileUtils.touch(path) 117 | puts "* Creating `#{File.basename(context)}/#{file}`" 118 | end 119 | end 120 | 121 | def copy_template_file(template_file, destination, context) 122 | template_file_path = File.dirname(__FILE__) + "/templates/#{template_file}" 123 | copy(template_file_path, destination, context) 124 | end 125 | 126 | def copy(source, destination, context) 127 | destination_path = File.join(context, destination) 128 | FileUtils.copy(source, destination_path) 129 | puts "* Creating `#{File.basename(context)}/#{destination}/#{File.basename(source)}`" 130 | end 131 | 132 | end 133 | end 134 | -------------------------------------------------------------------------------- /lib/amber/i18n.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | require 'i18n' 4 | require 'i18n/backend/fallbacks' 5 | 6 | I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) 7 | I18n.enforce_available_locales = false 8 | 9 | I18n.load_path += Dir[File.join(File.expand_path('../../../locales', __FILE__), '/**/*.{yml,yaml}')] 10 | 11 | module Amber 12 | 13 | # 14 | # Languages that might possibly be supported. 15 | # 16 | # https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers 17 | # 18 | POSSIBLE_LANGUAGES = { 19 | :zh => ['中文', 'zh', 1, false], # Chinese 20 | :es => ['Español', 'es', 2, false], 21 | :en => ['English', 'en', 3, false], 22 | :hi => ['Hindi', 'hi', 4, false], 23 | :ar => ['العربية', 'ar', 5, true], # Arabic 24 | :pt => ['Português', 'pt', 6, false], 25 | :ru => ['Pyccĸий', 'ru', 7, false], # Russian 26 | :ja => ['日本語', 'ja', 8, false], # Japanese 27 | :pa => ['ਪੰਜਾਬੀ', 'pa', 9, false], # Punjabi 28 | :de => ['Deutsch', 'de', 10, false], 29 | :vi => ['Tiếng Việt','vi', 11, false], # Vietnamese 30 | :fr => ['Français', 'fr', 12, false], 31 | :ur => ['اُردُو', 'ur', 13, false], # Urdu 32 | :fa => ['فارسی', 'fa', 14, false], # Farsi / Persian 33 | :tr => ['Türkçe', 'tr', 15, false], # Turkish 34 | :it => ['Italiano', 'it', 16, false], 35 | :el => ['Ελληνικά', 'el', 17, false], # Greek 36 | :pl => ['Polski', 'pl', 18, false], # Polish 37 | :ca => ['Català', 'ca', 19, false] 38 | } 39 | 40 | # Although everywhere else we use symbols for locales, this array should be strings: 41 | POSSIBLE_LANGUAGE_CODES = POSSIBLE_LANGUAGES.keys.map(&:to_s) 42 | 43 | end 44 | -------------------------------------------------------------------------------- /lib/amber/logger.rb: -------------------------------------------------------------------------------- 1 | require 'logger' 2 | 3 | module Amber 4 | 5 | def self.logger 6 | @logger ||= begin 7 | logger = Logger.new(STDOUT) 8 | logger.level = Logger::INFO 9 | logger.formatter = proc do |severity, datetime, progname, msg| 10 | "#{severity}: #{msg}\n" 11 | end 12 | logger 13 | end 14 | end 15 | 16 | def self.log_exception(e) 17 | Amber.logger.error(e) 18 | Amber.logger.error(e.backtrace.join("\n ")) 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /lib/amber/menu.rb: -------------------------------------------------------------------------------- 1 | # 2 | # A navigation menu class 3 | # 4 | 5 | module Amber 6 | class Menu 7 | attr_accessor :parent 8 | attr_accessor :children 9 | attr_accessor :name 10 | 11 | # 12 | # load the menu.txt file and build the in-memory menu array 13 | # 14 | def load(menu_file_path) 15 | File.open(menu_file_path) do |file| 16 | parse_menu(file) 17 | end 18 | end 19 | 20 | def initialize(name, parent=nil) 21 | self.name = name 22 | self.parent = parent 23 | self.children = [] 24 | end 25 | 26 | ## 27 | ## public methods 28 | ## 29 | 30 | # 31 | # returns the menu under the item that matches item_name. 32 | # 33 | def submenu(item_name=nil) 34 | if item_name 35 | self.children.detect {|child| child.name == item_name} 36 | else 37 | self.children 38 | end 39 | end 40 | 41 | # 42 | # returns path from root to this leaf as an array 43 | # 44 | def path 45 | @path ||= begin 46 | if parent == nil 47 | [] 48 | else 49 | parent.path + [name] 50 | end 51 | end 52 | end 53 | 54 | def path_str 55 | @path_str ||= path.join('/') 56 | end 57 | 58 | def each(&block) 59 | children.each(&block) 60 | end 61 | 62 | def size 63 | children.size 64 | end 65 | 66 | # 67 | # returns true if menu's path starts with +path_prefix+ 68 | # 69 | def path_starts_with?(path_prefix) 70 | array_starts_with?(path, path_prefix) 71 | end 72 | 73 | def path_prefix_of?(full_path) 74 | array_starts_with?(full_path, path) 75 | end 76 | 77 | # 78 | # returns true if this menu item is the terminus menu item for path. 79 | # (meaning that there are no children that match more path segments) 80 | # 81 | def leaf_for_path?(path) 82 | return false unless path_prefix_of?(path) 83 | next_path_segment = (path - self.path).first 84 | return false if next_path_segment.nil? 85 | return !children.detect {|i| i.name == next_path_segment} 86 | end 87 | 88 | def inspect(indent=0) 89 | lines = [] 90 | lines << ' '*indent + '- ' + self.name 91 | self.children.each do |child| 92 | lines << child.inspect(indent+1) 93 | end 94 | lines.join("\n") 95 | end 96 | 97 | # 98 | # private & protected methods 99 | # 100 | 101 | protected 102 | 103 | def add_child(name) 104 | self.children << Menu.new(name, self) 105 | end 106 | 107 | private 108 | 109 | def array_starts_with?(big_array, small_array) 110 | small_array.length.times do |i| 111 | if small_array[i] != big_array[i] 112 | return false 113 | end 114 | end 115 | return true 116 | end 117 | 118 | 119 | def parse_menu(file) 120 | while true 121 | item = file.readline 122 | if item.strip.chars.any? && item !~ /^\s*#/ 123 | depth = item.scan(" ").size 124 | last_menu_at_depth(depth).add_child(item.strip) 125 | end 126 | end 127 | rescue EOFError 128 | # done loading 129 | end 130 | 131 | # 132 | # returns the last list of children at the specified depth 133 | # 134 | def last_menu_at_depth(depth) 135 | menu = self 136 | depth.times { menu = menu.children.last } 137 | menu 138 | end 139 | 140 | end 141 | end -------------------------------------------------------------------------------- /lib/amber/page_array.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Array of StaticPages 3 | # 4 | 5 | require 'bigdecimal' 6 | 7 | module Amber 8 | class PageArray < Array 9 | 10 | def limit(num) 11 | PageArray.new(self[0..(num-1)]) 12 | end 13 | 14 | # 15 | # available options: 16 | # 17 | # :locale -- the locale to use when comparing attributes 18 | # :direction -- either :asc or :desc 19 | # :numeric -- if true, attributes are cast as numbers before comparison 20 | # 21 | def order_by(attr, options={}) 22 | locale = options[:locale] || I18n.locale 23 | direction = options[:direction] || :asc 24 | array = sort do |a,b| 25 | if direction == :desc 26 | a, b = b, a 27 | end 28 | a_prop = a.prop(locale, attr) 29 | b_prop = b.prop(locale, attr) 30 | if options[:numeric] 31 | a_prop = to_numeric(a_prop) 32 | b_prop = to_numeric(b_prop) 33 | end 34 | if a_prop.nil? && b_prop.nil? 35 | 0 36 | elsif a_prop.nil? 37 | 1 38 | elsif b_prop.nil? 39 | -1 40 | else 41 | a_prop <=> b_prop 42 | end 43 | end 44 | # remove pages from the results that have no value set for the attr 45 | array.delete_if do |page| 46 | page.prop(locale, attr).nil? 47 | end 48 | return PageArray.new.replace array 49 | end 50 | 51 | def to_numeric(anything) 52 | num = BigDecimal(anything.to_s) 53 | if num.frac == 0 54 | num.to_i 55 | else 56 | num.to_f 57 | end 58 | end 59 | 60 | end 61 | end -------------------------------------------------------------------------------- /lib/amber/render/apache.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | module Render 3 | class Apache 4 | 5 | def self.write_htaccess(site, src_dir, dst_dir) 6 | src_htaccess_file = File.join(src_dir, '.htaccess') 7 | dst_htaccess_file = File.join(dst_dir, '.htaccess') 8 | template = Tilt::ERBTemplate.new(template_path("htaccess.erb")) 9 | 10 | tail_content = nil 11 | if File.exist?(src_htaccess_file) 12 | tail_content = File.read(src_htaccess_file) 13 | end 14 | File.open(dst_htaccess_file, 'w', :encoding => 'UTF-8') do |f| 15 | f.write template.render(context_object(:site => site)) 16 | if tail_content 17 | f.write "\n\n" 18 | f.write tail_content 19 | end 20 | end 21 | end 22 | 23 | def self.echo_config(site, directory) 24 | template = Tilt::ERBTemplate.new( 25 | site.path_prefix ? template_path('apache_config_with_prefix.erb') : template_path('apache_config.erb') 26 | ) 27 | puts template.render(context_object(:site => site, :directory => directory)) 28 | end 29 | 30 | def self.context_object(variables) 31 | object = Object.new 32 | variables.each do |name, value| 33 | object.instance_variable_set("@#{name}", value) 34 | end 35 | object 36 | end 37 | 38 | def self.template_path(filename) 39 | File.expand_path("../templates/#{filename}", File.dirname(__FILE__)) 40 | end 41 | 42 | end 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /lib/amber/render/asset.rb: -------------------------------------------------------------------------------- 1 | # 2 | # For rendering things that are assets, like sass files. 3 | # Maybe images too? 4 | # 5 | 6 | require 'sass' 7 | 8 | module Amber 9 | module Render 10 | class Asset 11 | 12 | RENDER_MAP = { 13 | '.sass' => {:method => 'render_sass', :new_suffix => '.css', :args => [:sass]}, 14 | '.scss' => {:method => 'render_sass', :new_suffix => '.css', :args => [:scss]} 15 | } 16 | 17 | SOURCE_MAP = { 18 | '.css' => ['.sass', '.scss'] 19 | } 20 | 21 | def self.render(src_file, dst_file) 22 | unless Dir.exist?(File.dirname(dst_file)) 23 | FileUtils.mkdir_p(File.dirname(dst_file)) 24 | end 25 | File.unlink(dst_file) if File.exist?(dst_file) 26 | src_ext = File.extname(src_file) 27 | renderer = RENDER_MAP[src_ext] 28 | if renderer 29 | if File.basename(src_file) !~ /^_/ # skip partials 30 | content = self.send(renderer[:method], *([src_file] + renderer[:args])) 31 | new_dst_file = dst_file.sub(/#{Regexp.escape(src_ext)}$/, renderer[:new_suffix]) 32 | File.open(new_dst_file,'w') do |w| 33 | w.write(content) 34 | end 35 | end 36 | elsif File.basename(src_file) == '.htaccess' 37 | # existing htaccess file must be copied, not linked, since 38 | # the render will change its contents. 39 | FileUtils.cp(src_file, dst_file) 40 | else 41 | File.link(src_file, dst_file) 42 | end 43 | rescue SystemCallError => exc 44 | Amber.log_exception(exc) 45 | end 46 | 47 | # 48 | # Render assets in a single directory (does not walk 49 | # directory tree). Files prefixed with an _ are treated 50 | # as partials and not rendered. 51 | # 52 | def self.render_dir(src_dir, dst_dir) 53 | Dir.chdir(src_dir) do 54 | Dir.glob('*').each do |file| 55 | if File.directory?(file) || 56 | file =~ /^\./ || 57 | file =~ /^_/ 58 | next 59 | end 60 | src_file = File.join(src_dir, file) 61 | dst_file = File.join(dst_dir, file) 62 | render(src_file, dst_file) 63 | end 64 | end 65 | end 66 | 67 | def self.render_sass(src_file, syntax) 68 | engine = Sass::Engine.new( 69 | File.read(src_file), 70 | :syntax => syntax, 71 | :load_paths => [File.dirname(src_file)], 72 | :style => self.sass_render_style 73 | ) 74 | engine.render 75 | end 76 | 77 | def self.sass_render_style 78 | Amber::env == :production ? :compact : :nested 79 | end 80 | 81 | end 82 | end 83 | end 84 | -------------------------------------------------------------------------------- /lib/amber/render/filter/autolink.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | # adapted from https://github.com/tenderlove/rails_autolink 3 | # MIT license 4 | 5 | module Amber 6 | module Render 7 | module Filter 8 | module Autolink 9 | 10 | def self.run(text) 11 | auto_link_email_addresses(auto_link_urls(text)) 12 | end 13 | 14 | private 15 | 16 | AUTO_LINK_RE = %r{ 17 | (?: ((?:ed2k|ftp|http|https|irc|mailto|news|gopher|nntp|telnet|webcal|xmpp|callto|feed|svn|urn|aim|rsync|tag|ssh|sftp|rtsp|afs|file):)// | www\. ) 18 | [^\s<\u00A0]+ 19 | }ix 20 | 21 | # regexps for determining context, used high-volume 22 | AUTO_LINK_CRE = [/<[^>]+$/, /^[^>]*>/, //i, /<\/a>/i] 23 | 24 | AUTO_EMAIL_LOCAL_RE = /[\w.!#\$%&'*\/=?^`{|}~+-]/ 25 | AUTO_EMAIL_RE = /[\w.!#\$%+-]\.?#{AUTO_EMAIL_LOCAL_RE}*@[\w-]+(?:\.[\w-]+)+/ 26 | 27 | BRACKETS = { ']' => '[', ')' => '(', '}' => '{' } 28 | 29 | WORD_PATTERN = RUBY_VERSION < '1.9' ? '\w' : '\p{Word}' 30 | 31 | # Turns all urls into clickable links. If a block is given, each url 32 | # is yielded and the result is used as the link text. 33 | def self.auto_link_urls(text) 34 | text.gsub(AUTO_LINK_RE) do 35 | scheme, href = $1, $& 36 | punctuation = [] 37 | 38 | if auto_linked?($`, $') 39 | # do not change string; URL is already linked 40 | href 41 | else 42 | # don't include trailing punctuation character as part of the URL 43 | while href.sub!(/[^#{WORD_PATTERN}\/-]$/, '') 44 | punctuation.push $& 45 | if opening = BRACKETS[punctuation.last] and href.scan(opening).size > href.scan(punctuation.last).size 46 | href << punctuation.pop 47 | break 48 | end 49 | end 50 | 51 | #link_text = block_given?? yield(href) : href 52 | link_text = href.sub(/^#{scheme}\/\//,'') 53 | href = 'http://' + href unless scheme 54 | %(#{link_text}) + punctuation.reverse.join('') 55 | end 56 | end 57 | end 58 | 59 | # Turns all email addresses into clickable links. 60 | def self.auto_link_email_addresses(text) 61 | text.gsub(AUTO_EMAIL_RE) do 62 | text = $& 63 | 64 | if auto_linked?($`, $') 65 | text 66 | else 67 | #display_text = (block_given?) ? yield(text) : text 68 | #display_text = text 69 | text.gsub!('@', '@').gsub!('.', '.') 70 | %(#{text}) 71 | end 72 | end 73 | end 74 | 75 | # Detects already linked context or position in the middle of a tag 76 | def self.auto_linked?(left, right) 77 | (left =~ AUTO_LINK_CRE[0] and right =~ AUTO_LINK_CRE[1]) or 78 | (left.rindex(AUTO_LINK_CRE[2]) and $' !~ AUTO_LINK_CRE[3]) 79 | end 80 | 81 | end 82 | end 83 | end 84 | end -------------------------------------------------------------------------------- /lib/amber/render/filter/bracketlink.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | # 4 | # bracket links are links in the form [[label => target]] or [[page-name]] 5 | # 6 | 7 | module Amber 8 | module Render 9 | module Filter 10 | module Bracketlink 11 | 12 | # linking using double square brackets 13 | BRACKET_LINK_RE = / 14 | \[\[ # start [[ 15 | ([^\[\]]+) # $text : one or more characters that are not [ or ] ($1) 16 | \]\] # end ]] 17 | /x 18 | 19 | def self.run(text, &block) 20 | text.gsub(BRACKET_LINK_RE) do |m| 21 | link_text = $~[1].strip 22 | if link_text =~ /^.+\s*[-=]>\s*.+$/ 23 | # link_text == "from -> to" 24 | from, to = link_text.split(/\s*[-=]>\s*/)[0..1] 25 | from = "" unless from.instance_of? String # \ sanity check for 26 | to = "" unless from.instance_of? String # / badly formed links 27 | else 28 | # link_text == "to" (ie, no link label) 29 | from = nil 30 | to = link_text 31 | end 32 | yield(from, to) 33 | end 34 | end 35 | 36 | end 37 | end 38 | end 39 | end -------------------------------------------------------------------------------- /lib/amber/render/filter/variables.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | # 4 | # bracket links are links in the form [[label => target]] or [[page-name]] 5 | # 6 | 7 | module Amber 8 | module Render 9 | module Filter 10 | module Variables 11 | 12 | # variable expansion uses {{ }} 13 | VARIABLES_RE = / 14 | \{\{ # start {{ 15 | ([^\{\}]+) # $text : one or more characters that are not { or } ($1) 16 | \}\} # end }} 17 | /x 18 | 19 | def self.run(text, &block) 20 | text.gsub(VARIABLES_RE) do |m| 21 | variable_name = $~[1].strip 22 | yield(variable_name) 23 | end 24 | end 25 | 26 | end 27 | end 28 | end 29 | end -------------------------------------------------------------------------------- /lib/amber/render/helpers/blog_helper.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | module Render 3 | module BlogHelper 4 | 5 | def recent_summaries(options={}, &block) 6 | limit = options[:limit] || @site.pagination_size 7 | order = options[:order] || :posted_at 8 | direction = options[:direction] || :desc 9 | #partial = options[:partial] 10 | if options[:path] 11 | @site.find_page(options[:path]) 12 | else 13 | root = @site.root 14 | end 15 | if root 16 | pages = root.all_children.order_by(order, :direction => direction).limit(limit) 17 | haml do 18 | pages.each do |page| 19 | if block 20 | yield page 21 | else 22 | render_page_summary(page) 23 | end 24 | end 25 | end 26 | end 27 | end 28 | 29 | #@def news_feed_link 30 | # link_to(image_tag('/img/feed-icon-14x14.png'), "/#{I18n.locale}/news.atom") 31 | #end 32 | 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /lib/amber/render/helpers/date_helper.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | module Render 3 | module HtmlHelper 4 | def time_tag(date_or_time, *args, &block) 5 | options = args.last.is_a?(Hash) ? args.pop : {} 6 | format = options.delete(:format) || :long 7 | content = args.first || I18n.l(date_or_time, :format => format) 8 | #datetime = date_or_time.acts_like?(:time) ? date_or_time.xmlschema : date_or_time.iso8601 9 | datetime = date_or_time.iso8601 10 | content_tag(:time, content, {:datetime => datetime}.merge(options), &block) 11 | end 12 | end 13 | end 14 | end -------------------------------------------------------------------------------- /lib/amber/render/helpers/haml_helper.rb: -------------------------------------------------------------------------------- 1 | require 'pathname' 2 | 3 | module HamlHelper 4 | 5 | # 6 | # acts like haml_tag, capture_haml, or haml_concat, depending on how it is called. 7 | # 8 | # two or more args --> like haml_tag 9 | # one arg and a block --> like haml_tag 10 | # zero args and a block --> like capture_haml 11 | # one arg and no block --> like haml_concat 12 | # 13 | # additionally, we allow the use of more than one class. 14 | # 15 | # some examples of these usages: 16 | # 17 | # def display_robot(robot) 18 | # haml do # like capture_haml 19 | # haml '.head', robot.head_html # like haml_tag 20 | # haml '.head' do # same 21 | # haml robot.head_html 22 | # end 23 | # haml '.body.metal', robot.body_html # like haml_tag, but with multiple classes 24 | # haml 'link' # like haml_concat 25 | # end 26 | # end 27 | # 28 | # wrapping the helper in a capture_haml call is very useful, because then 29 | # the helper can be used wherever a normal helper would be. 30 | # 31 | def haml(name=nil, *args, &block) 32 | if name 33 | if args.empty? and block.nil? 34 | haml_concat name 35 | else 36 | if name =~ /^(.*?\.[^\.]*)(\..*)$/ 37 | # allow chaining of classes if there are multiple '.' in the first arg 38 | name = $1 39 | classes = $2.gsub('.',' ') 40 | hsh = args.detect{|i| i.is_a?(Hash)} 41 | unless hsh 42 | hsh = {} 43 | args << hsh 44 | end 45 | hsh[:class] = classes 46 | end 47 | haml_tag(name, *args, &block) 48 | end 49 | else 50 | capture_haml(&block) 51 | end 52 | end 53 | 54 | def content_tag(name, content_or_options_with_block = nil, options = nil, &block) 55 | if block_given? 56 | options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash) 57 | capture_haml { haml(name, options, &block) } 58 | else 59 | capture_haml { haml_tag(name, content_or_options_with_block, options) } 60 | end 61 | end 62 | 63 | end -------------------------------------------------------------------------------- /lib/amber/render/helpers/html_helper.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | module Render 3 | module HtmlHelper 4 | 5 | # 6 | # return html markup suitable for setting the href base 7 | # of the document. If this is added to the document's HEAD, 8 | # then relative urls will work as expected even though the 9 | # url path does not end with a '/' 10 | # 11 | def html_head_base 12 | if @page 13 | "" 14 | else 15 | "" 16 | end 17 | end 18 | 19 | # 20 | # link_to like rails 21 | def link_to(label, url, options=nil) 22 | link({label => url}, options) 23 | end 24 | 25 | # 26 | # three forms: 27 | # 28 | # (1) link('page-name') 29 | # (2) link('label' => 'page-name') 30 | # (3) link('label' => 'https://url') 31 | # 32 | # both accept optional options hash: 33 | # 34 | # (1) link('page-name', :class => 'x') 35 | # (2) link('label' => 'page-name', :class => 'x') 36 | # 37 | def link(name, options=nil) 38 | options = nil if options && !options.is_a?(Hash) 39 | klass = nil 40 | if name.is_a? Hash 41 | klass = name.delete(:class) 42 | label, name = name.to_a.first 43 | if label.is_a? Symbol 44 | label = I18n.t label 45 | end 46 | end 47 | klass ||= options[:class] if options 48 | if name =~ /^#/ || name =~ /^http/ || name =~ /\./ 49 | path = name 50 | label ||= name 51 | else 52 | if index = name.index('#') 53 | anchor = name[index..-1] 54 | name_without_anchor = name[0..(index-1)] 55 | else 56 | anchor = '' 57 | name_without_anchor = name 58 | end 59 | page = @site.find_page(name_without_anchor) 60 | if page 61 | label ||= page.nav_title 62 | path = amber_path(page) + anchor 63 | else 64 | puts "warning: dead link to `#{name_without_anchor}` from page `/#{I18n.locale}/#{@page.path.join('/')}`" 65 | label ||= name_without_anchor 66 | label += ' [dead link]' 67 | path = name_without_anchor 68 | end 69 | end 70 | if klass 71 | %(#{label}) 72 | else 73 | %(#{label}) 74 | end 75 | end 76 | 77 | # 78 | # returns the ideal full url path for a page or path (expressed as an array). 79 | # 80 | def amber_path(page_or_array, locale=I18n.locale) 81 | page = nil 82 | if page_or_array.is_a? Array 83 | page = @site.find_page_by_path(page_or_array) 84 | elsif page_or_array.is_a? StaticPage 85 | page = page_or_array 86 | end 87 | if page.nil? 88 | return '' 89 | end 90 | full_path = [] 91 | full_path << @site.path_prefix if @site.path_prefix 92 | full_path << locale # always do this? 93 | if page.aliases(locale).any? 94 | full_path += page.aliases(locale).first 95 | else 96 | full_path += page.path 97 | end 98 | "/" + full_path.join('/') 99 | end 100 | 101 | end 102 | end 103 | end 104 | -------------------------------------------------------------------------------- /lib/amber/render/helpers/language_helper.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | module Render 3 | module LanguageHelper 4 | 5 | def t(*args) 6 | I18n.t(*args, default: I18n.t(args.first, locale: I18n.default_locale)) 7 | end 8 | 9 | def translation_missing? 10 | !@page.content_file_exists?(I18n.locale) 11 | end 12 | 13 | # return array of arrays, each array with: language_name, language_code, current_url_with_locale_switch 14 | # 15 | # [ ['English', :en, 'en/about-us'] ] 16 | # 17 | def available_languages 18 | @site.locales.collect { |locale| 19 | [Amber::POSSIBLE_LANGUAGES[locale][0], locale, "/"+([locale]+current_page_path).join('/')] 20 | } 21 | end 22 | 23 | end 24 | end 25 | end -------------------------------------------------------------------------------- /lib/amber/render/layout.rb: -------------------------------------------------------------------------------- 1 | # 2 | # A Layout is similar to a layout in Rails (a template that decorates the pages) 3 | # 4 | 5 | gem 'tilt', '>= 2.0.0' 6 | require 'tilt' 7 | require 'haml' 8 | 9 | module Amber 10 | module Render 11 | 12 | class Layout 13 | def self.load(layout_dir=nil) 14 | @layout_dirs ||= [] 15 | @layout_dirs << layout_dir if layout_dir 16 | reload 17 | end 18 | 19 | def self.reload 20 | @layouts ||= {} 21 | @layouts['default'] = DefaultLayout.new 22 | @layout_dirs.each do |dir| 23 | Dir.glob("#{dir}/*").each do |layout_file| 24 | name = File.basename(layout_file).sub(/^([^\.]*).*$/, "\\1") 25 | @layouts[name] = Layout.new(layout_file) 26 | end 27 | end 28 | end 29 | 30 | def self.[](layout) 31 | @layouts[layout] 32 | end 33 | 34 | def initialize(file_path, &block) 35 | if file_path =~ /\.haml$/ 36 | # https://www.rubydoc.info/gems/haml/5.0.1/Haml/Options 37 | @template = Tilt::HamlTemplate.new( 38 | file_path, default_encoding: 'UTF-8', escape_html: false 39 | ) 40 | else 41 | @template = Tilt.new( 42 | file_path, default_encoding: 'UTF-8', &block 43 | ) 44 | end 45 | end 46 | 47 | def render(view, &block) 48 | @template.render(view, &block) 49 | end 50 | end 51 | 52 | class DefaultLayout < Layout 53 | def initialize 54 | @template = Tilt::StringTemplate.new {DEFAULT} 55 | end 56 | DEFAULT = ' 57 | 58 | 59 | #{ @page.nav_title } - #{@site.title} 60 | 61 | 62 | 63 | #{ yield } 64 | 65 | ' 66 | end 67 | 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /lib/amber/render/sass_helper.rb: -------------------------------------------------------------------------------- 1 | require 'sass' 2 | 3 | module Amber 4 | module SassFunctions 5 | def image_url(path) 6 | Sass::Script::String.new("url(/assets/images/#{path.value})") 7 | end 8 | end 9 | end 10 | 11 | ::Sass::Script::Functions.send :include, Amber::SassFunctions 12 | -------------------------------------------------------------------------------- /lib/amber/site_configuration.rb: -------------------------------------------------------------------------------- 1 | # 2 | # A class for a site's configuration. 3 | # Site configuration file is eval'ed in the context of an instance of SiteConfiguration 4 | # 5 | # A site can have multiple sub sites, each with their own configurations (called mount points) 6 | # 7 | 8 | require 'pathname' 9 | 10 | module Amber 11 | class SiteConfiguration 12 | 13 | attr_accessor :title 14 | attr_accessor :pagination_size 15 | attr_accessor :locales 16 | attr_accessor :default_locale 17 | attr_accessor :path_prefix 18 | alias :path :path_prefix 19 | attr_accessor :short_paths 20 | 21 | attr_accessor :menu 22 | 23 | attr_accessor :root_dir 24 | attr_accessor :pages_dir 25 | attr_accessor :dest_dir 26 | attr_accessor :config_dir 27 | attr_accessor :config_file 28 | attr_accessor :layouts_dir 29 | attr_accessor :path 30 | attr_accessor :menu_file 31 | attr_accessor :locales_dir 32 | attr_accessor :timestamp 33 | 34 | # an array of SiteConfigurations that are attached as sub-sites 35 | # to this one. 36 | attr_accessor :children 37 | 38 | extend Forwardable 39 | def_delegators :@site, :pages, :find_page, :find_pages, :find_page_by_path, 40 | :find_page_by_name, :continue_on_error, :root 41 | 42 | ## 43 | ## CLASS METHODS 44 | ## 45 | 46 | def self.load(site, root_dir, options={}) 47 | SiteConfiguration.new(site, root_dir, options) 48 | end 49 | 50 | ## 51 | ## INSTANCE METHODS 52 | ## 53 | 54 | # 55 | # accepts a file_path to a configuration file. 56 | # 57 | def initialize(site, root_dir, options={}) 58 | @children = [] 59 | @path_prefix = nil 60 | @site = site 61 | @root_dir = File.expand_path(find_in_directory_tree('amber', 'config.rb', root_dir)) 62 | if @root_dir == '/' 63 | puts "Could not find amber/config.rb in the directory tree. Run `amber` from inside an amber website directory" 64 | exit(1) 65 | end 66 | @pages_dir = File.join(@root_dir, 'pages') 67 | @dest_dir = File.join(@root_dir, 'public') 68 | @config_dir = File.join(@root_dir, 'amber') 69 | @config_file = config_path('config.rb') 70 | @menu_file = config_path('menu.txt') 71 | @locales_dir = config_path('locales') 72 | @layouts_dir = config_path('layouts') 73 | @title = "untitled" 74 | @pagination_size = 20 75 | 76 | @menu = Menu.new('root') 77 | @menu.load(@menu_file) if @menu_file 78 | 79 | self.eval 80 | @path_prefix = options[:path_prefix] if options[:path_prefix] 81 | self.cleanup 82 | 83 | reset_timestamp 84 | Render::Layout.load(@layouts_dir) 85 | end 86 | 87 | # 88 | # map('/path' => '../othersite') 89 | # 90 | def map(path_to_directory_source, options={}) 91 | path, root_dir = path_to_directory_source.to_a.first 92 | config = self.load(@site, root_dir, {:path_prefix => path}) 93 | @site.add_config(config) 94 | end 95 | 96 | def cleanup 97 | @locale ||= I18n.default_locale 98 | I18n.default_locale = @locale 99 | @locales ||= [@locale] 100 | @locales.map! {|locale| 101 | if Amber::POSSIBLE_LANGUAGE_CODES.include?(locale.to_s) 102 | locale.to_sym 103 | else 104 | nil 105 | end 106 | }.compact 107 | if @path_prefix 108 | @path_prefix.gsub!(%r{^/|/$}, '') 109 | @path_prefix = nil if @path_prefix == '' 110 | end 111 | end 112 | 113 | #def pages_changed? 114 | # self.changed? || @children.detect {|child| child.changed?} 115 | #end 116 | 117 | def eval 118 | self.instance_eval(File.read(@config_file), @config_file) 119 | end 120 | 121 | def config_path(file) 122 | path = File.join(@config_dir, file) 123 | if File.exist?(path) 124 | path 125 | else 126 | nil 127 | end 128 | end 129 | 130 | def reset_timestamp 131 | @timestamp = File.mtime(@pages_dir) 132 | end 133 | 134 | def find_in_directory_tree(target_dir_name, target_file_name, directory_tree=nil) 135 | search_dir = directory_tree || Dir.pwd 136 | while search_dir != "/" 137 | Dir.foreach(search_dir) do |f| 138 | if f == target_dir_name && File.exist?(File.join(search_dir, f,target_file_name)) 139 | return search_dir 140 | end 141 | end 142 | search_dir = File.dirname(search_dir) 143 | end 144 | return search_dir 145 | end 146 | 147 | end 148 | end -------------------------------------------------------------------------------- /lib/amber/static_page.rb: -------------------------------------------------------------------------------- 1 | # 2 | # class StaticPage 3 | # 4 | # represents a static website page. 5 | # see also static_page/*.rb 6 | # 7 | 8 | module Amber 9 | class StaticPage 10 | 11 | attr_accessor :path, # array of path segments 12 | :children, # array of child pages 13 | :name, # the name of the page 14 | :file_path, # 15 | :parent, # parent page (nil for root page) 16 | :config, # associated SiteConfiguration (site might have several) 17 | :site, # associated Site (only one) 18 | :valid # `false` if there is some problem with this page. 19 | 20 | attr_reader :props # set of page properties (PropertySet) 21 | 22 | alias_method :valid?, :valid 23 | 24 | ## 25 | ## INSTANCE METHODS 26 | ## 27 | 28 | FORBIDDEN_PAGE_CHARS_RE = /[A-Z\.\?\|\[\]\{\}\$\^\*~!@#%&='"<>]/ 29 | 30 | def initialize(parent, name, file_path=nil, path_prefix="/") 31 | @valid = true 32 | @children = PageArray.new # array of StaticPages 33 | @nav_title = {} # key is locale 34 | @title = {} # key is locale 35 | 36 | @name, @suffix = parse_source_file_name(name) 37 | 38 | # set @parent & @path 39 | if parent 40 | @parent = parent 41 | @config = @parent.config 42 | @parent.add_child(self) 43 | @path = [@parent.path, @name].flatten.compact 44 | else 45 | @path = (path_prefix||"").split('/') 46 | end 47 | 48 | if @name =~ FORBIDDEN_PAGE_CHARS_RE 49 | Amber.logger.error "Illegal page name #{@name} at path /#{self.path.join('/')} -- must not have symbols, uppercase, or periods." 50 | @valid = false 51 | end 52 | 53 | # set the @file_path 54 | if file_path 55 | @file_path = file_path 56 | elsif @parent && @parent.file_path 57 | @file_path = File.join(@parent.file_path, @name) 58 | else 59 | raise 'file path must be specified or in parent' 60 | end 61 | 62 | @simple_page = !File.directory?(@file_path) 63 | 64 | # eval the property headers, if any 65 | @props = load_properties() 66 | end 67 | 68 | def add_child(page) 69 | @children << page 70 | end 71 | 72 | def all_children 73 | PageArray.new(child_tree.flatten.compact) 74 | end 75 | 76 | def inspect 77 | "<'#{@path.join('/')}' #{children.inspect}>" 78 | end 79 | 80 | def title(locale=I18n.locale) 81 | @title[locale] ||= begin 82 | @props.prop_with_fallback(locale, [:title, :nav_title]) || @name 83 | end 84 | end 85 | 86 | def nav_title(locale=I18n.locale) 87 | @nav_title[locale] ||= begin 88 | @props.prop_with_fallback(locale, [:nav_title, :title]) || @name 89 | end 90 | end 91 | 92 | # 93 | # returns title iff explicitly set. 94 | # 95 | def explicit_title(locale) 96 | @props.prop_without_inheritance(locale, :title) || 97 | @props.prop_without_inheritance(I18n.default_locale, :title) 98 | end 99 | 100 | def id 101 | self.name 102 | end 103 | 104 | # 105 | # returns a child matching +name+, if any. 106 | # 107 | def child(name) 108 | children.detect {|child| child.name == name} 109 | end 110 | 111 | def prop(*args) 112 | @props.prop(*args) 113 | end 114 | 115 | def vars 116 | @vars ||= load_variables 117 | end 118 | 119 | def var(name, locale=I18n.locale) 120 | (vars[locale] || vars[I18n.default_locale] || {})[name.to_s] 121 | end 122 | 123 | # 124 | # Returns array of locale symbols for all locales with properties set 125 | # Note: there might be a content for a locale that does not show up in this array, 126 | # if the content file does not set any properties. 127 | # 128 | def locales 129 | @props.locales 130 | end 131 | 132 | def path_str 133 | self.path.join('/') 134 | end 135 | 136 | # 137 | # returns an array of normalized aliases based on the :alias property 138 | # defined for a page. 139 | # 140 | # aliases are defined with a leading slash for absolute paths, or without a slash 141 | # for relative paths. this method converts this to a format that amber uses 142 | # (all absolute, with no leading slash, as an array instead of a string). 143 | # 144 | def aliases(locale=I18n.default_locale) 145 | @aliases ||= begin 146 | aliases_hash = Hash.new([]) 147 | @props.locales.each do |l| 148 | aliases = @props.prop_without_inheritance(l, :alias) 149 | aliases_hash[l] = begin 150 | if aliases.nil? 151 | [] 152 | else 153 | [aliases].flatten.collect {|alias_path| 154 | if alias_path =~ /^\// 155 | alias_path.sub(/^\//, '').split('/') 156 | elsif @parent 157 | @parent.path + [alias_path] 158 | else 159 | alias_path.split('/') 160 | end 161 | } 162 | end 163 | end 164 | end 165 | aliases_hash 166 | end 167 | @aliases[locale] 168 | end 169 | 170 | protected 171 | 172 | def child_tree 173 | [self, children.collect{|child| child.child_tree}] 174 | end 175 | 176 | end 177 | end -------------------------------------------------------------------------------- /lib/amber/static_page/page_properties.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Holds many PropertySets for a StaticPage, one PropertySet per locale. 3 | # 4 | # setting the property (in en.haml): 5 | # 6 | # - @title = 'hi' 7 | # 8 | # getting the property 9 | # 10 | # page.props.title # Uses I18n.locale 11 | # page.props.prop(:es, :title) # explicitly uses locale :es 12 | # 13 | 14 | require 'i18n' 15 | require 'time' 16 | require 'rubygems' 17 | require 'haml' 18 | require 'RedCloth' 19 | 20 | module Amber 21 | class StaticPage 22 | class PageProperties 23 | 24 | def initialize(page=nil) 25 | @page = page 26 | @locales = {} 27 | end 28 | 29 | # 30 | # evaluate the template_string, and load the variables defined into an AttrObject. 31 | # 32 | def eval(template_string, locale=I18n.default_locale) 33 | locale = locale.to_sym # locales are always symbols 34 | 35 | # render to the template to get the instance variables 36 | ps = PropertySet.new 37 | begin 38 | # template is evaluated with binding of ps object 39 | Haml::Engine.new(template_string, :format => :html5).render(ps) 40 | rescue Exception => exc 41 | raise exc if defined?(TESTING) 42 | end 43 | 44 | # convert date/time variables to objects of class Time 45 | ps.instance_variables.grep(/_at$/).each do |time_variable| 46 | ps.instance_variable_set(time_variable, Time.parse(ps.instance_variable_get(time_variable))) 47 | end 48 | 49 | # save the AttrObject 50 | @locales[locale] = ps 51 | end 52 | 53 | # 54 | # allows property_set.propname shortcut, assumes default locale 55 | # 56 | def method_missing(method) 57 | prop(I18n.locale, method) 58 | end 59 | 60 | #def locale(l) 61 | # @locales[l.to_sym] || @locales[I18n.default_locale] 62 | #end 63 | 64 | # 65 | # get an attribute value for a particular locale. 66 | # if `inherited` is true, we do not consider special non-inheritable properties. 67 | # 68 | def prop(locale, var_name, inherited=false) 69 | return nil unless locale 70 | properties = @locales[locale.to_sym] 71 | value = (properties.get(var_name, inherited) if properties) 72 | if value.nil? && locale != I18n.default_locale 73 | properties = @locales[I18n.default_locale] 74 | value = properties.get(var_name, inherited) if properties 75 | end 76 | if value.nil? && @page && @page.parent 77 | value = @page.parent.prop(locale, var_name, true) 78 | end 79 | value 80 | end 81 | 82 | # 83 | # like prop(), but does not allow inheritance 84 | # 85 | def prop_without_inheritance(locale, var_name) 86 | properties = @locales[locale.to_sym] 87 | if properties 88 | properties.get(var_name) 89 | else 90 | nil 91 | end 92 | end 93 | 94 | # 95 | # like prop_without_inheritance, but defaults to default_locale and tries multiple properties 96 | # 97 | def prop_with_fallback(locale, var_names) 98 | [locale, I18n.default_locale].each do |l| 99 | var_names.each do |var| 100 | value = prop_without_inheritance(l, var) 101 | return value if value 102 | end 103 | end 104 | return nil 105 | end 106 | 107 | def set_prop(locale, var_name, value) 108 | properties = @locales[locale.to_sym] 109 | if properties 110 | properties.set(var_name, value) 111 | end 112 | end 113 | 114 | # 115 | # returns an array of locale symbols that are active for this page. 116 | # 117 | def locales 118 | @locales.keys 119 | end 120 | 121 | # 122 | # tries to get the value of an inherited variable 123 | # 124 | #def get_inherited_var(var_name, locale=I18n.locale) 125 | # if @page && @page.parent && @page.parent.props 126 | # @page.parent.props.get_var(var_name, locale) 127 | # end 128 | #end 129 | end 130 | end 131 | end -------------------------------------------------------------------------------- /lib/amber/static_page/property_set.rb: -------------------------------------------------------------------------------- 1 | # 2 | # A simple class to hold a set of properties for a page. 3 | # 4 | # There is a separate property set for each locale. The PageProperties object holds many PropertySets, one 5 | # for each locale. 6 | # 7 | # When the template for a page is evaluated, all the member variabled defined in that template 8 | # are loaded as member variables of the PropertySet instance. (e.g. properties are eval'ed 9 | # in context of PropertySet instance) 10 | # 11 | # the "@this" variable is to set variables that should not be inherited 12 | # 13 | 14 | module Amber 15 | class StaticPage 16 | class PropertySet 17 | 18 | def initialize 19 | @this = ThisPropertySet.new 20 | end 21 | 22 | def method_missing(method, *args) 23 | if method =~ /=$/ 24 | set(method, args.first) 25 | else 26 | get(method) 27 | end 28 | end 29 | 30 | def textile(str) 31 | RedCloth.new(str).to_html 32 | end 33 | 34 | # 35 | # get the value of a property 36 | # 37 | # the @this properties are non-inheritable. If `inheritable_only` is true, we don't consider them 38 | # when returning the property value. 39 | # 40 | def get(property_name, inheritable_only=false) 41 | if inheritable_only || @this.nil? 42 | safe_instance_get("@#{property_name}") 43 | else 44 | value = @this.get(property_name) 45 | if value.nil? 46 | value = safe_instance_get("@#{property_name}") 47 | end 48 | value 49 | end 50 | end 51 | 52 | # 53 | # set the value of a property 54 | # 55 | # if the property has a non-nil value set in the @this prop set, then we set it there. 56 | # otherwise, it is set in the inheritable set. 57 | # 58 | def set(property_name, value) 59 | property_name = property_name.to_s.sub(/=$/, '') 60 | instance_variable = "@" + property_name 61 | if @this.nil? || @this.get(property_name).nil? 62 | instance_variable_set(instance_variable, value) 63 | else 64 | @this.instance_variable_set(instance_variable, value) 65 | end 66 | end 67 | 68 | def to_s 69 | "<" + instance_variables.map{|v| "#{v}=#{instance_variable_get(v)}"}.join(', ') + ">" 70 | end 71 | 72 | private 73 | 74 | def safe_instance_get(prop_name) 75 | if !instance_variable_defined?(prop_name) 76 | instance_variable_set(prop_name, nil) 77 | end 78 | instance_variable_get(prop_name) 79 | end 80 | end 81 | 82 | class ThisPropertySet < PropertySet 83 | def initialize 84 | @this = nil 85 | end 86 | end 87 | 88 | end 89 | end -------------------------------------------------------------------------------- /lib/amber/static_page/render.rb: -------------------------------------------------------------------------------- 1 | # 2 | # All the StaticPage code that deals with rendering 3 | # 4 | 5 | require 'i18n' 6 | require 'fileutils' 7 | require 'pathname' 8 | 9 | module Amber 10 | class StaticPage 11 | 12 | # 13 | # render without layout, possibly with via a rails request 14 | # 15 | # RAILS 16 | # def render_to_string(renderer=nil) 17 | # begin 18 | # render_locale(renderer, I18n.locale) 19 | # rescue ActionView::MissingTemplate, MissingTemplate => exc 20 | # begin 21 | # render_locale(renderer, I18n.default_locale) 22 | # rescue 23 | # Amber.logger.error "ERROR: could not file template path #{self.template_path}" 24 | # raise exc 25 | # end 26 | # end 27 | # end 28 | 29 | # 30 | # render a static copy 31 | # 32 | # dest_dir - e.g. amber_root/public/ 33 | # 34 | def render_to_file(dest_dir, options={}) 35 | render_content_files(dest_dir, options) 36 | render_assets(dest_dir) 37 | @props.locales.each do |locale| 38 | if aliases(locale).any? 39 | link_page_aliases(dest_dir, aliases(locale), locale) 40 | end 41 | end 42 | end 43 | 44 | # 45 | # creates symlinks for aliases to this page. 46 | # called by Page#render_to_file and Site#render_short_path_aliases 47 | # 48 | def link_page_aliases(dest_dir, alias_paths, locale=I18n.default_locale) 49 | alias_paths.each do |alias_path| 50 | alias_file_path = File.join(dest_dir, alias_path) 51 | #if locale != I18n.default_locale 52 | # alias_file_path += ".#{locale}" 53 | #end 54 | alias_file_path = Pathname.new(alias_file_path) 55 | page_file_path = Pathname.new(File.join(dest_dir, *@path)) 56 | symlink(page_file_path, alias_file_path) 57 | end 58 | end 59 | 60 | private 61 | 62 | # RAILS 63 | # def render_locale(renderer, locale) 64 | # if renderer && is_haml_template?(locale) 65 | # renderer.render_to_string(:template => self.template_path(locale), :layout => false).html_safe 66 | # else 67 | # render_static_locale(locale).html_safe 68 | # end 69 | # end 70 | 71 | # RAILS 72 | # def render_static_locale(locale) 73 | # content_files.each do |file_locale, content_file| 74 | # if locale == file_locale 75 | # return Render::View.new(self, self.mount_point).render({file: content_file}, {locale: file_locale}) 76 | # end 77 | # end 78 | # raise MissingTemplate.new(template_path(locale)) 79 | # end 80 | 81 | # called only by render_to_file 82 | def render_assets(dest_dir) 83 | asset_files.each do |asset_file| 84 | src_file = File.join(@file_path, asset_file) 85 | dst_file = File.join(dest_dir, *@path, asset_file) 86 | Render::Asset.render(src_file, dst_file) 87 | end 88 | end 89 | 90 | # 91 | # create a symlink. arguments must be of type Pathname. 92 | # 93 | def symlink(from_path, to_path) 94 | to_path = realpath(to_path) 95 | target = from_path.relative_path_from(to_path).to_s.sub(/^\.\.\//, '') 96 | if !to_path.dirname.directory? 97 | Amber.logger.warn { "On page `#{@file_path}`, the parent directories for alias name `#{to_path}` don't exist. Skipping alias." } 98 | return 99 | end 100 | if to_path.exist? && to_path.symlink? 101 | File.unlink(to_path) 102 | end 103 | if !to_path.exist? 104 | Amber.logger.debug { "Symlink #{to_path} => #{target}" } 105 | FileUtils.ln_s(target, to_path) 106 | end 107 | end 108 | 109 | def realpath(pathname) 110 | dir = pathname.dirname 111 | if dir.directory? || dir.symlink? 112 | dir.realpath + pathname.basename 113 | else 114 | pathname 115 | end 116 | end 117 | 118 | # called only by render_to_file 119 | def render_content_files(dest_dir, options) 120 | view = Render::View.new(self, @config) 121 | @config.locales.each do |file_locale| 122 | content_file = content_file(file_locale) 123 | next unless content_file 124 | dest = destination_file(dest_dir, file_locale) 125 | unless Dir.exist?(File.dirname(dest)) 126 | FileUtils.mkdir_p(File.dirname(dest)) 127 | end 128 | if options[:force] || !File.exist?(dest) || File.mtime(content_file) > File.mtime(dest) 129 | File.open(dest, 'w') do |f| 130 | layout = @props.layout || 'default' 131 | f.write view.render({page: self, layout: layout}, {locale: file_locale}) 132 | end 133 | end 134 | end 135 | end 136 | 137 | end 138 | end -------------------------------------------------------------------------------- /lib/amber/templates/apache_config.erb: -------------------------------------------------------------------------------- 1 | AccessFileName .htaccess 2 | DocumentRoot "/<%= @directory %>" 3 | "> 4 | AllowOverride FileInfo Indexes Options=All,MultiViews 5 | 6 | Order deny,allow 7 | Allow from all 8 | 9 | 10 | Require all granted 11 | 12 | -------------------------------------------------------------------------------- /lib/amber/templates/apache_config_with_prefix.erb: -------------------------------------------------------------------------------- 1 | AccessFileName .htaccess 2 | AliasMatch ^/[a-z]{2}/<%=@site.path_prefix%>(/.+|/|)$ "/<%=@directory%>/$1" 3 | Alias /<%=@site.path_prefix%> "/<%=@directory%>/" 4 | 5 | /"> 6 | AllowOverride FileInfo Indexes Options=All,MultiViews 7 | 8 | Order deny,allow 9 | Allow from all 10 | 11 | 12 | Require all granted 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/amber/templates/config.rb: -------------------------------------------------------------------------------- 1 | @title = "Your site's title" 2 | @default_locale = :en 3 | @locales = [:en, :fr] 4 | @short_paths = true 5 | -------------------------------------------------------------------------------- /lib/amber/version.rb: -------------------------------------------------------------------------------- 1 | module Amber 2 | unless defined?(Amber::VERSION) 3 | VERSION = '0.3.12' 4 | end 5 | end -------------------------------------------------------------------------------- /locales/rails-i18n/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2008-2012 Sven Fuchs and contributors (see https://github.com/svenfuchs/rails-i18n/contributors) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /locales/rails-i18n/README.md: -------------------------------------------------------------------------------- 1 | This is a copy of https://github.com/svenfuchs/rails-i18n 2 | 3 | We don't use the gem, because we don't want the railties dependency. 4 | 5 | -------------------------------------------------------------------------------- /locales/rails-i18n/az.yml: -------------------------------------------------------------------------------- 1 | az: 2 | date: 3 | abbr_day_names: 4 | - B. 5 | - B.E. 6 | - Ç.A. 7 | - Ç. 8 | - C.A. 9 | - C. 10 | - Ş. 11 | abbr_month_names: 12 | - 13 | - Yan 14 | - Fev 15 | - Mar 16 | - Apr 17 | - May 18 | - İyn 19 | - İyl 20 | - Avq 21 | - Sen 22 | - Okt 23 | - Noy 24 | - Dek 25 | day_names: 26 | - Bazar 27 | - Bazar ertəsi 28 | - Çərşənbə axşamı 29 | - Çərşənbə 30 | - Cümə axşamı 31 | - Cümə 32 | - Şənbə 33 | formats: 34 | default: ! '%d.%m.%Y' 35 | long: ! '%d %B %Y' 36 | short: ! '%d %b' 37 | month_names: 38 | - 39 | - Yanvar 40 | - Fevral 41 | - Mart 42 | - Aprel 43 | - May 44 | - İyun 45 | - İyul 46 | - Avqust 47 | - Sentyabr 48 | - Oktyabr 49 | - Noyabr 50 | - Dekabr 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: təxminən 1 saat 59 | other: təxminən %{count} saat 60 | about_x_months: 61 | one: təxminən 1 ay 62 | other: təxminən %{count} ay 63 | about_x_years: 64 | one: təxminən 1 il 65 | other: təxminən %{count} il 66 | almost_x_years: 67 | one: təqribən 1 il 68 | other: təqribən %{count} il 69 | half_a_minute: yarım dəqiqə 70 | less_than_x_minutes: 71 | one: 1 dəqiqədən az 72 | other: ! '%{count} dəqiqədən az' 73 | less_than_x_seconds: 74 | one: 1 saniyədən az 75 | other: ! '%{count} saniyədən az' 76 | over_x_years: 77 | one: 1 ildən çox 78 | other: ! '%{count} ildən çox' 79 | x_days: 80 | one: 1 gün 81 | other: ! '%{count} gün' 82 | x_minutes: 83 | one: 1 dəqiqə 84 | other: ! '%{count} dəqiqə' 85 | x_months: 86 | one: 1 ay 87 | other: ! '%{count} ay' 88 | x_seconds: 89 | one: 1 saniyə 90 | other: ! '%{count} saniyə' 91 | prompts: 92 | day: Gün 93 | hour: Saat 94 | minute: Dəqiqə 95 | month: Ay 96 | second: Saniyə 97 | year: İl 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: qəbul olunmalıdır 102 | blank: boş ola bilməz 103 | confirmation: təsdiqə uygun deyil 104 | empty: boş ola bilməz 105 | equal_to: ! '%{count}-ə bərabər olmalıdır' 106 | even: cüt olmalıdır 107 | exclusion: qorunur 108 | greater_than: ! '%{count}-dən böyük olmalıdır' 109 | greater_than_or_equal_to: böyük və ya %{count}-ə bərabər olmalıdır 110 | inclusion: siyahiyə daxil deyil 111 | invalid: yalnışdır 112 | less_than: ! '%{count}-dən kiçik olmalıdır' 113 | less_than_or_equal_to: kiçik və ya %{count}-ə bərabər olmalıdır 114 | not_a_number: rəqəm deyil 115 | not_an_integer: tam rəqəm olmalıdır 116 | odd: tək olmalıdır 117 | record_invalid: ! 'Yoxlama uğursuz oldu: %{errors}' 118 | taken: artıq mövcuddur 119 | too_long: çox uzundur (%{count} simvoldan çox olmalı deyil) 120 | too_short: çox qısadır (%{count} simvoldan az olmalı deyil) 121 | wrong_length: uzunluqu səhvdir (%{count} simvol olmalıdır) 122 | template: 123 | body: ! 'Aşağıdaki səhvlər üzə çıxdı:' 124 | header: 125 | one: ! '%{model} saxlanmadı: 1 səhv' 126 | other: ! '%{model} saxlanmadı: %{count} səhv' 127 | helpers: 128 | select: 129 | prompt: Seçin 130 | submit: 131 | create: ! '%{model} yarat' 132 | submit: ! '%{model} saxla' 133 | update: ! '%{model} yenilə' 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ' ' 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: AZN 144 | format: 145 | delimiter: ! ' ' 146 | precision: 3 147 | separator: . 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: Milyard 155 | million: Milyon 156 | quadrillion: Katrilyon 157 | thousand: Min 158 | trillion: Trilyon 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: false 164 | strip_insignificant_zeros: false 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Bayt 170 | other: Bayt 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' və ' 184 | two_words_connector: ! ' və ' 185 | words_connector: ! ', ' 186 | time: 187 | am: günortaya qədər 188 | formats: 189 | default: ! '%a, %d %b %Y, %H:%M:%S %z' 190 | long: ! '%d %B %Y, %H:%M' 191 | short: ! '%d %b, %H:%M' 192 | pm: günortadan sonra 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/bn.yml: -------------------------------------------------------------------------------- 1 | bn: 2 | date: 3 | abbr_day_names: 4 | - রবিবার 5 | - সোমবার 6 | - মঙ্গলবার 7 | - বুধবার 8 | - বৃহস্পতিবার 9 | - শুক্রবার 10 | - শনিবার 11 | abbr_month_names: 12 | - 13 | - জানুয়ারি 14 | - ফেব্রুয়ারি 15 | - মার্চ 16 | - এপ্রিল 17 | - মে 18 | - জুন 19 | - জুলাই 20 | - অগাস্ট 21 | - সেপ্টেমবার 22 | - অক্টোবার 23 | - নভেম্বার 24 | - ডিসেম্বার 25 | day_names: 26 | - রবিবার 27 | - সোমবার 28 | - মঙ্গলবার 29 | - বুধবার 30 | - বৃহস্পতিবার 31 | - শুক্রবার 32 | - শনিবার 33 | formats: 34 | default: ! '%e/%m/%Y' 35 | long: ! '%e de %B de %Y' 36 | short: ! '%e de %b' 37 | month_names: 38 | - 39 | - জানুয়ারি 40 | - ফেব্রুয়ারি 41 | - মার্চ 42 | - এপ্রিল 43 | - মে 44 | - জুন 45 | - জুলাই 46 | - অগাস্ট 47 | - সেপ্টেমবার 48 | - অক্টোবার 49 | - নভেম্বার 50 | - ডিসেম্বার 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: প্রায় ১ ঘন্টা 59 | other: প্রায় %{count} ঘন্টা 60 | about_x_months: 61 | one: প্রায় ১ মাস 62 | other: প্রায় %{count} মাস 63 | about_x_years: 64 | one: প্রায় ১ বছর 65 | other: প্রায় %{count} বছর 66 | half_a_minute: অার্ধেক মিনিট 67 | less_than_x_minutes: 68 | one: ১ মিনিটের কম 69 | other: ! '%{count} মিনিটের কম' 70 | less_than_x_seconds: 71 | one: ! '১ সেকেন্ডর কম ' 72 | other: ! '%{count} সেকেন্ডের কম' 73 | over_x_years: 74 | one: ১ বছরের বেশি 75 | other: ! '%{count} বছরের বেশি' 76 | x_days: 77 | one: ১ দিন 78 | other: ! '%{count} দিন' 79 | x_minutes: 80 | one: ১ মিনিট 81 | other: ! '%{count} মিনিট' 82 | x_months: 83 | one: ১ মাস 84 | other: ! '%{count} মাস' 85 | x_seconds: 86 | one: ১ সেকেন্ড 87 | other: ! '%{count} সেকেন্ড' 88 | prompts: 89 | day: দিন 90 | hour: ঘন্টা 91 | minute: মিনিট 92 | month: মাস 93 | second: সেকেন্ড 94 | year: বছর 95 | errors: 96 | format: ! '%{attribute} %{message}' 97 | messages: 98 | accepted: গ্রাহ্য করতে হবে 99 | blank: ফাঁকা রাখা যাবে না 100 | confirmation: অনুমোদনের সঙ্গে মিলছে না 101 | empty: খালি রাখা যাবে না 102 | equal_to: ! '%{count} এর সঙ্গে সমান হতে হবে' 103 | even: জোড় হতে হবে 104 | exclusion: রিসার্ভ করা অাছে 105 | greater_than: ! '%{count} থেকে বড়ো হতে হবে' 106 | greater_than_or_equal_to: ! '%{count} থেকে বড়ো অথবা তার সমান হতে হবে' 107 | inclusion: লিস্টে অন্তর্ভুক্ত নয় 108 | invalid: সঠিক নয় 109 | less_than: ! '%{count} থেকে ছোটো হতে হবে' 110 | less_than_or_equal_to: ! '%{count} থেকে ছোটো অথবা তার সমান হতে হবে' 111 | not_a_number: নম্বর নয় 112 | odd: বেজোড় হতে হবে 113 | taken: অাগেই নিয়ে নেওয়া হয়েছে 114 | too_long: খুব বড়ো (সর্বোচ্চ %{count} অক্ষর) 115 | too_short: খুব ছোটো (সর্বনিম্ন %{count} অক্ষর) 116 | wrong_length: দৈর্ঘ্যটি সঠিক নয় (%{count} অক্ষর হতে হবে) 117 | template: 118 | body: ! 'এই ফিল্ডগুলোতে কিছু সমস্যা দেখা দিয়েছে:' 119 | header: 120 | one: ১ টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি 121 | other: ! '%{count} টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি' 122 | number: 123 | currency: 124 | format: 125 | delimiter: ! ',' 126 | format: ! '%u %n' 127 | precision: 2 128 | separator: . 129 | significant: false 130 | strip_insignificant_zeros: false 131 | unit: ₹ 132 | format: 133 | delimiter: ! ',' 134 | precision: 2 135 | separator: . 136 | significant: false 137 | strip_insignificant_zeros: false 138 | human: 139 | decimal_units: 140 | format: ! '%n %u' 141 | units: 142 | unit: '' 143 | format: 144 | delimiter: '' 145 | precision: 1 146 | significant: true 147 | strip_insignificant_zeros: true 148 | storage_units: 149 | format: ! '%n %u' 150 | units: 151 | byte: 152 | one: Byte 153 | other: Bytes 154 | gb: GB 155 | kb: KB 156 | mb: MB 157 | tb: TB 158 | percentage: 159 | format: 160 | delimiter: '' 161 | precision: 162 | format: 163 | delimiter: '' 164 | support: 165 | array: 166 | last_word_connector: ! ', এবং ' 167 | two_words_connector: ! ' এবং ' 168 | words_connector: ! ', ' 169 | time: 170 | am: am 171 | formats: 172 | default: ! '%A, %e de %B de %Y %H:%M:%S %z' 173 | long: ! '%e de %B de %Y %H:%M' 174 | short: ! '%e de %b %H:%M' 175 | pm: pm 176 | -------------------------------------------------------------------------------- /locales/rails-i18n/ca.yml: -------------------------------------------------------------------------------- 1 | ca: 2 | date: 3 | abbr_day_names: 4 | - Dg 5 | - Dl 6 | - Dm 7 | - Dc 8 | - Dj 9 | - Dv 10 | - Ds 11 | abbr_month_names: 12 | - 13 | - Gen 14 | - Feb 15 | - Mar 16 | - Abr 17 | - Mai 18 | - Jun 19 | - Jul 20 | - Ago 21 | - Set 22 | - Oct 23 | - Nov 24 | - Des 25 | day_names: 26 | - Diumenge 27 | - Dilluns 28 | - Dimarts 29 | - Dimecres 30 | - Dijous 31 | - Divendres 32 | - Dissabte 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%d de %B de %Y' 36 | short: ! '%d de %b' 37 | month_names: 38 | - 39 | - Gener 40 | - Febrer 41 | - Març 42 | - Abril 43 | - Maig 44 | - Juny 45 | - Juliol 46 | - Agost 47 | - Setembre 48 | - Octubre 49 | - Novembre 50 | - Desembre 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: aproximadament 1 hora 59 | other: aproximadament %{count} hores 60 | about_x_months: 61 | one: aproximadament 1 mes 62 | other: aproximadament %{count} mesos 63 | about_x_years: 64 | one: aproximadament 1 any 65 | other: aproximadament %{count} anys 66 | almost_x_years: 67 | one: quasi 1 any 68 | other: quasi %{count} anys 69 | half_a_minute: mig minut 70 | less_than_x_minutes: 71 | one: menys d'1 minut 72 | other: menys de %{count} minuts 73 | less_than_x_seconds: 74 | one: menys d'1 segon 75 | other: menys de %{count} segons 76 | over_x_years: 77 | one: més d'1 any 78 | other: més de %{count} anys 79 | x_days: 80 | one: 1 dia 81 | other: ! '%{count} dies' 82 | x_minutes: 83 | one: 1 minut 84 | other: ! '%{count} minuts' 85 | x_months: 86 | one: 1 mes 87 | other: ! '%{count} mesos' 88 | x_seconds: 89 | one: 1 segon 90 | other: ! '%{count} segons' 91 | prompts: 92 | day: dia 93 | hour: hora 94 | minute: minut 95 | month: mes 96 | second: segon 97 | year: any 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: ha de ser acceptat 102 | blank: no pot estar en blanc 103 | confirmation: no coincideix 104 | empty: no pot estar buit 105 | equal_to: ha de ser igual a %{count} 106 | even: ha de ser parell 107 | exclusion: està reservat 108 | greater_than: ha de ser més gran que %{count} 109 | greater_than_or_equal_to: ha de ser més gran o igual a %{count} 110 | inclusion: no està inclós a la llista 111 | invalid: no és vàlid 112 | less_than: ha de ser menor que %{count} 113 | less_than_or_equal_to: ha de ser menor o igual a %{count} 114 | not_a_number: no és un número 115 | not_an_integer: ha de ser un enter 116 | odd: ha de ser senar 117 | record_invalid: ! 'La validació ha fallat: %{errors}' 118 | taken: no està disponible 119 | too_long: és massa llarg (%{count} caràcters màxim) 120 | too_short: és massa curt (%{count} caràcters mínim) 121 | wrong_length: no té la longitud correcta (%{count} caràcters exactament) 122 | template: 123 | body: ! 'Hi ha hagut problemes amb els següents camps:' 124 | header: 125 | one: No s'ha pogut desar aquest/a %{model} perquè hi ha 1 error 126 | other: No s'ha pogut desar aquest/a %{model} perquè hi ha hagut %{count} errors 127 | helpers: 128 | select: 129 | prompt: Si us plau tria 130 | submit: 131 | create: Crear %{model} 132 | submit: Guardar %{model} 133 | update: Actualitzar %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: € 144 | format: 145 | delimiter: . 146 | precision: 3 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: mil milions 155 | million: milió 156 | quadrillion: quadrilió 157 | thousand: mil 158 | trillion: trilió 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', i ' 184 | two_words_connector: ! ' i ' 185 | words_connector: ! ', ' 186 | time: 187 | am: am 188 | formats: 189 | default: ! '%A, %d de %B de %Y %H:%M:%S %z' 190 | long: ! '%d de %B de %Y %H:%M' 191 | short: ! '%d de %b %H:%M' 192 | pm: pm 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/eo.yml: -------------------------------------------------------------------------------- 1 | eo: 2 | date: 3 | abbr_day_names: 4 | - dim 5 | - lun 6 | - mar 7 | - mer 8 | - ĵaŭ 9 | - ven 10 | - sam 11 | abbr_month_names: 12 | - 13 | - jan. 14 | - feb. 15 | - mar. 16 | - apr. 17 | - majo 18 | - jun. 19 | - jul. 20 | - aŭg. 21 | - sep. 22 | - okt. 23 | - nov. 24 | - dec. 25 | day_names: 26 | - dimanĉo 27 | - lundo 28 | - mardo 29 | - merkredo 30 | - ĵaŭdo 31 | - vendredo 32 | - sabato 33 | formats: 34 | default: ! '%Y/%m/%d' 35 | long: ! '%e %B %Y' 36 | short: ! '%e %b' 37 | month_names: 38 | - 39 | - januaro 40 | - februaro 41 | - marto 42 | - aprilo 43 | - majo 44 | - junio 45 | - julio 46 | - aŭgusto 47 | - septembro 48 | - oktobro 49 | - novembro 50 | - decembro 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: ĉirkaŭ unu horo 59 | other: ĉirkaŭ %{count} horoj 60 | about_x_months: 61 | one: ĉirkaŭ unu monato 62 | other: ĉirkaŭ %{count} monatoj 63 | about_x_years: 64 | one: ĉirkaŭ uno jaro 65 | other: ĉirkaŭ %{count} jaroj 66 | almost_x_years: 67 | one: preskaŭ unu jaro 68 | other: preskaŭ %{count} jaroj 69 | half_a_minute: duona minuto 70 | less_than_x_minutes: 71 | one: malpli ol unu minuto 72 | other: malpli ol %{count} minutoj 73 | zero: malpli ol unu minuto 74 | less_than_x_seconds: 75 | one: malpli ol unu sekundo 76 | other: malpli ol %{count} sekundoj 77 | zero: malpli ol unu sekundo 78 | over_x_years: 79 | one: pli ol unu jaro 80 | other: pli ol %{count} jaroj 81 | x_days: 82 | one: 1 tago 83 | other: ! '%{count} tagoj' 84 | x_minutes: 85 | one: 1 minuto 86 | other: ! '%{count} minutoj' 87 | x_months: 88 | one: 1 monato 89 | other: ! '%{count} monatoj' 90 | x_seconds: 91 | one: 1 sekundo 92 | other: ! '%{count} sekundoj' 93 | prompts: 94 | day: Tago 95 | hour: Horo 96 | minute: Minuto 97 | month: Monato 98 | second: Sekundo 99 | year: Jaro 100 | errors: 101 | format: ! '%{attribute} %{message}' 102 | messages: 103 | accepted: devas esti akceptita 104 | blank: devas esti kompletigita 105 | confirmation: ne kongruas kun la konfirmo 106 | empty: devas esti kompletigita 107 | equal_to: devas egali %{count} 108 | even: devas esti para 109 | exclusion: ne estas disponebla 110 | greater_than: devas superi %{count} 111 | greater_than_or_equal_to: devas superi aŭ egali %{count} 112 | inclusion: ne estas inkluzivita de la listo 113 | invalid: estas nevalida 114 | less_than: devas malsuperi %{count} 115 | less_than_or_equal_to: devas malsuperi aŭ egali %{count} 116 | not_a_number: ne estas nombro 117 | not_an_integer: devas esti entjero 118 | odd: devas esti nepara 119 | record_invalid: ! 'Validado malsukcesis: %{errors}' 120 | taken: ne estas disponebla 121 | too_long: estas tro longa (maksimume %{count} karekteroj) 122 | too_short: estas tro mallonga (minimume %{count} karakteroj) 123 | wrong_length: ne estas je ĝusta longo (devas enhavi %{count} karakterojn) 124 | template: 125 | body: ! 'Kontrolu la jenajn kampojn: ' 126 | header: 127 | one: ! 'Ne eblas registri tiun %{model}: 1 eraro' 128 | other: ! 'Ne eblas registri tiun %{model}: %{count} eraroj' 129 | helpers: 130 | select: 131 | prompt: Bonvolu elekti 132 | submit: 133 | create: Krei %{model} 134 | submit: Registri tiun %{model} 135 | update: Modifi tiun %{model} 136 | number: 137 | currency: 138 | format: 139 | delimiter: ! ' ' 140 | format: ! '%n %u' 141 | precision: 2 142 | separator: ! ',' 143 | significant: false 144 | strip_insignificant_zeros: false 145 | unit: € 146 | format: 147 | delimiter: ! ' ' 148 | precision: 3 149 | separator: ! ',' 150 | significant: false 151 | strip_insignificant_zeros: false 152 | human: 153 | decimal_units: 154 | format: ! '%n %u' 155 | units: 156 | billion: miliardo 157 | million: miliono 158 | quadrillion: miliono da miliardoj 159 | thousand: mil 160 | trillion: mil miliardoj 161 | unit: '' 162 | format: 163 | delimiter: '' 164 | precision: 2 165 | significant: true 166 | strip_insignificant_zeros: true 167 | storage_units: 168 | format: ! '%n %u' 169 | units: 170 | byte: 171 | one: bitoko 172 | other: bitokoj 173 | gb: Gb 174 | kb: kb 175 | mb: Mb 176 | tb: Tb 177 | percentage: 178 | format: 179 | delimiter: '' 180 | precision: 181 | format: 182 | delimiter: '' 183 | support: 184 | array: 185 | last_word_connector: ! ' kaj ' 186 | two_words_connector: ! ' kaj ' 187 | words_connector: ! ', ' 188 | time: 189 | am: am 190 | formats: 191 | default: ! '%d %B %Y %H:%M:%S' 192 | long: ! '%A %d %B %Y %H:%M' 193 | short: ! '%d %b %H:%M' 194 | pm: pm 195 | -------------------------------------------------------------------------------- /locales/rails-i18n/es-CL.yml: -------------------------------------------------------------------------------- 1 | es-CL: 2 | date: 3 | abbr_day_names: 4 | - dom 5 | - lun 6 | - mar 7 | - mié 8 | - jue 9 | - vie 10 | - sáb 11 | abbr_month_names: 12 | - 13 | - ene 14 | - feb 15 | - mar 16 | - abr 17 | - may 18 | - jun 19 | - jul 20 | - ago 21 | - sep 22 | - oct 23 | - nov 24 | - dic 25 | day_names: 26 | - domingo 27 | - lunes 28 | - martes 29 | - miércoles 30 | - jueves 31 | - viernes 32 | - sábado 33 | formats: 34 | default: ! '%d/%m/%Y' 35 | long: ! '%A %d de %B de %Y' 36 | short: ! '%d de %b' 37 | month_names: 38 | - 39 | - enero 40 | - febrero 41 | - marzo 42 | - abril 43 | - mayo 44 | - junio 45 | - julio 46 | - agosto 47 | - septiembre 48 | - octubre 49 | - noviembre 50 | - diciembre 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: alrededor de 1 hora 59 | other: alrededor de %{count} horas 60 | about_x_months: 61 | one: alrededor de 1 mes 62 | other: alrededor de %{count} meses 63 | about_x_years: 64 | one: alrededor de 1 año 65 | other: alrededor de %{count} años 66 | almost_x_years: 67 | one: casi 1 año 68 | other: casi %{count} años 69 | half_a_minute: medio minuto 70 | less_than_x_minutes: 71 | one: menos de 1 minuto 72 | other: menos de %{count} minutos 73 | less_than_x_seconds: 74 | one: menos de 1 segundo 75 | other: menos de %{count} segundos 76 | over_x_years: 77 | one: más de 1 año 78 | other: más de %{count} años 79 | x_days: 80 | one: 1 día 81 | other: ! '%{count} días' 82 | x_minutes: 83 | one: 1 minuto 84 | other: ! '%{count} minutos' 85 | x_months: 86 | one: 1 mes 87 | other: ! '%{count} meses' 88 | x_seconds: 89 | one: 1 segundo 90 | other: ! '%{count} segundos' 91 | prompts: 92 | day: Día 93 | hour: Hora 94 | minute: Minutos 95 | month: Mes 96 | second: Segundos 97 | year: Año 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: debe ser aceptado 102 | blank: no puede estar en blanco 103 | confirmation: no coincide 104 | empty: no puede estar vacío 105 | equal_to: debe ser igual a %{count} 106 | even: debe ser par 107 | exclusion: está reservado 108 | greater_than: debe ser mayor que %{count} 109 | greater_than_or_equal_to: debe ser mayor que o igual a %{count} 110 | inclusion: no está incluido en la lista 111 | invalid: no es válido 112 | less_than: debe ser menor que %{count} 113 | less_than_or_equal_to: debe ser menor que o igual a %{count} 114 | not_a_number: no es un número 115 | not_an_integer: debe ser un entero 116 | odd: debe ser impar 117 | record_invalid: ! 'La validación falló: %{errors}' 118 | taken: ya está en uso 119 | too_long: es demasiado largo (%{count} caracteres máximo) 120 | too_short: es demasiado corto (%{count} caracteres mínimo) 121 | wrong_length: no tiene la longitud correcta (%{count} caracteres exactos) 122 | template: 123 | body: ! 'Se encontraron problemas con los siguientes campos:' 124 | header: 125 | one: No se pudo guardar este/a %{model} porque se encontró 1 error 126 | other: No se pudo guardar este/a %{model} porque se encontraron %{count} errores 127 | helpers: 128 | select: 129 | prompt: Por favor seleccione 130 | submit: 131 | create: Crear %{model} 132 | submit: Guardar %{model} 133 | update: Actualizar %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%u %n' 139 | precision: 0 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: $ 144 | format: 145 | delimiter: . 146 | precision: 3 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: mil millones 155 | million: millón 156 | quadrillion: mil billones 157 | thousand: mil 158 | trillion: billón 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', y ' 184 | two_words_connector: ! ' y ' 185 | words_connector: ! ', ' 186 | time: 187 | am: am 188 | formats: 189 | default: ! '%A, %d de %B de %Y %H:%M:%S %z' 190 | long: ! '%A %d de %B de %Y %H:%M' 191 | short: ! '%d de %b %H:%M' 192 | pm: pm 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/es-PE.yml: -------------------------------------------------------------------------------- 1 | es-PE: 2 | date: 3 | abbr_day_names: 4 | - dom 5 | - lun 6 | - mar 7 | - mié 8 | - jue 9 | - vie 10 | - sáb 11 | abbr_month_names: 12 | - 13 | - ene 14 | - feb 15 | - mar 16 | - abr 17 | - may 18 | - jun 19 | - jul 20 | - ago 21 | - sep 22 | - oct 23 | - nov 24 | - dic 25 | day_names: 26 | - domingo 27 | - lunes 28 | - martes 29 | - miércoles 30 | - jueves 31 | - viernes 32 | - sábado 33 | formats: 34 | default: ! '%d/%m/%Y' 35 | long: ! '%A, %d de %B del %Y' 36 | short: ! '%d de %b' 37 | month_names: 38 | - 39 | - enero 40 | - febrero 41 | - marzo 42 | - abril 43 | - mayo 44 | - junio 45 | - julio 46 | - agosto 47 | - septiembre 48 | - octubre 49 | - noviembre 50 | - diciembre 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: cerca de 1 hora 59 | other: cerca de %{count} horas 60 | about_x_months: 61 | one: cerca de 1 mes 62 | other: cerca de %{count} meses 63 | about_x_years: 64 | one: cerca de 1 año 65 | other: cerca de %{count} años 66 | half_a_minute: medio minuto 67 | less_than_x_minutes: 68 | one: menos de 1 minuto 69 | other: menos de %{count} minutos 70 | less_than_x_seconds: 71 | one: menos de 1 segundo 72 | other: menos de %{count} segundos 73 | over_x_years: 74 | one: más de 1 año 75 | other: más de %{count} años 76 | x_days: 77 | one: 1 día 78 | other: ! '%{count} días' 79 | x_minutes: 80 | one: 1 minuto 81 | other: ! '%{count} minutos' 82 | x_months: 83 | one: 1 mes 84 | other: ! '%{count} meses' 85 | x_seconds: 86 | one: 1 segundo 87 | other: ! '%{count} segundos' 88 | prompts: 89 | day: Día 90 | hour: Hora 91 | minute: Minuto 92 | month: Mes 93 | second: Segundos 94 | year: Año 95 | errors: 96 | format: ! '%{attribute} %{message}' 97 | messages: 98 | accepted: debe ser aceptado 99 | blank: no puede estar en blanco 100 | confirmation: no coincide 101 | empty: no puede estar vacío 102 | equal_to: debe ser igual a %{count} 103 | even: debe ser un número par 104 | exclusion: está reservado 105 | greater_than: debe ser mayor que %{count} 106 | greater_than_or_equal_to: debe ser mayor o igual que %{count} 107 | inclusion: no está incluido en la lista 108 | invalid: es inválido 109 | less_than: debe ser menor que %{count} 110 | less_than_or_equal_to: debe ser menor o igual que %{count} 111 | not_a_number: no es un número 112 | odd: debe ser un número non 113 | record_invalid: ! 'Falla de validación: %{errors}' 114 | taken: ya ha sido tomado 115 | too_long: 116 | one: es demasiado largo (máximo 1 caracter) 117 | other: es demasiado largo (máximo %{count} caracteres) 118 | too_short: 119 | one: es demasiado corto (mínimo 1 caracter) 120 | other: es demasiado corto (mínimo %{count} caracteres) 121 | wrong_length: 122 | one: longitud errónea (debe ser de 1 caracter) 123 | other: longitud errónea (debe ser de %{count} caracteres) 124 | template: 125 | body: ! 'Revise que los siguientes campos sean válidos:' 126 | header: 127 | one: ! '%{model} no pudo guardarse debido a 1 error' 128 | other: ! '%{model} no pudo guardarse debido a %{count} errores' 129 | number: 130 | currency: 131 | format: 132 | delimiter: ! ',' 133 | format: ! '%u%n' 134 | precision: 2 135 | separator: . 136 | significant: false 137 | strip_insignificant_zeros: false 138 | unit: S./ 139 | format: 140 | delimiter: ! ',' 141 | precision: 2 142 | separator: . 143 | significant: false 144 | strip_insignificant_zeros: false 145 | human: 146 | decimal_units: 147 | format: ! '%n %u' 148 | units: 149 | unit: '' 150 | format: 151 | delimiter: ! ',' 152 | precision: 2 153 | significant: true 154 | strip_insignificant_zeros: true 155 | storage_units: 156 | format: ! '%n %u' 157 | units: 158 | byte: 159 | one: Byte 160 | other: Bytes 161 | gb: GB 162 | kb: KB 163 | mb: MB 164 | tb: TB 165 | percentage: 166 | format: 167 | delimiter: ! ',' 168 | precision: 169 | format: 170 | delimiter: ! ',' 171 | time: 172 | am: am 173 | formats: 174 | default: ! '%a, %d de %b del %Y a las %H:%M:%S %Z' 175 | long: ! '%A, %d de %B del %Y a las %I:%M %p' 176 | short: ! '%d de %b a las %H:%M hrs' 177 | pm: pm 178 | -------------------------------------------------------------------------------- /locales/rails-i18n/es.yml: -------------------------------------------------------------------------------- 1 | es: 2 | date: 3 | abbr_day_names: 4 | - dom 5 | - lun 6 | - mar 7 | - mié 8 | - jue 9 | - vie 10 | - sáb 11 | abbr_month_names: 12 | - 13 | - ene 14 | - feb 15 | - mar 16 | - abr 17 | - may 18 | - jun 19 | - jul 20 | - ago 21 | - sep 22 | - oct 23 | - nov 24 | - dic 25 | day_names: 26 | - domingo 27 | - lunes 28 | - martes 29 | - miércoles 30 | - jueves 31 | - viernes 32 | - sábado 33 | formats: 34 | default: ! '%d/%m/%Y' 35 | long: ! '%d de %B de %Y' 36 | short: ! '%d de %b' 37 | month_names: 38 | - 39 | - enero 40 | - febrero 41 | - marzo 42 | - abril 43 | - mayo 44 | - junio 45 | - julio 46 | - agosto 47 | - septiembre 48 | - octubre 49 | - noviembre 50 | - diciembre 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: alrededor de 1 hora 59 | other: alrededor de %{count} horas 60 | about_x_months: 61 | one: alrededor de 1 mes 62 | other: alrededor de %{count} meses 63 | about_x_years: 64 | one: alrededor de 1 año 65 | other: alrededor de %{count} años 66 | almost_x_years: 67 | one: casi 1 año 68 | other: casi %{count} años 69 | half_a_minute: medio minuto 70 | less_than_x_minutes: 71 | one: menos de 1 minuto 72 | other: menos de %{count} minutos 73 | less_than_x_seconds: 74 | one: menos de 1 segundo 75 | other: menos de %{count} segundos 76 | over_x_years: 77 | one: más de 1 año 78 | other: más de %{count} años 79 | x_days: 80 | one: 1 día 81 | other: ! '%{count} días' 82 | x_minutes: 83 | one: 1 minuto 84 | other: ! '%{count} minutos' 85 | x_months: 86 | one: 1 mes 87 | other: ! '%{count} meses' 88 | x_seconds: 89 | one: 1 segundo 90 | other: ! '%{count} segundos' 91 | prompts: 92 | day: Día 93 | hour: Hora 94 | minute: Minutos 95 | month: Mes 96 | second: Segundos 97 | year: Año 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: debe ser aceptado 102 | blank: no puede estar en blanco 103 | confirmation: no coincide 104 | empty: no puede estar vacío 105 | equal_to: debe ser igual a %{count} 106 | even: debe ser par 107 | exclusion: está reservado 108 | greater_than: debe ser mayor que %{count} 109 | greater_than_or_equal_to: debe ser mayor que o igual a %{count} 110 | inclusion: no está incluido en la lista 111 | invalid: no es válido 112 | less_than: debe ser menor que %{count} 113 | less_than_or_equal_to: debe ser menor que o igual a %{count} 114 | not_a_number: no es un número 115 | not_an_integer: debe ser un entero 116 | odd: debe ser impar 117 | record_invalid: ! 'La validación falló: %{errors}' 118 | taken: ya está en uso 119 | too_long: es demasiado largo (%{count} caracteres máximo) 120 | too_short: es demasiado corto (%{count} caracteres mínimo) 121 | wrong_length: no tiene la longitud correcta (%{count} caracteres exactos) 122 | template: 123 | body: ! 'Se encontraron problemas con los siguientes campos:' 124 | header: 125 | one: No se pudo guardar este/a %{model} porque se encontró 1 error 126 | other: No se pudo guardar este/a %{model} porque se encontraron %{count} errores 127 | helpers: 128 | select: 129 | prompt: Por favor seleccione 130 | submit: 131 | create: Crear %{model} 132 | submit: Guardar %{model} 133 | update: Actualizar %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: € 144 | format: 145 | delimiter: . 146 | precision: 3 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: mil millones 155 | million: millón 156 | quadrillion: mil billones 157 | thousand: mil 158 | trillion: billón 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', y ' 184 | two_words_connector: ! ' y ' 185 | words_connector: ! ', ' 186 | time: 187 | am: am 188 | formats: 189 | default: ! '%A, %d de %B de %Y %H:%M:%S %z' 190 | long: ! '%d de %B de %Y %H:%M' 191 | short: ! '%d de %b %H:%M' 192 | pm: pm 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/et.yml: -------------------------------------------------------------------------------- 1 | et: 2 | date: 3 | abbr_day_names: 4 | - P 5 | - E 6 | - T 7 | - K 8 | - N 9 | - R 10 | - L 11 | abbr_month_names: 12 | - 13 | - jaan. 14 | - veebr. 15 | - märts 16 | - apr. 17 | - mai 18 | - juuni 19 | - juuli 20 | - aug. 21 | - sept. 22 | - okt. 23 | - nov. 24 | - dets. 25 | day_names: 26 | - pühapäev 27 | - esmaspäev 28 | - teisipäev 29 | - kolmapäev 30 | - neljapäev 31 | - reede 32 | - laupäev 33 | formats: 34 | default: ! '%d.%m.%Y' 35 | long: ! '%d. %B %Y' 36 | short: ! '%d.%m.%y' 37 | month_names: 38 | - 39 | - jaanuar 40 | - veebruar 41 | - märts 42 | - aprill 43 | - mai 44 | - juuni 45 | - juuli 46 | - august 47 | - september 48 | - oktoober 49 | - november 50 | - detsember 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: umbes %{count} tund 59 | other: umbes %{count} tundi 60 | about_x_months: 61 | one: umbes %{count} kuu 62 | other: umbes %{count} kuud 63 | about_x_years: 64 | one: umbes %{count} aasta 65 | other: umbes %{count} aastat 66 | almost_x_years: 67 | one: peaaegu üks aasta 68 | other: peaaegu %{count} aastat 69 | half_a_minute: pool minutit 70 | less_than_x_minutes: 71 | one: vähem kui %{count} minut 72 | other: vähem kui %{count} minutit 73 | less_than_x_seconds: 74 | one: vähem kui %{count} sekund 75 | other: vähem kui %{count} sekundit 76 | over_x_years: 77 | one: üle %{count} aasta 78 | other: üle %{count} aasta 79 | x_days: 80 | one: ! '%{count} päev' 81 | other: ! '%{count} päeva' 82 | x_minutes: 83 | one: ! '%{count} minut' 84 | other: ! '%{count} minutit' 85 | x_months: 86 | one: ! '%{count} kuu' 87 | other: ! '%{count} kuud' 88 | x_seconds: 89 | one: ! '%{count} sekund' 90 | other: ! '%{count} sekundit' 91 | prompts: 92 | day: Päev 93 | hour: Tunde 94 | minute: Minutit 95 | month: Kuu 96 | second: Sekundit 97 | year: Aasta 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: peab olema heaks kiidetud 102 | blank: on täitmata 103 | confirmation: ei vasta kinnitusele 104 | empty: on tühi 105 | equal_to: peab olema võrdne arvuga %{count} 106 | even: peab olema paarisarv 107 | exclusion: on reserveeritud 108 | greater_than: ei tohi olla suurem kui %{count} 109 | greater_than_or_equal_to: peab olema suurem või võrdne arvuga %{count} 110 | inclusion: ei leidu nimekirjas 111 | invalid: ei ole korrektne 112 | less_than: peab olema vähem kui %{count} 113 | less_than_or_equal_to: peab olema vähem või võrdne arvuga %{count} 114 | not_a_number: ei ole number 115 | not_an_integer: peab olema täisarv 116 | odd: peab olema paaritu arv 117 | record_invalid: ! 'Valideerimine ebaõnnestus: %{errors}' 118 | taken: on juba võetud 119 | too_long: on liiga pikk (maksimum on %{count} tähemärki) 120 | too_short: on liiga lühike (miinimum on %{count} tähemärki) 121 | wrong_length: on vale pikkusega (peab olema %{count} tähemärki) 122 | template: 123 | body: ! 'Probleeme ilmnes järgmiste väljadega:' 124 | header: 125 | one: Üks viga takistas objekti %{model} salvestamist 126 | other: ! '%{count} viga takistasid objekti %{model} salvestamist' 127 | helpers: 128 | select: 129 | prompt: Palun vali 130 | submit: 131 | create: Loo uus %{model} 132 | submit: Salvesta %{model} 133 | update: Uuenda objekti %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ' ' 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: € 144 | format: 145 | delimiter: ! ' ' 146 | precision: 2 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: miljard 155 | million: miljon 156 | quadrillion: kvadriljon 157 | thousand: tuhat 158 | trillion: triljon 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: bait 170 | other: baiti 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' ja ' 184 | two_words_connector: ! ' ja ' 185 | words_connector: ! ', ' 186 | time: 187 | am: enne lõunat 188 | formats: 189 | default: ! '%d. %B %Y, %H:%M' 190 | long: ! '%a, %d. %b %Y, %H:%M:%S %z' 191 | short: ! '%d.%m.%y, %H:%M' 192 | pm: pärast lõunat 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/fa.yml: -------------------------------------------------------------------------------- 1 | fa: 2 | date: 3 | abbr_day_names: 4 | - ی 5 | - د 6 | - س 7 | - چ 8 | - پ 9 | - ج 10 | - ش 11 | abbr_month_names: 12 | - 13 | - ژانویه 14 | - فوریه 15 | - مارس 16 | - آوریل 17 | - مه 18 | - ژوئن 19 | - ژوئیه 20 | - اوت 21 | - سپتامبر 22 | - اکتبر 23 | - نوامبر 24 | - دسامبر 25 | day_names: 26 | - یکشنبه 27 | - دوشنبه 28 | - سه‌شنبه 29 | - چهارشنبه 30 | - پنج‌شنبه 31 | - جمعه 32 | - شنبه 33 | formats: 34 | default: ! '%Y/%m/%d' 35 | long: ! '%e %B %Y' 36 | short: ! '%m/%d' 37 | month_names: 38 | - 39 | - ژانویه 40 | - فوریه 41 | - مارس 42 | - آوریل 43 | - مه 44 | - ژوئن 45 | - ژوئیه 46 | - اوت 47 | - سپتامبر 48 | - اکتبر 49 | - نوامبر 50 | - دسامبر 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: حدود یک ساعت 59 | other: حدود %{count} ساعت 60 | about_x_months: 61 | one: حدود یک ماه 62 | other: حدود %{count} ماه 63 | about_x_years: 64 | one: حدود یک سال 65 | other: حدود %{count} سال 66 | almost_x_years: 67 | one: حدود یک سال 68 | other: حدود %{count} سال 69 | half_a_minute: نیم دقیقه 70 | less_than_x_minutes: 71 | one: کمتر از یک دقیقه 72 | other: کمتر از %{count} دقیقه 73 | less_than_x_seconds: 74 | one: یک ثانیه 75 | other: کمتر از %{count} ثانیه 76 | over_x_years: 77 | one: بیش از یک سال 78 | other: بیش از %{count} سال 79 | x_days: 80 | one: یک روز 81 | other: ! '%{count} روز' 82 | x_minutes: 83 | one: یک دقیقه 84 | other: ! '%{count} دقیقه' 85 | x_months: 86 | one: یک ماه 87 | other: ! '%{count} ماه' 88 | x_seconds: 89 | one: یک ثانیه 90 | other: ! '%{count} ثانیه' 91 | prompts: 92 | day: روز 93 | hour: ساعت 94 | minute: دقیقه 95 | month: ماه 96 | second: ثانیه 97 | year: سال 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: باید پذیرفته شود 102 | blank: نباید خالی باشد 103 | confirmation: با تایید نمی‌خواند 104 | empty: نمی‌تواند خالی باشد 105 | equal_to: باید برابر %{count} باشد 106 | even: باید زوج باشد 107 | exclusion: رزرو است 108 | greater_than: باید بزرگتر از %{count} باشد 109 | greater_than_or_equal_to: باید بزرگتر یا برابر %{count} باشد 110 | inclusion: در لیست موجود نیست 111 | invalid: نامعتبر است 112 | less_than: باید کمتر از %{count} باشد 113 | less_than_or_equal_to: باید کمتر یا برابر %{count} باشد 114 | not_a_number: عدد نیست 115 | not_an_integer: عدد صحیح نیست 116 | odd: باید فرد باشد 117 | record_invalid: رکورد نامعتبر است %{errors} 118 | taken: پیشتر گرفته شده 119 | too_long: بلند است (حداکثر %{count} کاراکتر) 120 | too_short: کوتاه است (حداقل %{count} کاراکتر) 121 | wrong_length: نااندازه است (باید %{count} کاراکتر باشد) 122 | template: 123 | body: ! 'موارد زیر مشکل داشت:' 124 | header: 125 | one: 1 خطا جلوی ذخیره این %{model} را گرفت 126 | other: ! '%{count} خطا جلوی ذخیره این %{model} را گرفت' 127 | helpers: 128 | select: 129 | prompt: لطفا انتخاب کنید 130 | submit: 131 | create: ! 'ایجاد %{model}' 132 | submit: ! 'ذخیره‌ی %{model}' 133 | update: ! 'بروز رسانی %{model}' 134 | number: 135 | currency: 136 | format: 137 | delimiter: ٬ 138 | format: ! '%n %u' 139 | precision: 0 140 | separator: ٫ 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: ﷼ 144 | format: 145 | delimiter: ٬ 146 | precision: 2 147 | separator: ٫ 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: میلیارد 155 | million: میلیون 156 | quadrillion: کادریلیون 157 | thousand: هزار 158 | trillion: تریلیون 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: بایت 170 | other: بایت 171 | gb: گیگابایت 172 | kb: کیلوبایت 173 | mb: مگابایت 174 | tb: ترابایت 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' و ' 184 | two_words_connector: ! ' و ' 185 | words_connector: ! '، ' 186 | time: 187 | am: قبل از ظهر 188 | formats: 189 | default: ! '%A، %e %B %Y، ساعت %H:%M:%S (%Z)' 190 | long: ! '%e %B %Y، ساعت %H:%M' 191 | short: ! '%e %B، ساعت %H:%M' 192 | pm: بعد از ظهر 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/fi.yml: -------------------------------------------------------------------------------- 1 | fi: 2 | date: 3 | abbr_day_names: 4 | - su 5 | - ma 6 | - ti 7 | - ke 8 | - to 9 | - pe 10 | - la 11 | abbr_month_names: 12 | - 13 | - tammi 14 | - helmi 15 | - maalis 16 | - huhti 17 | - touko 18 | - kesä 19 | - heinä 20 | - elo 21 | - syys 22 | - loka 23 | - marras 24 | - joulu 25 | day_names: 26 | - sunnuntai 27 | - maanantai 28 | - tiistai 29 | - keskiviikko 30 | - torstai 31 | - perjantai 32 | - lauantai 33 | formats: 34 | default: ! '%-d.%-m.%Y' 35 | long: ! '%A %e. %Bta %Y' 36 | short: ! '%d. %b' 37 | month_names: 38 | - 39 | - tammikuu 40 | - helmikuu 41 | - maaliskuu 42 | - huhtikuu 43 | - toukokuu 44 | - kesäkuu 45 | - heinäkuu 46 | - elokuu 47 | - syyskuu 48 | - lokakuu 49 | - marraskuu 50 | - joulukuu 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: noin tunti 59 | other: noin %{count} tuntia 60 | about_x_months: 61 | one: noin kuukausi 62 | other: noin %{count} kuukautta 63 | about_x_years: 64 | one: vuosi 65 | other: noin %{count} vuotta 66 | almost_x_years: 67 | one: melkein yksi vuosi 68 | other: melkein %{count} vuotta 69 | half_a_minute: puoli minuuttia 70 | less_than_x_minutes: 71 | one: alle minuutti 72 | other: alle %{count} minuuttia 73 | less_than_x_seconds: 74 | one: alle sekunti 75 | other: alle %{count} sekuntia 76 | over_x_years: 77 | one: yli vuosi 78 | other: yli %{count} vuotta 79 | x_days: 80 | one: päivä 81 | other: ! '%{count} päivää' 82 | x_minutes: 83 | one: minuutti 84 | other: ! '%{count} minuuttia' 85 | x_months: 86 | one: kuukausi 87 | other: ! '%{count} kuukautta' 88 | x_seconds: 89 | one: sekunti 90 | other: ! '%{count} sekuntia' 91 | prompts: 92 | day: päivä 93 | hour: tunti 94 | minute: minuutti 95 | month: kuukausi 96 | second: sekunti 97 | year: vuosi 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: täytyy olla hyväksytty 102 | blank: ei voi olla sisällötön 103 | confirmation: ei vastaa varmennusta 104 | empty: ei voi olla tyhjä 105 | equal_to: täytyy olla yhtä suuri kuin %{count} 106 | even: täytyy olla parillinen 107 | exclusion: on varattu 108 | greater_than: täytyy olla suurempi kuin %{count} 109 | greater_than_or_equal_to: täytyy olla suurempi tai yhtä suuri kuin %{count} 110 | inclusion: ei löydy listasta 111 | invalid: on kelvoton 112 | less_than: täytyy olla pienempi kuin %{count} 113 | less_than_or_equal_to: täytyy olla pienempi tai yhtä suuri kuin %{count} 114 | not_a_number: ei ole luku 115 | not_an_integer: ei ole kokonaisluku 116 | odd: täytyy olla pariton 117 | record_invalid: ! 'Validointi epäonnistui: %{errors}' 118 | taken: on jo käytössä 119 | too_long: on liian pitkä (saa olla enintään %{count} merkkiä) 120 | too_short: on liian lyhyt (oltava vähintään %{count} merkkiä) 121 | wrong_length: on väärän pituinen (täytyy olla täsmälleen %{count} merkkiä) 122 | template: 123 | body: ! 'Seuraavat kentät aiheuttivat ongelmia:' 124 | header: 125 | one: Virhe syötteessä esti mallin %{model} tallentamisen 126 | other: ! '%{count} virhettä esti mallin %{model} tallentamisen' 127 | helpers: 128 | select: 129 | prompt: Valitse 130 | submit: 131 | create: Luo %{model} 132 | submit: Tallenna %{model} 133 | update: Päivitä %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: € 144 | format: 145 | delimiter: . 146 | precision: 3 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | thousand: tuhatta 155 | million: miljoonaa 156 | billion: miljardia 157 | trillion: biljoonaa 158 | quadrillion: tuhatta biljoonaa 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: tavu 170 | other: tavua 171 | gb: GB 172 | kb: kB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' ja ' 184 | two_words_connector: ! ' ja ' 185 | words_connector: ! ', ' 186 | time: 187 | am: aamupäivä 188 | formats: 189 | default: ! '%A %e. %Bta %Y %H:%M:%S %z' 190 | long: ! '%e. %Bta %Y %H.%M' 191 | short: ! '%e.%m. %H.%M' 192 | pm: iltapäivä 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/gl.yml: -------------------------------------------------------------------------------- 1 | gl: 2 | date: 3 | abbr_day_names: 4 | - Dom 5 | - Lun 6 | - Mar 7 | - Mer 8 | - Xov 9 | - Ven 10 | - Sab 11 | abbr_month_names: 12 | - 13 | - Xan 14 | - Feb 15 | - Mar 16 | - Abr 17 | - Mai 18 | - Xuñ 19 | - Xul 20 | - Ago 21 | - Set 22 | - Out 23 | - Nov 24 | - Dec 25 | day_names: 26 | - Domingo 27 | - Luns 28 | - Martes 29 | - Mércores 30 | - Xoves 31 | - Venres 32 | - Sábado 33 | formats: 34 | default: ! '%e/%m/%Y' 35 | long: ! '%A %e de %B de %Y' 36 | short: ! '%e %b' 37 | month_names: 38 | - 39 | - Xaneiro 40 | - Febreiro 41 | - Marzo 42 | - Abril 43 | - Maio 44 | - Xuño 45 | - Xullo 46 | - Agosto 47 | - Setembro 48 | - Outubro 49 | - Novembro 50 | - Decembro 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: aproximadamente unha hora 59 | other: ! '%{count} horas' 60 | about_x_months: 61 | one: aproximadamente 1 mes 62 | other: ! '%{count} meses' 63 | about_x_years: 64 | one: aproximadamente 1 ano 65 | other: ! '%{count} anos' 66 | half_a_minute: medio minuto 67 | less_than_x_minutes: 68 | one: 1 minuto 69 | other: ! '%{count} minutos' 70 | zero: menos dun minuto 71 | less_than_x_seconds: 72 | few: poucos segundos 73 | one: 1 segundo 74 | other: ! '%{count} segundos' 75 | zero: menos dun segundo 76 | over_x_years: 77 | one: máis dun ano 78 | other: ! '%{count} anos' 79 | x_days: 80 | one: 1 día 81 | other: ! '%{count} días' 82 | x_minutes: 83 | one: 1 minuto 84 | other: ! '%{count} minuto' 85 | x_months: 86 | one: 1 mes 87 | other: ! '%{count} meses' 88 | x_seconds: 89 | one: 1 segundo 90 | other: ! '%{count} segundos' 91 | errors: 92 | format: ! '%{attribute} %{message}' 93 | messages: 94 | accepted: debe ser aceptado 95 | blank: non pode estar en blanco 96 | confirmation: non coincide coa confirmación 97 | empty: non pode estar valeiro 98 | equal_to: debe ser igual a %{count} 99 | even: debe ser impar 100 | exclusion: xa existe 101 | greater_than: debe ser maior que %{count} 102 | greater_than_or_equal_to: debe ser maior ou igual que %{count} 103 | inclusion: non está incluido na lista 104 | invalid: non é válido 105 | less_than: debe ser menor que %{count} 106 | less_than_or_equal_to: debe ser menor ou igual que %{count} 107 | not_a_number: non é un número 108 | odd: debe ser par 109 | taken: non está dispoñible 110 | too_long: é demasiado longo (non máis de %{count} carácteres) 111 | too_short: é demasiado curto (non menos de %{count} carácteres) 112 | wrong_length: non ten a lonxitude correcta (debe ser de %{count} carácteres) 113 | template: 114 | body: ! 'Atopáronse os seguintes problemas:' 115 | header: 116 | one: 1 erro evitou que se poidese gardar o %{model} 117 | other: ! '%{count} erros evitaron que se poidese gardar o %{model}' 118 | number: 119 | currency: 120 | format: 121 | delimiter: . 122 | format: ! '%n %u' 123 | precision: 2 124 | separator: ! ',' 125 | significant: false 126 | strip_insignificant_zeros: false 127 | unit: € 128 | format: 129 | delimiter: . 130 | precision: 2 131 | separator: ! ',' 132 | significant: false 133 | strip_insignificant_zeros: false 134 | human: 135 | decimal_units: 136 | format: ! '%n %u' 137 | units: 138 | unit: '' 139 | format: 140 | delimiter: '' 141 | precision: 1 142 | significant: true 143 | strip_insignificant_zeros: true 144 | storage_units: 145 | format: ! '%n %u' 146 | units: 147 | byte: 148 | one: Byte 149 | other: Bytes 150 | gb: GB 151 | kb: KB 152 | mb: MB 153 | tb: TB 154 | percentage: 155 | format: 156 | delimiter: '' 157 | precision: 158 | format: 159 | delimiter: '' 160 | support: 161 | array: 162 | last_word_connector: ! ' e ' 163 | two_words_connector: ! ' e ' 164 | words_connector: ! ', ' 165 | time: 166 | am: '' 167 | formats: 168 | default: ! '%A, %e de %B de %Y ás %H:%M' 169 | long: ! '%A %e de %B de %Y ás %H:%M' 170 | short: ! '%e/%m, %H:%M' 171 | pm: '' 172 | -------------------------------------------------------------------------------- /locales/rails-i18n/he.yml: -------------------------------------------------------------------------------- 1 | he: 2 | date: 3 | abbr_day_names: 4 | - א 5 | - ב 6 | - ג 7 | - ד 8 | - ה 9 | - ו 10 | - ש 11 | abbr_month_names: 12 | - 13 | - ינו 14 | - פבר 15 | - מרץ 16 | - אפר 17 | - מאי 18 | - יונ 19 | - יול 20 | - אוג 21 | - ספט 22 | - אוק 23 | - נוב 24 | - דצמ 25 | day_names: 26 | - ראשון 27 | - שני 28 | - שלישי 29 | - רביעי 30 | - חמישי 31 | - שישי 32 | - שבת 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%e ב%B, %Y' 36 | short: ! '%e %b' 37 | month_names: 38 | - 39 | - ינואר 40 | - פברואר 41 | - מרץ 42 | - אפריל 43 | - מאי 44 | - יוני 45 | - יולי 46 | - אוגוסט 47 | - ספטמבר 48 | - אוקטובר 49 | - נובמבר 50 | - דצמבר 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: בערך שעה אחת 59 | other: בערך %{count} שעות 60 | about_x_months: 61 | one: בערך חודש אחד 62 | other: בערך %{count} חודשים 63 | about_x_years: 64 | one: בערך שנה אחת 65 | other: בערך %{count} שנים 66 | almost_x_years: 67 | one: כמעט שנה 68 | other: כמעט %{count} שנים 69 | half_a_minute: חצי דקה 70 | less_than_x_minutes: 71 | one: פחות מדקה אחת 72 | other: פחות מ- %{count} דקות 73 | zero: פחות מדקה אחת 74 | less_than_x_seconds: 75 | one: פחות משניה אחת 76 | other: פחות מ- %{count} שניות 77 | zero: פחות משניה אחת 78 | over_x_years: 79 | one: מעל שנה אחת 80 | other: מעל %{count} שנים 81 | x_days: 82 | one: יום אחד 83 | other: ! '%{count} ימים' 84 | x_minutes: 85 | one: דקה אחת 86 | other: ! '%{count} דקות' 87 | x_months: 88 | one: חודש אחד 89 | other: ! '%{count} חודשים' 90 | x_seconds: 91 | one: שניה אחת 92 | other: ! '%{count} שניות' 93 | prompts: 94 | day: יום 95 | hour: שעה 96 | minute: דקה 97 | month: חודש 98 | second: שניות 99 | year: שנה 100 | errors: 101 | format: ! '%{attribute} %{message}' 102 | messages: 103 | accepted: חייב באישור 104 | blank: לא יכול להיות ריק 105 | confirmation: לא תואם לאישורו 106 | empty: לא יכול להיות ריק 107 | equal_to: חייב להיות שווה ל- %{count} 108 | even: חייב להיות זוגי 109 | exclusion: לא זמין 110 | greater_than: חייב להיות גדול מ- %{count} 111 | greater_than_or_equal_to: חייב להיות גדול או שווה ל- %{count} 112 | inclusion: לא נכלל ברשימה 113 | invalid: לא תקין 114 | less_than: חייב להיות קטן מ- %{count} 115 | less_than_or_equal_to: חייב להיות קטן או שווה ל- %{count} 116 | not_a_number: חייב להיות מספר 117 | not_an_integer: חייב להיות מספר שלם 118 | odd: חייב להיות אי זוגי 119 | record_invalid: ! 'האימות נכשל: %{errors}' 120 | taken: כבר בשימוש 121 | too_long: "ארוך מדי (יותר מ- %{count} תווים)" 122 | too_short: "קצר מדי (פחות מ- %{count} תווים)" 123 | wrong_length: "לא באורך הנכון (חייב להיות %{count} תווים)" 124 | template: 125 | body: ! 'אנא בדוק את השדות הבאים:' 126 | header: 127 | one: ! 'לא ניתן לשמור את ה%{model}: שגיאה אחת' 128 | other: ! 'לא ניתן לשמור את ה%{model}: %{count} שגיאות.' 129 | helpers: 130 | select: 131 | prompt: נא לבחור 132 | submit: 133 | create: ! 'יצירת %{model}' 134 | submit: ! 'שמור %{model}' 135 | update: ! 'עדכון %{model}' 136 | number: 137 | currency: 138 | format: 139 | delimiter: ! ',' 140 | format: ! '%u %n' 141 | precision: 2 142 | separator: . 143 | significant: false 144 | strip_insignificant_zeros: false 145 | unit: ₪ 146 | format: 147 | delimiter: ! ',' 148 | precision: 3 149 | separator: . 150 | significant: false 151 | strip_insignificant_zeros: false 152 | human: 153 | decimal_units: 154 | format: ! '%n %u' 155 | units: 156 | billion: מיליארד 157 | million: מיליון 158 | quadrillion: קודריליון 159 | thousand: אלף 160 | trillion: טריליון 161 | unit: '' 162 | format: 163 | delimiter: '' 164 | precision: 3 165 | significant: true 166 | strip_insignificant_zeros: true 167 | storage_units: 168 | format: ! '%n %u' 169 | units: 170 | byte: 171 | one: בייט 172 | other: בתים 173 | gb: ג'יגה-בייט 174 | kb: קילו-בייט 175 | mb: מגה-בייט 176 | tb: טרה-בייט 177 | percentage: 178 | format: 179 | delimiter: '' 180 | precision: 181 | format: 182 | delimiter: '' 183 | support: 184 | array: 185 | last_word_connector: ! ', את ' 186 | two_words_connector: ! ' את ' 187 | words_connector: ! ', ' 188 | time: 189 | am: am 190 | formats: 191 | default: ! '%a %d %b %H:%M:%S %Z %Y' 192 | long: ! '%d ב%B, %Y %H:%M' 193 | short: ! '%d %b %H:%M' 194 | pm: pm 195 | -------------------------------------------------------------------------------- /locales/rails-i18n/hi-IN.yml: -------------------------------------------------------------------------------- 1 | hi-IN: 2 | date: 3 | abbr_day_names: 4 | - रवि 5 | - सोम 6 | - मंगल 7 | - बुध 8 | - गुरु 9 | - शुक्र 10 | - शनि 11 | abbr_month_names: 12 | - 13 | - Jan 14 | - Feb 15 | - Mar 16 | - Apr 17 | - May 18 | - Jun 19 | - Jul 20 | - Aug 21 | - Sep 22 | - Oct 23 | - Nov 24 | - Dec 25 | day_names: 26 | - रविवार 27 | - सोमवार 28 | - मंगलवार 29 | - बुधवार 30 | - गुरुवार 31 | - शुक्रवार 32 | - शनिवार 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%B %d, %Y' 36 | short: ! '%b %d' 37 | month_names: 38 | - 39 | - जनवरी 40 | - फरवरी 41 | - मार्च 42 | - अप्रैल 43 | - मई 44 | - जून 45 | - जुलाई 46 | - अगस्त 47 | - सितंबर 48 | - अक्टूबर 49 | - नवंबर 50 | - दिसंबर 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: लग - भग एक घंटा 59 | other: लग - भग %{count} घंटा 60 | about_x_months: 61 | one: लग - भग 1 महीना 62 | other: लग - भग %{count} महीना 63 | about_x_years: 64 | one: लग - भग 1 साल 65 | other: लग - भग %{count} साल 66 | almost_x_years: 67 | one: लग - भग एक साल 68 | other: लग - भग %{count} साल 69 | half_a_minute: एक आधा मिनट 70 | less_than_x_minutes: 71 | one: एक मिनट से कम 72 | other: ! '%{count} मिनट से कम' 73 | less_than_x_seconds: 74 | one: एक सेकंड से कम 75 | other: ! '%{count} सेकंड से कम' 76 | over_x_years: 77 | one: एक साल के ऊपर 78 | other: ! '%{count} साल के ऊपर' 79 | x_days: 80 | one: एक दिन 81 | other: ! '%{count} दिन' 82 | x_minutes: 83 | one: एक मिनट 84 | other: ! '%{count} मिनट' 85 | x_months: 86 | one: एक महीना 87 | other: ! '%{count} महीना' 88 | x_seconds: 89 | one: एक सेकंड 90 | other: ! '%{count} सेकंड' 91 | prompts: 92 | day: दिन 93 | hour: घंटा 94 | minute: क्षण 95 | month: माह 96 | second: सेकंड 97 | year: वर्ष 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: होना स्वीकार किया जाना आवश्यक 102 | blank: खाली नहीं किया जा सकता 103 | confirmation: पुष्टिकरण मेल नहीं खाता 104 | empty: खाली नहीं किया जा सकता 105 | equal_to: ! '%{count} के लिए बराबर होना चाहिए' 106 | even: सम होना चाहिए 107 | exclusion: आरक्षित है 108 | greater_than: ! '%{count} से अधिक होना चाहिए' 109 | greater_than_or_equal_to: ! '%{count} से बड़ा या बराबर होना आवश्यक है' 110 | inclusion: सूची में शामिल नहीं है 111 | invalid: अवैध है 112 | less_than: ! '%{count} से कम होना चाहिए' 113 | less_than_or_equal_to: ! '%{count} से कम या बराबर होना आवश्यक है' 114 | not_a_number: कोई संख्या नहीं है 115 | not_an_integer: एक पूर्णांक होना चाहिए 116 | odd: विषम होना चाहिए 117 | record_invalid: ! 'सत्यापन विफल: %{errors}' 118 | taken: पहले ही ले लिया गया है 119 | too_long: बहुत लंबा है (अधिकतम %{count} अक्षरों है) 120 | too_short: बहुत छोटा है (न्यूनतम %{count} अक्षरों है) 121 | wrong_length: गलत लंबाई है (%{count} वर्ण वाले होने चाहिए) 122 | template: 123 | body: ! 'वहाँ निम्नलिखित क्षेत्रों के साथ समस्याओं रहे थे:' 124 | header: 125 | one: एक त्रुटि सहेजे जाने से इस %{model} को निषिद्ध 126 | other: ! '%{count} त्रुटियों को सहेजे जाने से इस %{model} निषिद्ध' 127 | helpers: 128 | select: 129 | prompt: कृपया चुनें 130 | submit: 131 | create: बनाएँ %{model} 132 | submit: सहेजें %{model} 133 | update: अद्यतन %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ',' 138 | format: ! '%u%n' 139 | precision: 2 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: ₹ 144 | format: 145 | delimiter: ! ',' 146 | precision: 3 147 | separator: . 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: अरब 155 | million: मिल्लिओंन 156 | quadrillion: करोड़ शंख 157 | thousand: हज़ार 158 | trillion: खरब 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', और ' 184 | two_words_connector: ! ' और ' 185 | words_connector: ! ', ' 186 | time: 187 | am: am 188 | formats: 189 | default: ! '%a, %d %b %Y %H:%M:%S %z' 190 | long: ! '%B %d, %Y %H:%M' 191 | short: ! '%d %b %H:%M' 192 | pm: pm 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/hi.yml: -------------------------------------------------------------------------------- 1 | hi: 2 | date: 3 | abbr_day_names: 4 | - रवि 5 | - सोम 6 | - मंगल 7 | - बुध 8 | - गुरु 9 | - शुक्र 10 | - शनि 11 | abbr_month_names: 12 | - 13 | - जन 14 | - फर 15 | - मार्च 16 | - अप्रै 17 | - मई 18 | - जून 19 | - जुला 20 | - अग 21 | - सितं 22 | - अक्टू 23 | - नवं 24 | - दिस 25 | day_names: 26 | - रविवार 27 | - सोमवार 28 | - मंगलवार 29 | - बुधवार 30 | - गुरुवार 31 | - शुक्रवार 32 | - शनिवार 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%B %d, %Y' 36 | short: ! '%b %d' 37 | month_names: 38 | - 39 | - जनवरी 40 | - फरवरी 41 | - मार्च 42 | - अप्रैल 43 | - मई 44 | - जून 45 | - जुलाई 46 | - अगस्त 47 | - सितंबर 48 | - अक्टूबर 49 | - नवंबर 50 | - दिसंबर 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: लगभग एक घंटा 59 | other: लगभग %{count} घंटा 60 | about_x_months: 61 | one: लगभग 1 महीना 62 | other: लगभग %{count} महीना 63 | about_x_years: 64 | one: लगभग 1 साल 65 | other: लगभग %{count} साल 66 | almost_x_years: 67 | one: लगभग एक साल 68 | other: लगभग %{count} साल 69 | half_a_minute: एक आधा मिनट 70 | less_than_x_minutes: 71 | one: एक मिनट से कम 72 | other: ! '%{count} मिनट से कम' 73 | less_than_x_seconds: 74 | one: एक सेकेंड से कम 75 | other: ! '%{count} सेकेंड से कम' 76 | over_x_years: 77 | one: एक साल के ऊपर 78 | other: ! '%{count} साल से अधिक' 79 | x_days: 80 | one: एक दिन 81 | other: ! '%{count} दिन' 82 | x_minutes: 83 | one: एक मिनट 84 | other: ! '%{count} मिनट' 85 | x_months: 86 | one: एक महीना 87 | other: ! '%{count} महीना' 88 | x_seconds: 89 | one: एक सेकेंड 90 | other: ! '%{count} सेकेंड' 91 | prompts: 92 | day: दिन 93 | hour: घंटा 94 | minute: मिनट 95 | month: माह 96 | second: सेकेंड 97 | year: वर्ष 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: स्वीकार किया जाना जरूरी 102 | blank: खाली नहीं रह सकता है 103 | confirmation: पुष्टिकरण मेल नहीं खाता 104 | empty: रिक्त नहीं रह सकता है 105 | equal_to: ! '%{count} के लिए बराबर होना चाहिए' 106 | even: सम होना चाहिए 107 | exclusion: आरक्षित है 108 | greater_than: ! '%{count} से अधिक होना चाहिए' 109 | greater_than_or_equal_to: ! '%{count} से बड़ा या बराबर होना आवश्यक है' 110 | inclusion: सूची में शामिल नहीं है 111 | invalid: अवैध है 112 | less_than: ! '%{count} से कम होना चाहिए' 113 | less_than_or_equal_to: ! '%{count} से कम या बराबर होना आवश्यक है' 114 | not_a_number: कोई संख्या नहीं है 115 | not_an_integer: एक पूर्णांक होना चाहिए 116 | odd: विसम होना चाहिए 117 | record_invalid: ! 'सत्यापन विफल: %{errors}' 118 | taken: पहले ही ले लिया गया है 119 | too_long: अत्यधिक लंबा है (अधिकतम %{count} वर्ण हैं) 120 | too_short: अत्यधिक छोटा है (न्यूनतम %{count} वर्ण हैं) 121 | wrong_length: गलत लंबाई है (%{count} वर्ण युक्त होना चाहिए) 122 | template: 123 | body: ! 'निम्नलिखित क्षेत्रों के साथ समस्या थी:' 124 | header: 125 | one: इस %{model} को सहेजे जाना एक त्रुटि के कारण नहीं हुआ 126 | other: इस %{model} को सहेजे जाना %{count} त्रुटि के कारण नहीं हुआ 127 | helpers: 128 | select: 129 | prompt: कृपया चुनें 130 | submit: 131 | create: ! '%{model} बनाएँ' 132 | submit: ! '%{model} सौंपें' 133 | update: ! '%{model} अद्यतन' 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ',' 138 | format: ! '%u%n' 139 | precision: 2 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: ₹ 144 | format: 145 | delimiter: ! ',' 146 | precision: 3 147 | separator: . 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: अरब 155 | million: दस करोड़ 156 | quadrillion: करोड़ शंख 157 | thousand: हज़ार 158 | trillion: खरब 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', और ' 184 | two_words_connector: ! ' और ' 185 | words_connector: ! ', ' 186 | time: 187 | am: पूर्वाह्न 188 | formats: 189 | default: ! '%a, %d %b %Y %H:%M:%S %z' 190 | long: ! '%B %d, %Y %H:%M' 191 | short: ! '%d %b %H:%M' 192 | pm: अपराह्न 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/hu.yml: -------------------------------------------------------------------------------- 1 | hu: 2 | date: 3 | abbr_day_names: 4 | - v. 5 | - h. 6 | - k. 7 | - sze. 8 | - cs. 9 | - p. 10 | - szo. 11 | abbr_month_names: 12 | - 13 | - jan. 14 | - febr. 15 | - márc. 16 | - ápr. 17 | - máj. 18 | - jún. 19 | - júl. 20 | - aug. 21 | - szept. 22 | - okt. 23 | - nov. 24 | - dec. 25 | day_names: 26 | - vasárnap 27 | - hétfő 28 | - kedd 29 | - szerda 30 | - csütörtök 31 | - péntek 32 | - szombat 33 | formats: 34 | default: ! '%Y.%m.%d.' 35 | long: ! '%Y. %B %e.' 36 | short: ! '%b %e.' 37 | month_names: 38 | - 39 | - január 40 | - február 41 | - március 42 | - április 43 | - május 44 | - június 45 | - július 46 | - augusztus 47 | - szeptember 48 | - október 49 | - november 50 | - december 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: kb. 1 órája 59 | other: kb. %{count} órája 60 | about_x_months: 61 | one: kb. 1 hónapja 62 | other: kb. %{count} hónapja 63 | about_x_years: 64 | one: kb. 1 éve 65 | other: kb. %{count} éve 66 | almost_x_years: 67 | one: majdnem 1 éve 68 | other: majdnem %{count} éve 69 | half_a_minute: fél perce 70 | less_than_x_minutes: 71 | one: kevesebb, mint 1 perce 72 | other: kevesebb, mint %{count} perce 73 | less_than_x_seconds: 74 | one: kevesebb, mint 1 másodperce 75 | other: kevesebb, mint %{count} másodperce 76 | over_x_years: 77 | one: több, mint 1 éve 78 | other: több, mint %{count} éve 79 | x_days: 80 | one: 1 napja 81 | other: ! '%{count} napja' 82 | x_minutes: 83 | one: 1 perce 84 | other: ! '%{count} perce' 85 | x_months: 86 | one: 1 hónapja 87 | other: ! '%{count} hónapja' 88 | x_seconds: 89 | one: 1 másodperce 90 | other: ! '%{count} másodperce' 91 | prompts: 92 | day: Nap 93 | hour: Óra 94 | minute: Perc 95 | month: Hónap 96 | second: Másodperc 97 | year: Év 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: nincs elfogadva 102 | blank: nincs megadva 103 | confirmation: nem egyezik 104 | empty: nincs megadva 105 | equal_to: pontosan %{count} kell legyen 106 | even: páros kell legyen 107 | exclusion: nem elérhető 108 | greater_than: nagyobb kell legyen, mint %{count} 109 | greater_than_or_equal_to: legalább %{count} kell legyen 110 | inclusion: nincs a listában 111 | invalid: nem megfelelő 112 | less_than: kevesebb, mint %{count} kell legyen 113 | less_than_or_equal_to: legfeljebb %{count} lehet 114 | not_a_number: nem szám 115 | not_an_integer: egész számnak kell lennie 116 | odd: páratlan kell legyen 117 | record_invalid: Sikertelen validálás %{errors} 118 | taken: már foglalt 119 | too_long: túl hosszú (nem lehet több %{count} karakternél) 120 | too_short: túl rövid (legalább %{count} karakter kell legyen) 121 | wrong_length: nem megfelelő hosszúságú (%{count} karakter szükséges) 122 | template: 123 | body: ! 'Problémás mezők:' 124 | header: 125 | one: ! '1 hiba miatt nem menthető a következő: %{model}' 126 | other: ! '%{count} hiba miatt nem menthető a következő: %{model}' 127 | helpers: 128 | select: 129 | prompt: Válasszon 130 | submit: 131 | create: Új %{model} 132 | submit: ! '%{model} mentése' 133 | update: ! '%{model} módosítása' 134 | number: 135 | currency: 136 | format: 137 | delimiter: '' 138 | format: ! '%n %u' 139 | precision: 0 140 | separator: ! ',' 141 | significant: true 142 | strip_insignificant_zeros: true 143 | unit: Ft 144 | format: 145 | delimiter: ! ' ' 146 | precision: 2 147 | separator: ! ',' 148 | significant: true 149 | strip_insignificant_zeros: true 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: milliárd 155 | million: millió 156 | quadrillion: billiárd 157 | thousand: ezer 158 | trillion: billió 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: bájt 170 | other: bájt 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' és ' 184 | two_words_connector: ! ' és ' 185 | words_connector: ! ', ' 186 | time: 187 | am: de. 188 | formats: 189 | default: ! '%Y. %b %e., %H:%M' 190 | long: ! '%Y. %B %e., %A, %H:%M' 191 | short: ! '%b %e., %H:%M' 192 | pm: du. 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/id.yml: -------------------------------------------------------------------------------- 1 | id: 2 | date: 3 | abbr_day_names: 4 | - Min 5 | - Sen 6 | - Sel 7 | - Rab 8 | - Kam 9 | - Jum 10 | - Sab 11 | abbr_month_names: 12 | - 13 | - Jan 14 | - Feb 15 | - Mar 16 | - Apr 17 | - Mei 18 | - Jun 19 | - Jul 20 | - Agu 21 | - Sep 22 | - Okt 23 | - Nov 24 | - Des 25 | day_names: 26 | - Minggu 27 | - Senin 28 | - Selasa 29 | - Rabu 30 | - Kamis 31 | - Jum'at 32 | - Sabtu 33 | formats: 34 | default: ! '%d %B %Y' 35 | long: ! '%A, %d %B %Y' 36 | short: ! '%d.%m.%Y' 37 | month_names: 38 | - 39 | - Januari 40 | - Februari 41 | - Maret 42 | - April 43 | - Mei 44 | - Juni 45 | - Juli 46 | - Agustus 47 | - September 48 | - Oktober 49 | - November 50 | - Desember 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: sekitar satu jam 59 | other: sekitar %{count} jam 60 | about_x_months: 61 | one: sekitar sebulan 62 | other: sekitar %{count} bulan 63 | about_x_years: 64 | one: setahun 65 | other: sekitar %{count} tahun 66 | almost_x_years: 67 | one: hampir setahun 68 | other: hampir %{count} tahun 69 | half_a_minute: setengah menit 70 | less_than_x_minutes: 71 | one: kurang dari 1 menit 72 | other: kurang dari %{count} menit 73 | zero: kurang dari 1 menit 74 | less_than_x_seconds: 75 | one: kurang dari 1 detik 76 | other: kurang dari %{count} detik 77 | zero: kurang dari 1 detik 78 | over_x_years: 79 | one: lebih dari setahun 80 | other: lebih dari %{count} tahun 81 | x_days: 82 | one: sehari 83 | other: ! '%{count} hari' 84 | x_minutes: 85 | one: satu menit 86 | other: ! '%{count} menit' 87 | x_months: 88 | one: sebulan 89 | other: ! '%{count} bulan' 90 | x_seconds: 91 | one: satu detik 92 | other: ! '%{count} detik' 93 | prompts: 94 | day: Hari 95 | hour: Jam 96 | minute: Menit 97 | month: Bulan 98 | second: Detik 99 | year: Tahun 100 | errors: 101 | format: ! '%{attribute} %{message}' 102 | messages: 103 | accepted: harus diterima 104 | blank: tidak bisa kosong 105 | confirmation: ! 'tidak sesuai dengan %{attribute}' 106 | empty: tidak bisa kosong 107 | equal_to: harus sama dengan %{count} 108 | even: harus genap 109 | exclusion: sudah digunakan 110 | greater_than: harus lebih besar dari %{count} 111 | greater_than_or_equal_to: harus sama atau lebih besar dari %{count} 112 | inclusion: tidak termasuk 113 | invalid: tidak valid 114 | less_than: harus lebih kecil dari %{count} 115 | less_than_or_equal_to: harus sama atau lebih kecil dari %{count} 116 | not_a_number: bukan angka 117 | odd: harus ganjil 118 | record_invalid: ! 'Verifikasi gagal: %{errors}' 119 | taken: sudah digunakan 120 | too_long: terlalu panjang (maksimum %{count} karakter) 121 | too_short: terlalu pendek (minimum %{count} karakter) 122 | wrong_length: jumlah karakter salah (seharusnya %{count} karakter) 123 | template: 124 | body: ! 'Ada masalah dengan field berikut:' 125 | header: 126 | one: 1 kesalahan mengakibatkan %{model} ini tidak bisa disimpan 127 | other: ! '%{count} kesalahan mengakibatkan %{model} ini tidak bisa disimpan' 128 | helpers: 129 | select: 130 | prompt: Silahkan pilih 131 | submit: 132 | create: Buat %{model} 133 | submit: Simpan %{model} 134 | update: Update %{model} 135 | number: 136 | currency: 137 | format: 138 | delimiter: . 139 | format: ! '%u%n' 140 | precision: 2 141 | separator: ! ',' 142 | significant: false 143 | strip_insignificant_zeros: false 144 | unit: Rp 145 | format: 146 | delimiter: . 147 | precision: 3 148 | separator: ! ',' 149 | significant: false 150 | strip_insignificant_zeros: false 151 | human: 152 | decimal_units: 153 | format: ! '%n %u' 154 | units: 155 | billion: Miliar 156 | million: Juta 157 | quadrillion: Quadriliun 158 | thousand: Ribu 159 | trillion: Triliun 160 | unit: '' 161 | format: 162 | delimiter: '' 163 | precision: 3 164 | significant: true 165 | strip_insignificant_zeros: true 166 | storage_units: 167 | format: ! '%n %u' 168 | units: 169 | byte: 170 | one: Byte 171 | other: Byte 172 | gb: GB 173 | kb: KB 174 | mb: MB 175 | tb: TB 176 | percentage: 177 | format: 178 | delimiter: '' 179 | precision: 180 | format: 181 | delimiter: '' 182 | support: 183 | array: 184 | last_word_connector: ! ' dan ' 185 | two_words_connector: ! ', ' 186 | words_connector: ! ', ' 187 | time: 188 | am: am 189 | formats: 190 | default: ! '%a, %d %b %Y %H.%M.%S %z' 191 | long: ! '%d %B %Y %H.%M' 192 | short: ! '%d %b %H.%M' 193 | pm: pm 194 | -------------------------------------------------------------------------------- /locales/rails-i18n/iso-639-2/fur.yml: -------------------------------------------------------------------------------- 1 | fur: 2 | date: 3 | abbr_day_names: 4 | - dom 5 | - lun 6 | - mar 7 | - mie 8 | - joi 9 | - vin 10 | - sab 11 | abbr_month_names: 12 | - 13 | - Zen 14 | - Fev 15 | - Mar 16 | - Avr 17 | - Mai 18 | - Jug 19 | - Lui 20 | - Avo 21 | - Set 22 | - Otu 23 | - Nov 24 | - Dic 25 | day_names: 26 | - domenie 27 | - lunis 28 | - martars 29 | - miercus 30 | - joibe 31 | - vinars 32 | - sabide 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%d di %B dal %Y' 36 | short: ! '%d di %b' 37 | month_names: 38 | - 39 | - Zenâr 40 | - Fevrâr 41 | - Març 42 | - Avrîl 43 | - Mai 44 | - Jugn 45 | - Lui 46 | - Avost 47 | - Setembar 48 | - Otubar 49 | - Novembar 50 | - Dicembar 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: cirche une ore 59 | other: cirche %{count} oris 60 | about_x_months: 61 | one: cirche un mês 62 | other: cirche %{count} mês 63 | about_x_years: 64 | one: cirche un an 65 | other: cirche %{count} agns 66 | almost_x_years: 67 | one: cuasi un an 68 | other: cuasi %{count} agns 69 | half_a_minute: mieç minût 70 | less_than_x_minutes: 71 | one: mancul di un minût 72 | other: mancul di %{count} minûts 73 | less_than_x_seconds: 74 | one: mancul di un secont 75 | other: mancul di %{count} seconts 76 | over_x_years: 77 | one: plui di un an 78 | other: plui di %{count} agns 79 | x_days: 80 | one: 1 zornade 81 | other: ! '%{count} zornadis' 82 | x_minutes: 83 | one: 1 minût 84 | other: ! '%{count} minûts' 85 | x_months: 86 | one: 1 mês 87 | other: ! '%{count} mês' 88 | x_seconds: 89 | one: 1 secont 90 | other: ! '%{count} seconts' 91 | prompts: 92 | day: Zornade 93 | hour: Ore 94 | minute: Minût 95 | month: Mês 96 | second: Secont 97 | year: An 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: al à di jessi acetât 102 | blank: nol pues jessi lassât in blanc 103 | confirmation: nol è compagn de conferme 104 | empty: nol pues jessi vueit 105 | equal_to: al à di jessi compagn di %{count} 106 | even: al à di jessi pâr 107 | exclusion: al è riservât 108 | greater_than: al à di jessi plui grant di %{count} 109 | greater_than_or_equal_to: al à di jessi plui grant o compagn di %{count} 110 | inclusion: nol è includût te liste 111 | invalid: nol è valit 112 | less_than: al à di jessi mancul di %{count} 113 | less_than_or_equal_to: al à di jessi mancul o compagn di %{count} 114 | not_a_number: nol è un numar 115 | not_an_integer: al à di jessi un numar intîr 116 | odd: al à di jessi dispar 117 | record_invalid: ! 'Convalide falide: %{errors}' 118 | taken: al è za doprât 119 | too_long: al è masse lunc (il massim al è %{count} letaris) 120 | too_short: al è masse curt (il minim al è %{count} letaris) 121 | wrong_length: nol à la lungjece juste (al à di jessi di %{count} letaris) 122 | template: 123 | body: ! 'Torne par plasê a controlâ i cjamps ca sot:' 124 | header: 125 | one: ! 'No si pues salvâ chest %{model}: 1 erôr' 126 | other: ! 'No si pues salvâ chest %{model}: %{count} erôrs.' 127 | helpers: 128 | select: 129 | prompt: Sielç par plasê 130 | submit: 131 | create: Cree %{model} 132 | submit: Salve %{model} 133 | update: Inzorne %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: € 144 | format: 145 | delimiter: . 146 | precision: 3 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: bilion 155 | million: milion 156 | quadrillion: cuadrilion 157 | thousand: miâr 158 | trillion: trilion 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Byte 171 | gb: Gb 172 | kb: Kb 173 | mb: Mb 174 | tb: Tb 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' e ' 184 | two_words_connector: ! ' e ' 185 | words_connector: ! ', ' 186 | time: 187 | am: am 188 | formats: 189 | default: ! '%a %d di %b dal %Y, %H:%M:%S %z' 190 | long: ! '%d di %B dal %Y %H:%M' 191 | short: ! '%d di %b %H:%M' 192 | pm: pm 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/ja.yml: -------------------------------------------------------------------------------- 1 | ja: 2 | date: 3 | abbr_day_names: 4 | - 日 5 | - 月 6 | - 火 7 | - 水 8 | - 木 9 | - 金 10 | - 土 11 | abbr_month_names: 12 | - 13 | - 1月 14 | - 2月 15 | - 3月 16 | - 4月 17 | - 5月 18 | - 6月 19 | - 7月 20 | - 8月 21 | - 9月 22 | - 10月 23 | - 11月 24 | - 12月 25 | day_names: 26 | - 日曜日 27 | - 月曜日 28 | - 火曜日 29 | - 水曜日 30 | - 木曜日 31 | - 金曜日 32 | - 土曜日 33 | formats: 34 | default: ! '%Y/%m/%d' 35 | long: ! '%Y年%m月%d日(%a)' 36 | short: ! '%m/%d' 37 | month_names: 38 | - 39 | - 1月 40 | - 2月 41 | - 3月 42 | - 4月 43 | - 5月 44 | - 6月 45 | - 7月 46 | - 8月 47 | - 9月 48 | - 10月 49 | - 11月 50 | - 12月 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 約1時間 59 | other: 約%{count}時間 60 | about_x_months: 61 | one: 約1ヶ月 62 | other: 約%{count}ヶ月 63 | about_x_years: 64 | one: 約1年 65 | other: 約%{count}年 66 | almost_x_years: 67 | one: 1年弱 68 | other: ! '%{count}年弱' 69 | half_a_minute: 30秒前後 70 | less_than_x_minutes: 71 | one: 1分以内 72 | other: ! '%{count}分未満' 73 | less_than_x_seconds: 74 | one: 1秒以内 75 | other: ! '%{count}秒未満' 76 | over_x_years: 77 | one: 1年以上 78 | other: ! '%{count}年以上' 79 | x_days: 80 | one: 1日 81 | other: ! '%{count}日' 82 | x_minutes: 83 | one: 1分 84 | other: ! '%{count}分' 85 | x_months: 86 | one: 1ヶ月 87 | other: ! '%{count}ヶ月' 88 | x_seconds: 89 | one: 1秒 90 | other: ! '%{count}秒' 91 | prompts: 92 | day: 日 93 | hour: 時 94 | minute: 分 95 | month: 月 96 | second: 秒 97 | year: 年 98 | errors: 99 | format: ! '%{attribute}%{message}' 100 | messages: 101 | accepted: を受諾してください。 102 | blank: を入力してください。 103 | present: は入力しないでください。 104 | confirmation: と%{attribute}の入力が一致しません。 105 | empty: を入力してください。 106 | equal_to: は%{count}にしてください。 107 | even: は偶数にしてください。 108 | exclusion: は予約されています。 109 | greater_than: は%{count}より大きい値にしてください。 110 | greater_than_or_equal_to: は%{count}以上の値にしてください。 111 | inclusion: は一覧にありません。 112 | invalid: は不正な値です。 113 | less_than: は%{count}より小さい値にしてください。 114 | less_than_or_equal_to: は%{count}以下の値にしてください。 115 | not_a_number: は数値で入力してください。 116 | not_an_integer: は整数で入力してください。 117 | odd: は奇数にしてください。 118 | record_invalid: バリデーションに失敗しました。 %{errors} 119 | restrict_dependent_destroy: ! '%{record}が存在しているので削除できません。' 120 | taken: はすでに存在します。 121 | too_long: は%{count}文字以内で入力してください。 122 | too_short: は%{count}文字以上で入力してください。 123 | wrong_length: は%{count}文字で入力してください。 124 | other_than: "は%{count}以外の値にしてください。" 125 | template: 126 | body: 次の項目を確認してください。 127 | header: 128 | one: ! '%{model}にエラーが発生しました。' 129 | other: ! '%{model}に%{count}個のエラーが発生しました。' 130 | helpers: 131 | select: 132 | prompt: 選択してください。 133 | submit: 134 | create: 登録する 135 | submit: 保存する 136 | update: 更新する 137 | number: 138 | currency: 139 | format: 140 | delimiter: ! ',' 141 | format: ! '%n%u' 142 | precision: 0 143 | separator: . 144 | significant: false 145 | strip_insignificant_zeros: false 146 | unit: 円 147 | format: 148 | delimiter: ! ',' 149 | precision: 3 150 | separator: . 151 | significant: false 152 | strip_insignificant_zeros: false 153 | human: 154 | decimal_units: 155 | format: ! '%n %u' 156 | units: 157 | billion: 十億 158 | million: 百万 159 | quadrillion: 千兆 160 | thousand: 千 161 | trillion: 兆 162 | unit: '' 163 | format: 164 | delimiter: '' 165 | precision: 3 166 | significant: true 167 | strip_insignificant_zeros: true 168 | storage_units: 169 | format: ! '%n%u' 170 | units: 171 | byte: バイト 172 | gb: ギガバイト 173 | kb: キロバイト 174 | mb: メガバイト 175 | tb: テラバイト 176 | percentage: 177 | format: 178 | delimiter: '' 179 | format: "%n%" 180 | precision: 181 | format: 182 | delimiter: '' 183 | support: 184 | array: 185 | last_word_connector: と 186 | two_words_connector: と 187 | words_connector: と 188 | time: 189 | am: 午前 190 | formats: 191 | default: ! '%Y/%m/%d %H:%M:%S' 192 | long: ! '%Y年%m月%d日(%a) %H時%M分%S秒 %z' 193 | short: ! '%y/%m/%d %H:%M' 194 | pm: 午後 195 | -------------------------------------------------------------------------------- /locales/rails-i18n/km.yml: -------------------------------------------------------------------------------- 1 | km: 2 | date: 3 | abbr_day_names: 4 | - អទ 5 | - ច 6 | - អ 7 | - ពុ 8 | - ព្រ 9 | - សុ 10 | - សៅ 11 | abbr_month_names: 12 | - 13 | - មករា 14 | - កុម្ភៈ 15 | - មិនា 16 | - មេសា 17 | - ឧសភា 18 | - មិថុនា 19 | - កក្កដា 20 | - សីហា 21 | - កញ្ញា 22 | - តុលា 23 | - វិច្ឆិកា 24 | - ធ្នូ 25 | day_names: 26 | - ថ្ងៃចន្ទ 27 | - ថ្ងៃអង្គារ 28 | - ថ្ងៃពុធ 29 | - ថ្ងៃព្រហស្បតិ៍ 30 | - ថ្ងៃសុក្រ 31 | - ថ្ងៃសៅរ៍ 32 | - ថ្ងៃអាទិត្យ 33 | formats: 34 | long: ! ”ថ្ងៃទី%e %B %Y %H:%M %Z" 35 | default: ! “%d %B %Y” 36 | short: ! “%d %b” 37 | month_names: 38 | - 39 | - ខែមករា 40 | - ខែកុម្ភៈ 41 | - ខែមិនា 42 | - ខែមេសា 43 | - ខែឧសភា 44 | - ខែមិថុនា 45 | - ខែកក្កដា 46 | - ខែសីហា 47 | - ខែកញ្ញា 48 | - ខែតុលា 49 | - ខែវិច្ឆិកា 50 | - ខែធ្នូ 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | -------------------------------------------------------------------------------- /locales/rails-i18n/kn.yml: -------------------------------------------------------------------------------- 1 | kn: 2 | date: 3 | abbr_day_names: 4 | - ರವಿ 5 | - ಸೋಮ 6 | - ಮಂಗಳ 7 | - ಬುಧ 8 | - ಗುರು 9 | - ಶುಕ್ರ 10 | - ಶನಿ 11 | abbr_month_names: 12 | - 13 | - Jan 14 | - Feb 15 | - Mar 16 | - Apr 17 | - May 18 | - Jun 19 | - Jul 20 | - Aug 21 | - Sep 22 | - Oct 23 | - Nov 24 | - Dec 25 | day_names: 26 | - ರವಿವಾರ 27 | - ಸೋಮವಾರ 28 | - ಮಂಗಳವಾರ 29 | - ಬುಧವಾರ 30 | - ಗುರುವಾರ 31 | - ಶುಕ್ರವಾರ 32 | - ಶನಿವಾರ 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%B %d, %Y' 36 | short: ! '%b %d' 37 | month_names: 38 | - 39 | - ಜನವರಿ 40 | - ಫೆಬ್ರವರಿ 41 | - ಮಾರ್ಚ್ 42 | - ಏಪ್ರಿಲ್ 43 | - ಮೇ 44 | - ಜೂನ್ 45 | - ಜುಲೈ 46 | - ಆಗಸ್ಟ್ 47 | - ಸೆಪ್ಟೆಂಬರ್ 48 | - ಅಕ್ಟೋಬರ್ 49 | - ನವಂಬರ್ 50 | - ಡಿಸೆಂಬರ್ 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: ಸುಮಾರು ಒಂದು ಗಂಟೆ 59 | other: ಸುಮಾರು %{count} ಗಂಟೆಗಳು 60 | about_x_months: 61 | one: ಸುಮಾರು ಒಂದು ತಿಂಗಳು 62 | other: ಸುಮಾರು %{count} ತಿಂಗಳುಗಳು 63 | about_x_years: 64 | one: ಸುಮಾರು ಒಂದು ವರುಷ 65 | other: ಸುಮಾರು %{count} ವರುಷಗಳು 66 | almost_x_years: 67 | one: ಸರಿಸುಮಾರು ಒಂದು ವರುಷ 68 | other: ಸರಿಸುಮಾರು %{count} ವರುಷಗಳು 69 | half_a_minute: ಒಂದು ಅರ್ಧ ನಿಮಿಷ 70 | less_than_x_minutes: 71 | one: ಒಂದು ನಿಮಿಷಕ್ಕೂ ಕಡಿಮೆ 72 | other: ! '%{count} ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ' 73 | less_than_x_seconds: 74 | one: ಒಂದು ಸೆಕೆಂಡಿಗೂ ಕಡಿಮೆ 75 | other: ! '%{count} ಸೆಕೆಂಡಿಗಿಂತ ಕಡಿಮೆ' 76 | over_x_years: 77 | one: ಒಂದು ವರುಷಕ್ಕಿಂತ ಹೆಚ್ಚು 78 | other: ! '%{count} ವರುಷಗಳಿಗಿಂತ ಹೆಚ್ಚು' 79 | x_days: 80 | one: 1 ದಿನ 81 | other: ! '%{count} ದಿನಗಳು' 82 | x_minutes: 83 | one: 1 ನಿಮಿಷ 84 | other: ! '%{count} ನಿಮಿಷಗಳು' 85 | x_months: 86 | one: 1 ತಿಂಗಳು 87 | other: ! '%{count} ತಿಂಗಳುಗಳು' 88 | x_seconds: 89 | one: 1 ಸೆಕೆಂಡ್ 90 | other: ! '%{count} ಸೆಕೆಂಡುಗಳು' 91 | prompts: 92 | day: ದಿನ 93 | hour: ಗಂಟೆ 94 | minute: ನಿಮಿಷ 95 | month: ತಿಂಗಳು 96 | second: ಸೆಕೆಂಡು 97 | year: ವರುಷ 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: ಒಪ್ಪಿಕೊಳ್ಳಬೇಕು 102 | blank: ಖಾಲಿ ಬಿಡಲು ಸಧ್ಯವಿಲ್ಲ 103 | confirmation: ಸಮರ್ಥನೆ ಸರಿಬರಲ್ಲಿಲ್ಲ 104 | empty: ಖಾಲಿ ಬಿಡಲು ಸಧ್ಯವಿಲ್ಲ 105 | equal_to: ! '%{count} ಕ್ಕೆ ಸಮಾನವಾಗಿರಬೇಕು' 106 | even: ಸಮ ಆಗಿರಬೇಕು 107 | exclusion: ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ 108 | greater_than: ! '%{count} ಕ್ಕಿಂತ ಹೆಚ್ಚಿರಬೇಕು' 109 | greater_than_or_equal_to: ! '%{count} ಕಿಂತ ಹೆಚ್ಚು ಅಥವಾ ಸಮಾನವಾಗಿರ ಇರಬೇಕು' 110 | inclusion: ಪಟ್ಟಿಯಲ್ಲಿ ಶಾಮೀಲು ಆಗಿಲ್ಲ 111 | invalid: ನಿರರ್ಥಕವಾಗಿದೆ 112 | less_than: ! '%{count} ಕ್ಕಿಂತ ಕಡಿಮೆ ಆಗಿರಬೇಕು' 113 | less_than_or_equal_to: ! '%{count} ಕಿಂತ ಕಡಿಮೆ ಅಥವಾ ಸಮಾನವಾಗಿರ ಇರಬೇಕು' 114 | not_a_number: ಸಂಖೆ ಆಗಿಲ್ಲ 115 | not_an_integer: ಸಂಖೆ ಆಗಿರಬೇಕು 116 | odd: ಬೆಸ ಆಗಿರಬೇಕು 117 | record_invalid: ! 'ತಪ್ಪು ಆಧಾರ: %{errors}' 118 | taken: ತೆಗೆದುಕೊಂಡಾಗಿದೆ 119 | too_long: ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ (ಗರಿಷ್ಟ %{count} ಅಕ್ಷರಗಳು) 120 | too_short: ಬಹಳ ಚಿಕ್ಕದಾಗಿದೆ (ಕನಿಷ್ಠ %{count} ಅಕ್ಷರಗಳು) 121 | wrong_length: ತಪ್ಪು ಉದ್ದವಿದೆ (%{count} ಅಕ್ಷರಗಳಿರಬೇಕು) 122 | template: 123 | body: ! 'ಸಮಸ್ಯೆಗಳಿರುವ ಜಾಗಗಳು:' 124 | header: 125 | one: 1 ಧೋಷದ ಪರಿಣಾಮ %{model} ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ 126 | other: ! '%{count} ಧೋಷಗಳ ಪರಿಣಾಮ %{model} ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ' 127 | helpers: 128 | select: 129 | prompt: ದಯವಿಟ್ಟು ಆರಿಸಿ 130 | submit: 131 | create: ! '%{model} ರಚಿಸಿ' 132 | submit: ! '%{model} ಕಳುಹಿಸು' 133 | update: ! '%{model} ರಚಿಸಿ' 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ',' 138 | format: ! '%u%n' 139 | precision: 2 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: $ 144 | format: 145 | delimiter: ! ',' 146 | precision: 3 147 | separator: . 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: ಲಕ್ಷಕೋಟಿ 155 | million: ದಶಲಕ್ಷ 156 | quadrillion: ಪದ್ಮ 157 | thousand: ಸಾವಿರ 158 | trillion: ನೀಲ್ 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', ಮತ್ತು ' 184 | two_words_connector: ! ' ಮತ್ತು ' 185 | words_connector: ! ', ' 186 | time: 187 | am: ಪ್ರಾತಃಕಾಲ 188 | formats: 189 | default: ! '%a, %d %b %Y %H:%M:%S %z' 190 | long: ! '%B %d, %Y %H:%M' 191 | short: ! '%d %b %H:%M' 192 | pm: ಅಪರನ್ನಃ 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/ko.yml: -------------------------------------------------------------------------------- 1 | ko: 2 | date: 3 | abbr_day_names: 4 | - 일 5 | - 월 6 | - 화 7 | - 수 8 | - 목 9 | - 금 10 | - 토 11 | abbr_month_names: 12 | - 13 | - 1월 14 | - 2월 15 | - 3월 16 | - 4월 17 | - 5월 18 | - 6월 19 | - 7월 20 | - 8월 21 | - 9월 22 | - 10월 23 | - 11월 24 | - 12월 25 | day_names: 26 | - 일요일 27 | - 월요일 28 | - 화요일 29 | - 수요일 30 | - 목요일 31 | - 금요일 32 | - 토요일 33 | formats: 34 | default: ! '%Y/%m/%d' 35 | long: ! '%Y년 %m월 %d일 (%a)' 36 | short: ! '%m/%d' 37 | month_names: 38 | - 39 | - 1월 40 | - 2월 41 | - 3월 42 | - 4월 43 | - 5월 44 | - 6월 45 | - 7월 46 | - 8월 47 | - 9월 48 | - 10월 49 | - 11월 50 | - 12월 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 약 한 시간 59 | other: 약 %{count}시간 60 | about_x_months: 61 | one: 약 한 달 62 | other: 약 %{count}달 63 | about_x_years: 64 | one: 약 일 년 65 | other: 약 %{count}년 66 | almost_x_years: 67 | one: 일 년 이하 68 | other: ! '%{count}년 이하' 69 | half_a_minute: 30초 70 | less_than_x_minutes: 71 | one: 일 분 이하 72 | other: ! '%{count}분 이하' 73 | less_than_x_seconds: 74 | one: 일 초 이하 75 | other: ! '%{count}초 이하' 76 | over_x_years: 77 | one: 일 년 이상 78 | other: ! '%{count}년 이상' 79 | x_days: 80 | one: 하루 81 | other: ! '%{count}일' 82 | x_minutes: 83 | one: 일 분 84 | other: ! '%{count}분' 85 | x_months: 86 | one: 한 달 87 | other: ! '%{count}달' 88 | x_seconds: 89 | one: 일 초 90 | other: ! '%{count}초' 91 | prompts: 92 | day: 일 93 | hour: 시 94 | minute: 분 95 | month: 월 96 | second: 초 97 | year: 년 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: 을(를) 반드시 확인해야 합니다 102 | blank: 에 내용을 입력해 주세요 103 | confirmation: 은(는) 서로 일치해야 합니다 104 | empty: 에 내용을 입력해 주세요 105 | equal_to: 은(는) %{count}과 같아야 합니다 106 | even: 에 짝수를 입력해 주세요 107 | exclusion: 은(는) 이미 예약되어 있는 값입니다 108 | greater_than: 은(는) %{count}보다 커야 합니다 109 | greater_than_or_equal_to: 은(는) %{count}보다 크거야 같아야 합니다 110 | inclusion: 은(는) 목록에 포함되어 있는 값이 아닙니다 111 | invalid: 은(는) 올바르지 않은 값입니다 112 | less_than: 은(는) %{count}보다 작아야 합니다 113 | less_than_or_equal_to: 은(는) %{count}과 작거나 같아야 합니다 114 | not_a_number: 에 숫자를 입력해 주세요 115 | not_an_integer: 에 정수를 입력해 주세요 116 | odd: 에 홀수를 입력해 주세요 117 | record_invalid: 데이터 검증에 실패하였습니다. %{errors} 118 | taken: 은(는) 이미 존재합니다. 119 | too_long: 은(는) %{count}자를 넘을 수 없습니다 120 | too_short: 은(는) 적어도 %{count}자를 넘어야 합니다 121 | wrong_length: 은(는) %{count}자여야 합니다 122 | template: 123 | body: ! '다음 항목에 문제가 발견되었습니다:' 124 | header: 125 | one: 한 개의 오류가 발생해 %{model}를 저장 할 수 없습니다 126 | other: ! '%{count}개의 오류가 발생해 %{model}를 저장 할 수 없습니다' 127 | helpers: 128 | select: 129 | prompt: 선택해주세요 130 | submit: 131 | create: 등록 132 | submit: 제출 133 | update: 갱신 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ',' 138 | format: ! '%n%u' 139 | precision: 0 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: 원 144 | format: 145 | delimiter: ! ',' 146 | precision: 3 147 | separator: . 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n%u' 153 | units: 154 | billion: 십억 155 | million: 백만 156 | quadrillion: 경 157 | thousand: 천 158 | trillion: 조 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n%u' 167 | units: 168 | byte: 바이트 169 | gb: 기가바이트 170 | kb: 킬로바이트 171 | mb: 메가바이트 172 | tb: 테라바이트 173 | percentage: 174 | format: 175 | delimiter: '' 176 | precision: 177 | format: 178 | delimiter: '' 179 | support: 180 | array: 181 | last_word_connector: ! ', ' 182 | two_words_connector: ! '와(과) ' 183 | words_connector: ! ', ' 184 | time: 185 | am: 오전 186 | formats: 187 | default: ! '%Y/%m/%d %H:%M:%S' 188 | long: ! '%Y년 %m월 %d일, %H시 %M분 %S초 %Z' 189 | short: ! '%y/%m/%d %H:%M' 190 | pm: 오후 191 | -------------------------------------------------------------------------------- /locales/rails-i18n/or.yml: -------------------------------------------------------------------------------- 1 | or: 2 | date: 3 | abbr_day_names: 4 | - ରବି 5 | - ସୋମ 6 | - ମଂଗଳ 7 | - ବୁଧ 8 | - ଗୁରୁ 9 | - ଶୁକ୍ର 10 | - ଶନି 11 | abbr_month_names: 12 | - 13 | - ଜାନୁ 14 | - ଫେବରୁ 15 | - ମାର 16 | - ଏପ୍ର 17 | - ମାଈ 18 | - ଜୁନ୍ 19 | - ଜୁଲ୍ 20 | - ଅଗସ୍ଟ 21 | - ସେପ୍ଟ 22 | - ଅକ୍ଟ 23 | - ନୋଭ 24 | - ଡିସ୍ 25 | day_names: 26 | - ରବିବାର 27 | - ସୋମବାର 28 | - ମଗଂଳବାର 29 | - ବୁଧବାର 30 | - ଗୁରୁବାର 31 | - ଶୁକ୍ରବାର 32 | - ଶନିବାର 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%B %d, %Y' 36 | short: ! '%b %d' 37 | month_names: 38 | - 39 | - ଜାନୁୟାରୀ 40 | - ଫେବୃୟାରୀ 41 | - ମାର୍ଚ଼ 42 | - ଏପ୍ରଲ 43 | - ମାଈ 44 | - ଜୁନ୍ 45 | - ଜୁଲାୟ 46 | - ଅଗଷ୍ତ 47 | - ସେପ୍ଟମ୍ବର୍ 48 | - ଅକ୍ଟୋବର୍ 49 | - ନୋଭେମ୍ବର 50 | - ଡିସମ୍ବର 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: ପାଖାପାଖି 1 ଘଣ୍ତ 59 | other: ପାଖାପାଖି %{count} ଘଣ୍ତ 60 | about_x_months: 61 | one: ପାଖାପାଖି 1 ମାସ 62 | other: ପାଖାପାଖି %{count} ମାସ 63 | about_x_years: 64 | one: ପାଖାପାଖି 1 year 65 | other: ପାଖାପାଖି %{count} years 66 | almost_x_years: 67 | one: ଅଳ୍ପ ଉଣ 1 ବର୍ଷ 68 | other: ଅଳ୍ପ ଉଣ %{count} ବର୍ଷ 69 | half_a_minute: ଦେଢ ମିନଟ୍ 70 | less_than_x_minutes: 71 | one: 1 ମିନଟ ବାକ 72 | other: ! '%{count} ମିନଟ ବାକ' 73 | less_than_x_seconds: 74 | one: 1 ସେକଣ୍ଢ ବାକ 75 | other: ! '%{count} ସେକଣ୍ଢ ବାକ' 76 | over_x_years: 77 | one: 1 ବର୍ଷରୁ ଅଧିକ 78 | other: ! '%{count} ବର୍ଷରୁ ଅଧିକ' 79 | x_days: 80 | one: 1 ଦିନ 81 | other: ! '%{count} ଦିନ' 82 | x_minutes: 83 | one: 1 ମିନଟ 84 | other: ! '%{count} ମିନଟ' 85 | x_months: 86 | one: 1 ମାସ 87 | other: ! '%{count} ମାସ' 88 | x_seconds: 89 | one: 1 ସେକଣ୍ଢ 90 | other: ! '%{count} ସେକଣ୍ଢ' 91 | prompts: 92 | day: ଦିନ 93 | hour: ଘଣ୍ତ 94 | minute: ମିନଟ 95 | month: ମାସ 96 | second: ସେକଣ୍ଢ 97 | year: ବର୍ଷ 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: ଗ୍ରହଣ କରିବାର ଅଛି 102 | blank: ଖାଲି ହେଇ ପାରୀବନ 103 | confirmation: ପ୍ରମାଣ ହେଇନି 104 | empty: ଖାଲି ହେଇପାରିବନି 105 | equal_to: ! '%{count} କୁ ସମାନ' 106 | even: ଯୁଗ୍ମ ହେବାର ଅଛି 107 | exclusion: ସୁରଖିତ ଅଟେ 108 | greater_than: ! '%{count} ରୁ ବଡ ହେବାର ଅଛି' 109 | greater_than_or_equal_to: ! '%{count} ରୁ ବଡ କିମ୍ବା ସମାନ ହେବାର ଅଛି' 110 | inclusion: ସୁଚୀ ରେ ଅନ୍ତର୍ଭୁକ୍ତ ନୁହେଁ 111 | invalid: ଠିକ୍ ନୁହେଁ 112 | less_than: ! '%{count} ରୁ ଛୋଟ' 113 | less_than_or_equal_to: ! '%{count} ରୁ ଛୋଟ କିମ୍ବା ସମାନ ହେବାର ଅଛି' 114 | not_a_number: ସଂଖ୍ଯ ନୁହେଁ 115 | not_an_integer: ଗଣନ ସଂଖ୍ଯା ହେବାର ଅଛି 116 | odd: ଅଯୁଗ୍ମ ହେବାର ଅଛି 117 | record_invalid: ! 'ସଠିକ୍ ନୁହ: %{errors}' 118 | taken: ଗ୍ରହଣ କରା ଯାଇଛି 119 | too_long: ଦିର୍ଘତମ ଅଟେ(ଅତ୍ୟଧୀକ %{count} ଅଖ୍ଯର) 120 | too_short: ଅତି ସଂଖିପ୍ତ ଅଟେ (ଅତ୍ଯଳ୍ପ %{count} ଅଖ୍ଯର ଅଟେ) 121 | wrong_length: ଲମ୍ବା ଭୁଲ ଅଟେ (%{count} ଅଖ୍ଯର ହେବା ଉଚିତ୍) 122 | template: 123 | body: ! 'ନିମ୍ନ ଜାଗା ରେ ଅସୁବିଧା ହେଇଛି:' 124 | header: 125 | one: ! '1 ଭୁଲ ଯଗୁଁ ନିମ୍ନ %{model} ସୁରଖିତ ହେଇପାରି ନଥିଲା' 126 | other: ! '%{count} ଭୁଲ ଯଗୁଁ ଏହି %{model} ସୁରଖିତ ହେଇପାରି ନଥିଲା' 127 | helpers: 128 | select: 129 | prompt: ପସନ୍ଦ କର 130 | submit: 131 | create: ! '%{model} ବନାଅ' 132 | submit: ! '%{model} ସୁରଖିତ କର' 133 | update: ! '%{model} ଅାଧୂନିକରଣ କର' 134 | number: 135 | currency: 136 | format: 137 | delimiter: ! ',' 138 | format: ! '%u%n' 139 | precision: 2 140 | separator: . 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: ₹ 144 | format: 145 | delimiter: ! ',' 146 | precision: 3 147 | separator: . 148 | significant: ମିଥ୍ଯା 149 | strip_insignificant_zeros: ମିଥ୍ଯା 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: ବିଲିୟନ୍ 155 | million: ମିଲିୟନ୍ 156 | quadrillion: ହଜାର ବିଲିୟନ୍ 157 | thousand: ହଜାର 158 | trillion: ଟ୍ରିଲିୟନ୍ 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ', ଏବଂ ' 184 | two_words_connector: ! ' ଏବଂ ' 185 | words_connector: ! ', ' 186 | time: 187 | am: ପୁର୍ଵାହ୍ନ 188 | formats: 189 | default: ! '%a, %d %b %Y %H:%M:%S %z' 190 | long: ! '%B %d, %Y %H:%M' 191 | short: ! '%d %b %H:%M' 192 | pm: ଅପରାହ୍ନ 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/sv.yml: -------------------------------------------------------------------------------- 1 | sv: 2 | date: 3 | abbr_day_names: 4 | - sön 5 | - mån 6 | - tis 7 | - ons 8 | - tor 9 | - fre 10 | - lör 11 | abbr_month_names: 12 | - 13 | - jan 14 | - feb 15 | - mar 16 | - apr 17 | - maj 18 | - jun 19 | - jul 20 | - aug 21 | - sep 22 | - okt 23 | - nov 24 | - dec 25 | day_names: 26 | - söndag 27 | - måndag 28 | - tisdag 29 | - onsdag 30 | - torsdag 31 | - fredag 32 | - lördag 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%e %B %Y' 36 | short: ! '%e %b' 37 | month_names: 38 | - 39 | - januari 40 | - februari 41 | - mars 42 | - april 43 | - maj 44 | - juni 45 | - juli 46 | - augusti 47 | - september 48 | - oktober 49 | - november 50 | - december 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: ungefär en timme 59 | other: ungefär %{count} timmar 60 | about_x_months: 61 | one: ungefär en månad 62 | other: ungefär %{count} månader 63 | about_x_years: 64 | one: ungefär ett år 65 | other: ungefär %{count} år 66 | almost_x_years: 67 | one: nästan ett år 68 | other: nästan %{count} år 69 | half_a_minute: en halv minut 70 | less_than_x_minutes: 71 | one: mindre än en minut 72 | other: mindre än %{count} minuter 73 | less_than_x_seconds: 74 | one: mindre än en sekund 75 | other: mindre än %{count} sekunder 76 | over_x_years: 77 | one: mer än ett år 78 | other: mer än %{count} år 79 | x_days: 80 | one: en dag 81 | other: ! '%{count} dagar' 82 | x_minutes: 83 | one: en minut 84 | other: ! '%{count} minuter' 85 | x_months: 86 | one: en månad 87 | other: ! '%{count} månader' 88 | x_seconds: 89 | one: en sekund 90 | other: ! '%{count} sekunder' 91 | prompts: 92 | day: Dag 93 | hour: Timme 94 | minute: Minut 95 | month: Månad 96 | second: Sekund 97 | year: År 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: måste vara accepterad 102 | blank: måste anges 103 | confirmation: stämmer inte överens 104 | empty: får ej vara tom 105 | equal_to: måste vara samma som 106 | even: måste vara jämnt 107 | exclusion: är reserverat 108 | greater_than: måste vara större än %{count} 109 | greater_than_or_equal_to: måste vara större än eller lika med %{count} 110 | inclusion: finns inte i listan 111 | invalid: har fel format 112 | less_than: måste vara mindre än %{count} 113 | less_than_or_equal_to: måste vara mindre än eller lika med %{count} 114 | not_a_number: är inte ett nummer 115 | not_an_integer: måste vara ett heltal 116 | odd: måste vara udda 117 | record_invalid: ! 'Ett fel uppstod: %{errors}' 118 | taken: används redan 119 | too_long: är för lång (maximum är %{count} tecken) 120 | too_short: är för kort (minimum är %{count} tecken) 121 | wrong_length: har fel längd (ska vara %{count} tecken) 122 | template: 123 | body: ! 'Det var problem med följande fält:' 124 | header: 125 | one: Ett fel förhindrade denna %{model} från att sparas 126 | other: ! '%{count} fel förhindrade denna %{model} från att sparas' 127 | helpers: 128 | select: 129 | prompt: Välj 130 | submit: 131 | create: Skapa %{model} 132 | submit: Spara %{model} 133 | update: Ändra %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: '' 138 | format: ! '%n %u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: kr 144 | format: 145 | delimiter: '' 146 | precision: 2 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: Miljard 155 | million: Miljon 156 | quadrillion: Biljard 157 | thousand: Tusen 158 | trillion: Biljon 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 1 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: 169 | one: Byte 170 | other: Bytes 171 | gb: GB 172 | kb: KB 173 | mb: MB 174 | tb: TB 175 | percentage: 176 | format: 177 | delimiter: '' 178 | precision: 179 | format: 180 | delimiter: '' 181 | support: 182 | array: 183 | last_word_connector: ! ' och ' 184 | two_words_connector: ! ' och ' 185 | words_connector: ! ', ' 186 | time: 187 | am: '' 188 | formats: 189 | default: ! '%a, %e %b %Y %H:%M:%S %z' 190 | long: ! '%e %B %Y %H:%M' 191 | short: ! '%e %b %H:%M' 192 | pm: '' 193 | -------------------------------------------------------------------------------- /locales/rails-i18n/sw.yml: -------------------------------------------------------------------------------- 1 | sw: 2 | date: 3 | abbr_day_names: 4 | - J2 5 | - J3 6 | - J4 7 | - J5 8 | - Al 9 | - Ij 10 | - J1 11 | abbr_month_names: 12 | - 13 | - Jan 14 | - Feb 15 | - Mac 16 | - Apr 17 | - Mei 18 | - Jun 19 | - Jul 20 | - Ago 21 | - Sep 22 | - Okt 23 | - Nov 24 | - Des 25 | day_names: 26 | - Jumapili 27 | - Jumatatu 28 | - Jumanne 29 | - Jumatano 30 | - Alhamisi 31 | - Ijumaa 32 | - Jumamosi 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%e %B, %Y' 36 | short: ! '%e %b' 37 | month_names: 38 | - 39 | - Mwezi wa kwanza 40 | - Mwezi wa pili 41 | - Mwezi wa tatu 42 | - Mwezi wa nne 43 | - Mwezi wa tano 44 | - Mwezi wa sita 45 | - Mwezi wa saba 46 | - Mwezi wa nane 47 | - Mwezi wa tisa 48 | - Mwezi wa kumi 49 | - Mwezi wa kumi na moja 50 | - Mwezi wa kumi na mbili 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: kama saa limoja 59 | other: kama masaa %{count} 60 | about_x_months: 61 | one: kama mwezi 1 62 | other: kama miezi %{count} 63 | about_x_years: 64 | one: kama mwaka 1 65 | other: kama miaka %{count} 66 | almost_x_years: 67 | one: karibia mwaka 68 | other: karibia miaka %{count} 69 | half_a_minute: nusu dakika 70 | less_than_x_minutes: 71 | one: chini ya dakika 1 72 | other: chini ya dakika %{count} 73 | less_than_x_seconds: 74 | one: chini ya sekunde 1 75 | other: chini ya sekunde %{count} 76 | over_x_years: 77 | one: zaidi ya mwaka 1 78 | other: zaidi ya miaka %{count} 79 | x_days: 80 | one: siku 1 81 | other: siku %{count} 82 | x_minutes: 83 | one: dakika 1 84 | other: dakika %{count} 85 | x_months: 86 | one: mwezi 1 87 | other: miezi %{count} 88 | x_seconds: 89 | one: sekunde 1 90 | other: sekunde %{count} 91 | prompts: 92 | day: Siku 93 | hour: Saa 94 | minute: Dakika 95 | month: Mwezi 96 | second: Sekunde 97 | year: Mwaka 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: lazima ikubaliwe 102 | blank: haitakiwi kuwa wazi 103 | confirmation: haifanani na hapo chini 104 | empty: haitakiwi kuwa tupu 105 | equal_to: z/iwe sawa na %{count} 106 | even: z/iwe shufwa 107 | exclusion: haiwezi kutumika 108 | greater_than: z/iwe zaidi ya %{count} 109 | greater_than_or_equal_to: z/iwe sawa ama zaidi ya %{count} 110 | inclusion: haipo kwenye orodha 111 | invalid: haifai 112 | less_than: z/isizidi %{count} 113 | less_than_or_equal_to: z/iwe sawa na, ama chini ya %{count} 114 | not_a_number: inaruhusiwa namba tu 115 | not_an_integer: inaruhusiwa namba tu 116 | odd: z/iwe witiri 117 | record_invalid: ! 'Uhalalishaji umeshindikana: %{errors}' 118 | taken: imesajiliwa 119 | too_long: ndefu sana (isizidi herufi %{count}) 120 | too_short: fupi mno (isipungue herufi %{count}) 121 | wrong_length: idadi ya herufi hazilingani (inatakiwa %{count}) 122 | template: 123 | body: ! 'Tafadhali kagua sehemu zifuatazo:' 124 | header: 125 | one: ! '%{model} haikuhifadhiwa kwa sababu moja.' 126 | other: ! '%{model} haikuhifadhiwa kwa sababu %{count}.' 127 | helpers: 128 | select: 129 | prompt: Tafadhali teua 130 | submit: 131 | create: Unda %{model} 132 | submit: Akibisha %{model} 133 | update: Sasaisha %{model} 134 | number: 135 | currency: 136 | format: 137 | delimiter: . 138 | format: ! '%n%u' 139 | precision: 2 140 | separator: ! ',' 141 | significant: false 142 | strip_insignificant_zeros: false 143 | unit: /= 144 | format: 145 | delimiter: . 146 | precision: 2 147 | separator: ! ',' 148 | significant: false 149 | strip_insignificant_zeros: false 150 | human: 151 | decimal_units: 152 | format: ! '%n %u' 153 | units: 154 | billion: Bilioni 155 | million: Milioni 156 | quadrillion: Kuadrilioni 157 | thousand: Elfu 158 | trillion: Trilioni 159 | unit: '' 160 | format: 161 | delimiter: '' 162 | precision: 3 163 | significant: true 164 | strip_insignificant_zeros: true 165 | storage_units: 166 | format: ! '%n %u' 167 | units: 168 | byte: Baiti 169 | gb: GB 170 | kb: KB 171 | mb: MB 172 | tb: TB 173 | percentage: 174 | format: 175 | delimiter: '' 176 | precision: 177 | format: 178 | delimiter: '' 179 | support: 180 | array: 181 | last_word_connector: ! ', na ' 182 | two_words_connector: ! ' na ' 183 | words_connector: ! ', ' 184 | time: 185 | am: am 186 | formats: 187 | default: ! '%a, %d %b %Y %H:%M:%S' 188 | long: ! '%A, %e. %B %Y, %H:%M:%S' 189 | short: ! '%e %b %Y %H:%M' 190 | pm: pm 191 | -------------------------------------------------------------------------------- /locales/rails-i18n/th.yml: -------------------------------------------------------------------------------- 1 | th: 2 | date: 3 | abbr_day_names: 4 | - อา 5 | - จ 6 | - อ 7 | - พ 8 | - พฤ 9 | - ศ 10 | - ส 11 | abbr_month_names: 12 | - 13 | - ม.ค. 14 | - ก.พ. 15 | - มี.ค. 16 | - เม.ย. 17 | - พ.ค. 18 | - มิ.ย. 19 | - ก.ค. 20 | - ส.ค. 21 | - ก.ย. 22 | - ต.ค. 23 | - พ.ย. 24 | - ธ.ค. 25 | day_names: 26 | - อาทิตย์ 27 | - จันทร์ 28 | - อังคาร 29 | - พุธ 30 | - พฤหัสบดี 31 | - ศุกร์ 32 | - เสาร์ 33 | formats: 34 | default: ! '%d-%m-%Y' 35 | long: ! '%d %B %Y' 36 | short: ! '%d %b' 37 | month_names: 38 | - 39 | - มกราคม 40 | - กุมภาพันธ์ 41 | - มีนาคม 42 | - เมษายน 43 | - พฤษภาคม 44 | - มิถุนายน 45 | - กรกฎาคม 46 | - สิงหาคม 47 | - กันยายน 48 | - ตุลาคม 49 | - พฤศจิกายน 50 | - ธันวาคม 51 | order: 52 | - :day 53 | - :month 54 | - :year 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: ประมาณ %{count} ชั่วโมง 58 | about_x_months: ประมาณ %{count} เดือน 59 | about_x_years: ประมาณ %{count} ปี 60 | almost_x_years: เกือบ %{count} ปี 61 | half_a_minute: ครึ่งนาที 62 | less_than_x_minutes: น้อยกว่า %{count} นาที 63 | less_than_x_seconds: น้อยกว่า %{count} วินาที 64 | over_x_years: มากกว่า %{count} ปี 65 | x_days: ! '%{count} วัน' 66 | x_minutes: ! '%{count} นาที' 67 | x_months: ! '%{count} เดือน' 68 | x_seconds: ! '%{count} วินาที' 69 | prompts: 70 | day: วัน 71 | hour: ชั่วโมง 72 | minute: นาที 73 | month: เดือน 74 | second: วินาที 75 | year: ปี 76 | errors: 77 | format: ! '%{attribute} %{message}' 78 | messages: 79 | accepted: ต้องถูกยอมรับ 80 | blank: ต้องไม่เว้นว่างเอาไว้ 81 | confirmation: ไม่ตรงกับการยืนยัน 82 | empty: ต้องไม่เว้นว่างเอาไว้ 83 | equal_to: ต้องมีค่าเท่ากับ %{count} 84 | even: ต้องเป็นจำนวนคู่ 85 | exclusion: ไม่ได้รับอนุญาตให้ใช้ 86 | greater_than: ต้องมากกว่า %{count} 87 | greater_than_or_equal_to: ต้องมากกว่าหรือเท่ากับ %{count} 88 | inclusion: ไม่ได้อยู่ในรายการ 89 | invalid: ไม่ถูกต้อง 90 | less_than: ต้องมีค่าน้อยกว่า %{count} 91 | less_than_or_equal_to: ต้องมีค่าน้อยกว่าหรือเท่ากับ %{count} 92 | not_a_number: ไม่ใช่ตัวเลข 93 | not_an_integer: ไม่ใช่จำนวนเต็ม 94 | odd: ต้องเป็นจำนวนคี่ 95 | record_invalid: ! 'ไม่ผ่านการตรวจสอบ: %{errors}' 96 | taken: ถูกใช้ไปแล้ว 97 | too_long: ยาวเกินไป (ต้องไม่เกิน %{count} ตัวอักษร) 98 | too_short: สั้นเกินไป (ต้องยาวกว่า %{count} ตัวอักษร) 99 | wrong_length: มีความยาวไม่ถูกต้อง (ต้องมีความยาว %{count} ตัวอักษร) 100 | template: 101 | body: ! 'โปรดตรวจสอบข้อมูลในช่องต่อไปนี้:' 102 | header: พบข้อผิดพลาด %{count} ประการ ทำให้ไม่สามารถบันทึก%{model}ได้ 103 | helpers: 104 | select: 105 | prompt: โปรดเลือก 106 | submit: 107 | create: สร้าง%{model} 108 | submit: บันทึก%{model} 109 | update: ปรับปรุง%{model} 110 | number: 111 | currency: 112 | format: 113 | delimiter: ! ',' 114 | format: ! '%n %u' 115 | precision: 2 116 | separator: . 117 | significant: false 118 | strip_insignificant_zeros: false 119 | unit: บาท 120 | format: 121 | delimiter: ! ',' 122 | precision: 3 123 | separator: . 124 | significant: false 125 | strip_insignificant_zeros: false 126 | human: 127 | decimal_units: 128 | format: ! '%n %u' 129 | units: 130 | billion: พันล้าน 131 | million: ล้าน 132 | quadrillion: พันล้านล้าน 133 | thousand: พัน 134 | trillion: ล้านล้าน 135 | unit: '' 136 | format: 137 | delimiter: '' 138 | precision: 3 139 | significant: true 140 | strip_insignificant_zeros: true 141 | storage_units: 142 | format: ! '%n %u' 143 | units: 144 | byte: ไบต์ 145 | gb: จิกะไบต์ 146 | kb: กิโลไบต์ 147 | mb: เมกะไบต์ 148 | tb: เทระไบต์ 149 | percentage: 150 | format: 151 | delimiter: '' 152 | precision: 153 | format: 154 | delimiter: '' 155 | support: 156 | array: 157 | last_word_connector: ! ', และ ' 158 | two_words_connector: ! ' และ ' 159 | words_connector: ! ', ' 160 | time: 161 | am: ก่อนเที่ยง 162 | formats: 163 | default: ! '%a %d %b %Y %H:%M:%S %z' 164 | long: ! '%d %B %Y %H:%M น.' 165 | short: ! '%d %b %H:%M น.' 166 | pm: หลังเที่ยง 167 | -------------------------------------------------------------------------------- /locales/rails-i18n/zh-CN.yml: -------------------------------------------------------------------------------- 1 | zh-CN: 2 | date: 3 | abbr_day_names: 4 | - 周日 5 | - 周一 6 | - 周二 7 | - 周三 8 | - 周四 9 | - 周五 10 | - 周六 11 | abbr_month_names: 12 | - 13 | - 1月 14 | - 2月 15 | - 3月 16 | - 4月 17 | - 5月 18 | - 6月 19 | - 7月 20 | - 8月 21 | - 9月 22 | - 10月 23 | - 11月 24 | - 12月 25 | day_names: 26 | - 星期日 27 | - 星期一 28 | - 星期二 29 | - 星期三 30 | - 星期四 31 | - 星期五 32 | - 星期六 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%Y年%b%d日' 36 | short: ! '%b%d日' 37 | month_names: 38 | - 39 | - 一月 40 | - 二月 41 | - 三月 42 | - 四月 43 | - 五月 44 | - 六月 45 | - 七月 46 | - 八月 47 | - 九月 48 | - 十月 49 | - 十一月 50 | - 十二月 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 大约一小时 59 | other: 大约 %{count} 小时 60 | about_x_months: 61 | one: 大约一个月 62 | other: 大约 %{count} 个月 63 | about_x_years: 64 | one: 大约一年 65 | other: 大约 %{count} 年 66 | almost_x_years: 67 | one: 接近一年 68 | other: 接近 %{count} 年 69 | half_a_minute: 半分钟 70 | less_than_x_minutes: 71 | one: 不到一分钟 72 | other: 不到 %{count} 分钟 73 | less_than_x_seconds: 74 | one: 不到一秒 75 | other: 不到 %{count} 秒 76 | over_x_years: 77 | one: 一年多 78 | other: ! '%{count} 年多' 79 | x_days: 80 | one: 一天 81 | other: ! '%{count} 天' 82 | x_minutes: 83 | one: 一分钟 84 | other: ! '%{count} 分钟' 85 | x_months: 86 | one: 一个月 87 | other: ! '%{count} 个月' 88 | x_seconds: 89 | one: 一秒 90 | other: ! '%{count} 秒' 91 | prompts: 92 | day: 日 93 | hour: 时 94 | minute: 分 95 | month: 月 96 | second: 秒 97 | year: 年 98 | errors: 99 | format: ! '%{attribute}%{message}' 100 | messages: 101 | accepted: 必须是可被接受的 102 | blank: 不能为空字符 103 | present: 必须是空白 104 | confirmation: 与确认值不匹配 105 | empty: 不能留空 106 | equal_to: 必须等于 %{count} 107 | even: 必须为双数 108 | exclusion: 是保留关键字 109 | greater_than: 必须大于 %{count} 110 | greater_than_or_equal_to: 必须大于或等于 %{count} 111 | inclusion: 不包含于列表中 112 | invalid: 是无效的 113 | less_than: 必须小于 %{count} 114 | less_than_or_equal_to: 必须小于或等于 %{count} 115 | not_a_number: 不是数字 116 | not_an_integer: 必须是整数 117 | odd: 必须为单数 118 | record_invalid: ! '验证失败: %{errors}' 119 | restrict_dependent_destroy: 120 | one: 由于 %{record} 需要此记录,所以无法移除记录 121 | many: 由于 %{record} 需要此记录,所以无法移除记录 122 | taken: 已经被使用 123 | too_long: 124 | one: 过长(最长为一个字符) 125 | other: 过长(最长为 %{count} 个字符) 126 | too_short: 127 | one: 过短(最短为一个字符) 128 | other: 过短(最短为 %{count} 个字符) 129 | wrong_length: 130 | one: 长度非法(必须为一个字符) 131 | other: 长度非法(必须为 %{count} 个字符) 132 | other_than: 长度非法(不可为 %{count} 个字符 133 | template: 134 | body: 如下字段出现错误: 135 | header: 136 | one: 有 1 个错误发生导致「%{model}」无法被保存。 137 | other: 有 %{count} 个错误发生导致「%{model}」无法被保存。 138 | helpers: 139 | select: 140 | prompt: 请选择 141 | submit: 142 | create: 新增%{model} 143 | submit: 储存%{model} 144 | update: 更新%{model} 145 | number: 146 | currency: 147 | format: 148 | delimiter: ! ',' 149 | format: ! '%u %n' 150 | precision: 2 151 | separator: . 152 | significant: false 153 | strip_insignificant_zeros: false 154 | unit: CN¥ 155 | format: 156 | delimiter: ! ',' 157 | precision: 3 158 | separator: . 159 | significant: false 160 | strip_insignificant_zeros: false 161 | human: 162 | decimal_units: 163 | format: ! '%n %u' 164 | units: 165 | billion: 十亿 166 | million: 百万 167 | quadrillion: 千兆 168 | thousand: 千 169 | trillion: 兆 170 | unit: '' 171 | format: 172 | delimiter: '' 173 | precision: 1 174 | significant: false 175 | strip_insignificant_zeros: false 176 | storage_units: 177 | format: ! '%n %u' 178 | units: 179 | byte: 180 | one: Byte 181 | other: Bytes 182 | gb: GB 183 | kb: KB 184 | mb: MB 185 | tb: TB 186 | percentage: 187 | format: 188 | delimiter: '' 189 | precision: 190 | format: 191 | delimiter: '' 192 | support: 193 | array: 194 | last_word_connector: ! ', 和 ' 195 | two_words_connector: ! ' 和 ' 196 | words_connector: ! ', ' 197 | time: 198 | am: 上午 199 | formats: 200 | default: ! '%Y年%b%d日 %A %H:%M:%S %Z' 201 | long: ! '%Y年%b%d日 %H:%M' 202 | short: ! '%b%d日 %H:%M' 203 | pm: 下午 204 | -------------------------------------------------------------------------------- /locales/rails-i18n/zh-HK.yml: -------------------------------------------------------------------------------- 1 | zh-HK: 2 | date: 3 | abbr_day_names: 4 | - 周日 5 | - 周一 6 | - 周二 7 | - 周三 8 | - 周四 9 | - 周五 10 | - 周六 11 | abbr_month_names: 12 | - 13 | - 1月 14 | - 2月 15 | - 3月 16 | - 4月 17 | - 5月 18 | - 6月 19 | - 7月 20 | - 8月 21 | - 9月 22 | - 10月 23 | - 11月 24 | - 12月 25 | day_names: 26 | - 星期日 27 | - 星期一 28 | - 星期二 29 | - 星期三 30 | - 星期四 31 | - 星期五 32 | - 星期六 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%Y年%b%d日' 36 | short: ! '%b%d日' 37 | month_names: 38 | - 39 | - 一月 40 | - 二月 41 | - 三月 42 | - 四月 43 | - 五月 44 | - 六月 45 | - 七月 46 | - 八月 47 | - 九月 48 | - 十月 49 | - 十一月 50 | - 十二月 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 約一小時 59 | other: 約%{count}小時 60 | about_x_months: 61 | one: 約一個月 62 | other: 約%{count}個月 63 | about_x_years: 64 | one: 約一年 65 | other: 約%{count}年 66 | almost_x_years: 67 | one: 接近一年 68 | other: 接近%{count}年 69 | half_a_minute: 半分鐘 70 | less_than_x_minutes: 71 | one: 不到一分鐘 72 | other: 不到%{count}分鐘 73 | less_than_x_seconds: 74 | one: 不到一秒 75 | other: 不到%{count}秒 76 | over_x_years: 77 | one: 超過一年 78 | other: 超過%{count}年 79 | x_days: 80 | one: 一天 81 | other: ! '%{count}天' 82 | x_minutes: 83 | one: 一分鐘 84 | other: ! '%{count}分鐘' 85 | x_months: 86 | one: 一個月 87 | other: ! '%{count}個月' 88 | x_seconds: 89 | one: 一秒 90 | other: ! '%{count}秒' 91 | prompts: 92 | day: 日 93 | hour: 時 94 | minute: 分 95 | month: 月 96 | second: 秒 97 | year: 年 98 | errors: 99 | format: ! '%{message}' 100 | messages: 101 | accepted: 必定要接受%{attribute} 102 | blank: ! '%{attribute}不可以是空白' 103 | present: ! '%{attribute}必定要是空白' 104 | confirmation: ! '不符合%{attribute}' 105 | empty: ! '%{attribute}不可以留空' 106 | equal_to: ! '%{attribute}必須等於%{count}' 107 | even: ! '%{attribute}必須要是雙數' 108 | exclusion: ! '%{attribute}是被保留的關鍵字' 109 | greater_than: ! '%{attribute}必須大於%{count}' 110 | greater_than_or_equal_to: ! '%{attribute}必須大於或等於%{count}' 111 | inclusion: ! '%{attribute}沒有包含在列表中' 112 | invalid: ! '%{attribute}是無效的' 113 | less_than: ! '%{attribute}必須小於%{count}' 114 | less_than_or_equal_to: ! '%{attribute}必須小於或等於%{count}' 115 | not_a_number: ! '%{attribute}不是數字' 116 | not_an_integer: ! '%{attribute}必須是整數' 117 | odd: ! '%{attribute}必須是單數' 118 | record_invalid: ! '%{attribute}驗證失敗︰%{errors}' 119 | restrict_dependent_destroy: 120 | one: 由於%{record}依賴此記錄,無法移除 121 | many: 由於%{record}依賴此記錄,無法移除 122 | taken: ! '%{attribute}已被使用' 123 | too_long: 124 | one: 太長(最長為一個字元) 125 | other: 太長(最長為%{count}個字元) 126 | too_short: 127 | one: 太短(最少為一個字元) 128 | other: 太短(最少為%{count}個字元) 129 | wrong_length: 130 | one: 字數錯誤 (應為一個字元) 131 | other: 字數錯誤 (應為%{count}個字元) 132 | other_than: ! '%{attribute}唔可以係%{count}' 133 | template: 134 | body: 以下欄位發生問題︰ 135 | header: 136 | one: 發生一項錯誤,以致%{model}未能儲存。 137 | other: 發生%{count}項錯誤,以致%{model}未能儲存。 138 | helpers: 139 | select: 140 | prompt: 請選擇 141 | submit: 142 | create: 新增%{model} 143 | submit: 儲存%{model} 144 | update: 更新%{model} 145 | number: 146 | currency: 147 | format: 148 | delimiter: ! ',' 149 | format: ! '%u %n' 150 | precision: 2 151 | separator: . 152 | significant: false 153 | strip_insignificant_zeros: false 154 | unit: HK$ 155 | format: 156 | delimiter: ! ',' 157 | precision: 3 158 | separator: . 159 | significant: false 160 | strip_insignificant_zeros: false 161 | human: 162 | decimal_units: 163 | format: ! '%n %u' 164 | units: 165 | billion: 十億 166 | million: 百萬 167 | quadrillion: 千兆 168 | thousand: 千 169 | trillion: 兆 170 | unit: '' 171 | format: 172 | delimiter: '' 173 | precision: 1 174 | significant: false 175 | strip_insignificant_zeros: false 176 | storage_units: 177 | format: ! '%n %u' 178 | units: 179 | byte: 180 | one: Byte 181 | other: Bytes 182 | gb: GB 183 | kb: KB 184 | mb: MB 185 | tb: TB 186 | percentage: 187 | format: 188 | delimiter: '' 189 | format: '%n%' 190 | precision: 191 | format: 192 | delimiter: '' 193 | support: 194 | array: 195 | last_word_connector: ! '和' 196 | two_words_connector: ! '和' 197 | words_connector: 、 198 | time: 199 | am: 上午 200 | formats: 201 | default: ! '%Y年%b%d日 %A %H:%M:%S %Z' 202 | long: ! '%Y年%b%d日 %H:%M' 203 | short: ! '%b%d日 %H:%M' 204 | pm: 下午 205 | -------------------------------------------------------------------------------- /locales/rails-i18n/zh-TW.yml: -------------------------------------------------------------------------------- 1 | zh-TW: 2 | date: 3 | abbr_day_names: 4 | - 周日 5 | - 周一 6 | - 周二 7 | - 周三 8 | - 周四 9 | - 周五 10 | - 周六 11 | abbr_month_names: 12 | - 13 | - 1月 14 | - 2月 15 | - 3月 16 | - 4月 17 | - 5月 18 | - 6月 19 | - 7月 20 | - 8月 21 | - 9月 22 | - 10月 23 | - 11月 24 | - 12月 25 | day_names: 26 | - 星期日 27 | - 星期一 28 | - 星期二 29 | - 星期三 30 | - 星期四 31 | - 星期五 32 | - 星期六 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%Y年%b%d日' 36 | short: ! '%b%d日' 37 | month_names: 38 | - 39 | - 一月 40 | - 二月 41 | - 三月 42 | - 四月 43 | - 五月 44 | - 六月 45 | - 七月 46 | - 八月 47 | - 九月 48 | - 十月 49 | - 十一月 50 | - 十二月 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 大約一小時 59 | other: 大約 %{count} 小時 60 | about_x_months: 61 | one: 大約一個月 62 | other: 大約 %{count} 個月 63 | about_x_years: 64 | one: 大約一年 65 | other: 大約 %{count} 年 66 | almost_x_years: 67 | one: 接近一年 68 | other: 接近 %{count} 年 69 | half_a_minute: 半分鐘 70 | less_than_x_minutes: 71 | one: 不到一分鐘 72 | other: 不到 %{count} 分鐘 73 | less_than_x_seconds: 74 | one: 不到一秒 75 | other: 不到 %{count} 秒 76 | over_x_years: 77 | one: 一年多 78 | other: ! '%{count} 年多' 79 | x_days: 80 | one: 一天 81 | other: ! '%{count} 天' 82 | x_minutes: 83 | one: 一分鐘 84 | other: ! '%{count} 分鐘' 85 | x_months: 86 | one: 一個月 87 | other: ! '%{count} 個月' 88 | x_seconds: 89 | one: 一秒 90 | other: ! '%{count} 秒' 91 | prompts: 92 | day: 日 93 | hour: 時 94 | minute: 分 95 | month: 月 96 | second: 秒 97 | year: 年 98 | errors: 99 | format: ! '%{attribute} %{message}' 100 | messages: 101 | accepted: 必須是可被接受的 102 | blank: 不能是空白字元 103 | present: 必須是空白 104 | confirmation: 兩次輸入須一致 105 | empty: 不能留空 106 | equal_to: 必須等於 %{count} 107 | even: 必須是偶數 108 | exclusion: 是被保留的關鍵字 109 | greater_than: 必須大於 %{count} 110 | greater_than_or_equal_to: 必須大於或等於 %{count} 111 | inclusion: 沒有包含在列表中 112 | invalid: 是無效的 113 | less_than: 必須小於 %{count} 114 | less_than_or_equal_to: 必須小於或等於 %{count} 115 | not_a_number: 不是數字 116 | not_an_integer: 必須是整數 117 | odd: 必須是奇數 118 | record_invalid: ! '校驗失敗: %{errors}' 119 | restrict_dependent_destroy: 120 | one: 由於 %{record} 需要此記錄,所以無法移除記錄 121 | many: 由於 %{record} 需要此記錄,所以無法移除記錄 122 | taken: 已經被使用 123 | too_long: 124 | one: 過長(最長是一個字) 125 | other: 過長(最長是 %{count} 個字) 126 | too_short: 127 | one: 過短(最短是一個字) 128 | other: 過短(最短是 %{count} 個字) 129 | wrong_length: 130 | one: 字數錯誤 (必須是一個字) 131 | other: 字數錯誤 (必須是 %{count} 個字) 132 | other_than: 不可以是 %{count} 個字 133 | template: 134 | body: 以下欄位發生問題: 135 | header: 136 | one: 有 1 個錯誤發生使得「%{model}」無法被儲存。 137 | other: 有 %{count} 個錯誤發生使得「%{model}」無法被儲存。 138 | helpers: 139 | select: 140 | prompt: 請選擇 141 | submit: 142 | create: 新增%{model} 143 | submit: 儲存%{model} 144 | update: 更新%{model} 145 | number: 146 | currency: 147 | format: 148 | delimiter: ! ',' 149 | format: ! '%u %n' 150 | precision: 2 151 | separator: . 152 | significant: false 153 | strip_insignificant_zeros: false 154 | unit: NT$ 155 | format: 156 | delimiter: ! ',' 157 | precision: 3 158 | separator: . 159 | significant: false 160 | strip_insignificant_zeros: false 161 | human: 162 | decimal_units: 163 | format: ! '%n %u' 164 | units: 165 | billion: 十億 166 | million: 百萬 167 | quadrillion: 千兆 168 | thousand: 千 169 | trillion: 兆 170 | unit: '' 171 | format: 172 | delimiter: '' 173 | precision: 1 174 | significant: false 175 | strip_insignificant_zeros: false 176 | storage_units: 177 | format: ! '%n %u' 178 | units: 179 | byte: 180 | one: 位元組 181 | other: 位元組 182 | gb: GB 183 | kb: KB 184 | mb: MB 185 | tb: TB 186 | percentage: 187 | format: 188 | delimiter: '' 189 | precision: 190 | format: 191 | delimiter: '' 192 | support: 193 | array: 194 | last_word_connector: ! ', 和 ' 195 | two_words_connector: ! ' 和 ' 196 | words_connector: ! ', ' 197 | time: 198 | am: 上午 199 | formats: 200 | default: ! '%Y年%b%d日 %A %H:%M:%S %Z' 201 | long: ! '%Y年%b%d日 %H:%M' 202 | short: ! '%b%d日 %H:%M' 203 | pm: 下午 204 | -------------------------------------------------------------------------------- /locales/rails-i18n/zh-YUE.yml: -------------------------------------------------------------------------------- 1 | zh-YUE: 2 | date: 3 | abbr_day_names: 4 | - 周日 5 | - 周一 6 | - 周二 7 | - 周三 8 | - 周四 9 | - 周五 10 | - 周六 11 | abbr_month_names: 12 | - 13 | - 1月 14 | - 2月 15 | - 3月 16 | - 4月 17 | - 5月 18 | - 6月 19 | - 7月 20 | - 8月 21 | - 9月 22 | - 10月 23 | - 11月 24 | - 12月 25 | day_names: 26 | - 星期日 27 | - 星期一 28 | - 星期二 29 | - 星期三 30 | - 星期四 31 | - 星期五 32 | - 星期六 33 | formats: 34 | default: ! '%Y-%m-%d' 35 | long: ! '%Y年%b%d日' 36 | short: ! '%b%d日' 37 | month_names: 38 | - 39 | - 一月 40 | - 二月 41 | - 三月 42 | - 四月 43 | - 五月 44 | - 六月 45 | - 七月 46 | - 八月 47 | - 九月 48 | - 十月 49 | - 十一月 50 | - 十二月 51 | order: 52 | - :year 53 | - :month 54 | - :day 55 | datetime: 56 | distance_in_words: 57 | about_x_hours: 58 | one: 大概一個鐘 59 | other: 大概%{count}個鐘 60 | about_x_months: 61 | one: 大概一個月 62 | other: 大概%{count}個月 63 | about_x_years: 64 | one: 大概一年 65 | other: 大概%{count}年 66 | almost_x_years: 67 | one: 差唔多一年 68 | other: 差唔多%{count}年 69 | half_a_minute: 半分鐘 70 | less_than_x_minutes: 71 | one: 唔夠一分鐘 72 | other: 唔夠%{count}分鐘 73 | less_than_x_seconds: 74 | one: 唔夠一秒 75 | other: 唔夠%{count}秒 76 | over_x_years: 77 | one: 超過一年 78 | other: 超過%{count}年 79 | x_days: 80 | one: 一日 81 | other: ! '%{count}日' 82 | x_minutes: 83 | one: 一分鐘 84 | other: ! '%{count}分鐘' 85 | x_months: 86 | one: 一個月 87 | other: ! '%{count}個月' 88 | x_seconds: 89 | one: 一秒 90 | other: ! '%{count}秒' 91 | prompts: 92 | day: 日 93 | hour: 點 94 | minute: 分 95 | month: 月 96 | second: 秒 97 | year: 年 98 | errors: 99 | format: ! '%{message}' 100 | messages: 101 | accepted: 一定要接受%{attribute} 102 | blank: ! '%{attribute}唔可以空白' 103 | present: ! '%{attribute}要空白' 104 | confirmation: ! '%{attribute}唔夾' 105 | empty: ! '%{attribute}唔可以漏空' 106 | equal_to: ! '%{attribute}要係%{count}' 107 | even: ! '%{attribute}要係雙數' 108 | exclusion: ! '%{attribute}唔用得' 109 | greater_than: ! '%{attribute}要大過%{count}' 110 | greater_than_or_equal_to: ! '%{attribute}要大過或者等於%{count}' 111 | inclusion: ! '%{attribute}唔喺表入面' 112 | invalid: ! '%{attribute}無效' 113 | less_than: ! '%{attribute}要細過%{count}' 114 | less_than_or_equal_to: ! '%{attribute}要細過或者等於%{count}' 115 | not_a_number: ! '%{attribute}唔係一個數' 116 | not_an_integer: ! '%{attribute}要係整數' 117 | odd: ! '%{attribute}要係單數' 118 | record_invalid: ! '%{attribute}有問題︰%{errors}' 119 | restrict_dependent_destroy: 120 | one: 唔可以刪除,因為%{record}要用佢 121 | many: 唔可以刪除,因為%{record}要用佢 122 | taken: ! '%{attribute}已經用過' 123 | too_long: 124 | one: 太長(最多1個字) 125 | other: 太長(最多%{count}個字) 126 | too_short: 127 | one: 太短(最少1個字) 128 | other: 太短(最少%{count}個字) 129 | wrong_length: 130 | one: 唔啱字數 (要係1個字) 131 | other: 唔啱字數 (要係%{count}個字) 132 | other_than: ! '%{attribute}唔可以係%{count}' 133 | template: 134 | body: 呢啲有問題︰ 135 | header: 136 | one: 有一個問題,%{model}儲存唔到。 137 | other: 有%{count}個問題,%{model}儲存唔到。 138 | helpers: 139 | select: 140 | prompt: 喺度揀 141 | submit: 142 | create: 新嘅%{model} 143 | submit: 儲存%{model} 144 | update: 更新%{model} 145 | number: 146 | currency: 147 | format: 148 | delimiter: ! ',' 149 | format: ! '%u %n' 150 | precision: 2 151 | separator: . 152 | significant: false 153 | strip_insignificant_zeros: false 154 | unit: HK$ 155 | format: 156 | delimiter: ! ',' 157 | precision: 3 158 | separator: . 159 | significant: false 160 | strip_insignificant_zeros: false 161 | human: 162 | decimal_units: 163 | format: ! '%n %u' 164 | units: 165 | billion: 十億 166 | million: 百萬 167 | quadrillion: 千兆 168 | thousand: 千 169 | trillion: 兆 170 | unit: '' 171 | format: 172 | delimiter: '' 173 | precision: 1 174 | significant: false 175 | strip_insignificant_zeros: false 176 | storage_units: 177 | format: ! '%n %u' 178 | units: 179 | byte: 180 | one: Byte 181 | other: Bytes 182 | gb: GB 183 | kb: KB 184 | mb: MB 185 | tb: TB 186 | percentage: 187 | format: 188 | delimiter: '' 189 | format: '%n%' 190 | precision: 191 | format: 192 | delimiter: '' 193 | support: 194 | array: 195 | last_word_connector: 同 196 | two_words_connector: 同 197 | words_connector: 、 198 | time: 199 | am: 上晝 200 | formats: 201 | default: ! '%Y年%b%d號 %A %H:%M:%S %Z' 202 | long: ! '%Y年%b%d號 %H:%M' 203 | short: ! '%b%d號 %H:%M' 204 | pm: 下晝 205 | -------------------------------------------------------------------------------- /test/site/amber/config.rb: -------------------------------------------------------------------------------- 1 | @title = "Site Title" 2 | if $path_prefix 3 | @path_prefix = $path_prefix 4 | end 5 | @default_locale = :en 6 | @locales = [:en, :de] 7 | @short_paths = true 8 | -------------------------------------------------------------------------------- /test/site/amber/layouts/default.html.haml: -------------------------------------------------------------------------------- 1 | = yield -------------------------------------------------------------------------------- /test/site/amber/locales/en.yml: -------------------------------------------------------------------------------- 1 | en: 2 | yep: Yep! -------------------------------------------------------------------------------- /test/site/amber/menu.txt: -------------------------------------------------------------------------------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd 5 | fff -------------------------------------------------------------------------------- /test/site/apache.conf: -------------------------------------------------------------------------------- 1 | Listen 8888 2 | HostnameLookups Off 3 | PidFile DIR/apache.pid 4 | ServerName 127.0.0.1 5 | 6 | LogLevel debug rewrite:trace4 7 | ErrorLogFormat "%m %M" 8 | ErrorLog DIR/apache.log 9 | CustomLog DIR/apache.log "%r" 10 | 11 | LoadModule mpm_event_module /usr/lib/apache2/modules/mod_mpm_event.so 12 | LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so 13 | LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so 14 | LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so 15 | LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so 16 | LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so 17 | LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so 18 | 19 | TypesConfig /etc/mime.types 20 | DefaultLanguage en 21 | AddLanguage en .en 22 | AddLanguage de .de 23 | 24 | 25 | ServerAdmin webmaster@localhost 26 | 27 | AccessFileName .htaccess 28 | DocumentRoot "DIR/public" 29 | 30 | AllowOverride FileInfo Indexes Options=All,MultiViews 31 | 32 | Order deny,allow 33 | Allow from all 34 | 35 | 36 | Require all granted 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /test/site/apache_with_prefix.conf: -------------------------------------------------------------------------------- 1 | Listen 8888 2 | HostnameLookups Off 3 | PidFile DIR/apache.pid 4 | ServerName 127.0.0.1 5 | 6 | LogLevel debug rewrite:trace4 7 | ErrorLogFormat "%m %M" 8 | ErrorLog DIR/apache.log 9 | CustomLog DIR/apache.log "%r" 10 | 11 | LoadModule mpm_event_module /usr/lib/apache2/modules/mod_mpm_event.so 12 | LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so 13 | LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so 14 | LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so 15 | LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so 16 | LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so 17 | LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so 18 | 19 | TypesConfig /etc/mime.types 20 | DefaultLanguage en 21 | AddLanguage en .en 22 | AddLanguage de .de 23 | 24 | 25 | ServerAdmin webmaster@localhost 26 | 27 | DocumentRoot /srv 28 | 29 | AccessFileName .htaccess 30 | AliasMatch ^/[a-z]{2}/test(/.+|/|)$ DIR/public/$1 31 | Alias /test DIR/public/ 32 | 33 | 34 | AllowOverride FileInfo Indexes Options=All,MultiViews 35 | 36 | Order deny,allow 37 | Allow from all 38 | 39 | 40 | Require all granted 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /test/site/pages/aaa/asset.css: -------------------------------------------------------------------------------- 1 | asset -------------------------------------------------------------------------------- /test/site/pages/aaa/de.md: -------------------------------------------------------------------------------- 1 | de aaa -------------------------------------------------------------------------------- /test/site/pages/aaa/en.md: -------------------------------------------------------------------------------- 1 | en aaa -------------------------------------------------------------------------------- /test/site/pages/autoalias/blue/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/blue/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/blue/purple/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/blue/purple/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/red/blue/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/red/blue/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/red/blue/green/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/red/blue/green/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/red/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/red/en.md -------------------------------------------------------------------------------- /test/site/pages/autoalias/red/orange/en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leapcode/amber/af08447b47a1d104bf920fcb9caca5ad36adb6bc/test/site/pages/autoalias/red/orange/en.md -------------------------------------------------------------------------------- /test/site/pages/bbb/ccc/de.md: -------------------------------------------------------------------------------- 1 | de ccc -------------------------------------------------------------------------------- /test/site/pages/bbb/ccc/en.md: -------------------------------------------------------------------------------- 1 | en ccc -------------------------------------------------------------------------------- /test/site/pages/bbb/ddd.md: -------------------------------------------------------------------------------- 1 | ddd -------------------------------------------------------------------------------- /test/site/pages/bbb/en.md: -------------------------------------------------------------------------------- 1 | bbbbbbbb 2 | 3 | * bb 4 | * bb 5 | -------------------------------------------------------------------------------- /test/site/pages/de.md: -------------------------------------------------------------------------------- 1 | de root -------------------------------------------------------------------------------- /test/site/pages/en.md: -------------------------------------------------------------------------------- 1 | @toc = false 2 | 3 | en root -------------------------------------------------------------------------------- /test/site/pages/fff.de.md: -------------------------------------------------------------------------------- 1 | de fff -------------------------------------------------------------------------------- /test/site/pages/fff.en.md: -------------------------------------------------------------------------------- 1 | en fff -------------------------------------------------------------------------------- /test/site/pages/rtl.md: -------------------------------------------------------------------------------- 1 | @title = 'right to left' 2 | 3 | التمساح [[تسمية => aaa]] قارب 4 | 5 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') 2 | 3 | TESTING=true 4 | 5 | require 'rubygems' 6 | gem 'minitest' 7 | require 'minitest/autorun' 8 | require 'amber' 9 | 10 | class Minitest::Test 11 | 12 | def setup 13 | end 14 | 15 | def load_yaml_docs(file) 16 | filepath = File.dirname(__FILE__) + '/files/' + file 17 | data = {} 18 | YAML::load_stream(File.open(filepath)) do |doc| 19 | key = doc.delete("name") 20 | data[key] = doc 21 | end 22 | data 23 | end 24 | 25 | end 26 | -------------------------------------------------------------------------------- /test/unit/property_test.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('test_helper', File.dirname(__FILE__)) 2 | 3 | class PropertyTest < Minitest::Test 4 | 5 | class Page 6 | attr_accessor :parent 7 | attr_accessor :props 8 | def initialize 9 | self.props = Amber::StaticPage::PageProperties.new(self) 10 | end 11 | def prop(*args) 12 | props.prop(*args) 13 | end 14 | end 15 | 16 | def setup 17 | text_en = %( 18 | - @title = 'hi' 19 | - @author = 'you' 20 | - @created_at = 'Sun Aug 12 18:32:20 PDT 2012' 21 | - @color = 'periwinkle' 22 | - @false_value = false 23 | - @this.local_value = 'robot overlord' 24 | - @this.local_false = false 25 | - ignored = 1 26 | ) 27 | text_es = %( 28 | - @title = 'hola' 29 | - @author = 'tu' 30 | - @heading = textile 'h1. hi' 31 | ) 32 | @page_top = Page.new 33 | @pp = @page_top.props 34 | @page_bottom = Page.new 35 | @page_bottom.parent = @page_top 36 | 37 | @pp.eval(text_en, 'en') 38 | @pp.eval(text_es, 'es') 39 | 40 | I18n.locale = :en 41 | end 42 | 43 | def test_simple_properties 44 | assert_equal 'hi', @pp.title 45 | assert_equal 'you', @pp.author 46 | assert_equal false, @pp.false_value 47 | assert_nil @pp.ignored 48 | end 49 | 50 | def test_simple_locale 51 | assert_equal 'hi', @pp.prop(:en, :title) 52 | assert_equal 'hola', @pp.prop('es', 'title') 53 | assert_equal false, @pp.prop('es', 'false_value') 54 | assert_nil @pp.prop('es', 'ignored') 55 | 56 | I18n.locale = :en 57 | assert_equal 'hi', @pp.title 58 | I18n.locale = :es 59 | assert_equal 'hola', @pp.title 60 | end 61 | 62 | def test_fallback 63 | assert_equal 'periwinkle', @pp.prop(:es, :color) 64 | end 65 | 66 | def test_date 67 | assert_equal Time.parse('Sun Aug 12 18:32:20 PDT 2012'), @pp.prop(:es, 'created_at') 68 | end 69 | 70 | def test_textile 71 | assert_equal "

hi

", @pp.prop('es', :heading) 72 | end 73 | 74 | def test_local_property 75 | assert_equal 'robot overlord', @pp.local_value 76 | assert_equal 'robot overlord', @page_top.prop(:en, 'local_value') 77 | assert_equal false, @page_top.prop(:en, :local_false) 78 | assert_equal 'robot overlord', @page_top.prop(:es, :local_value) 79 | assert_nil @page_bottom.prop(:en, :local_value) 80 | assert_nil @page_bottom.prop(:es, :local_value) 81 | end 82 | 83 | def test_inheritance 84 | assert_equal 'periwinkle', @page_bottom.prop(:en, :color) 85 | end 86 | 87 | end 88 | -------------------------------------------------------------------------------- /test/unit/render_test.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('test_helper', File.dirname(__FILE__)) 2 | 3 | class RenderTest < Minitest::Test 4 | 5 | def setup 6 | end 7 | 8 | def test_bracket_links 9 | texts = { 10 | "[[page-name]]" => [nil, 'page-name'], 11 | " [[ page-name ]] " => [nil, 'page-name'], 12 | "[[ label => page-name ]]" => ['label', 'page-name'], 13 | " [[label->page-name]] " => ['label', 'page-name'], 14 | "x[[page-name]]y" => [nil, 'page-name'], 15 | "[[ how do I? => carefully ]]" => ['how do I?', 'carefully'] 16 | } 17 | texts.each do |markup, expected| 18 | Amber::Render::Filter::Bracketlink.run(markup) do |from, to| 19 | assert_equal expected, [from, to] 20 | end 21 | end 22 | end 23 | 24 | end 25 | -------------------------------------------------------------------------------- /test/unit/test_helper.rb: -------------------------------------------------------------------------------- 1 | require File.dirname(File.dirname(__FILE__)) + '/test_helper' -------------------------------------------------------------------------------- /test/unit/toc_test.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('test_helper', File.dirname(__FILE__)) 2 | 3 | class TocTest < Minitest::Test 4 | 5 | def setup 6 | @texts ||= load_yaml_docs 'toc.yml' 7 | end 8 | 9 | def test_texts 10 | @texts.each do |name, test| 11 | if test['enabled'] 12 | in_html = RedCloth.new(test['in']).to_html 13 | options = Hash[(test['options']||{}).map{|k,v| [k.to_sym,v]}] # convert keys to use symbols 14 | regex_toc = (Amber::Render::RegexTableOfContents.new(in_html, options) if test['backend'] != 'nokogiri') 15 | nokogiri_toc = (Amber::Render::NokogiriTableOfContents.new(in_html, options) if test['backend'] != 'regex') 16 | [regex_toc, nokogiri_toc].compact.each do |toc| 17 | if test['style'] == 'toc' 18 | html = toc.to_toc 19 | elsif test['style'] == 'both' 20 | html = toc.to_toc + "\n" + toc.to_html 21 | else 22 | html = toc.to_html 23 | end 24 | assert_equal test['out'], html, "toc test `#{name}` failed (using #{toc.class.name})" 25 | end 26 | end 27 | end 28 | end 29 | 30 | end 31 | --------------------------------------------------------------------------------