idioma 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +28 -0
- data/app/assets/javascripts/idioma/application.js +15 -0
- data/app/assets/javascripts/idioma/phrases.js.coffee +35 -0
- data/app/assets/stylesheets/idioma/application.css.scss +26 -0
- data/app/assets/stylesheets/idioma/forms.css.scss +19 -0
- data/app/assets/stylesheets/idioma/phrases.css +4 -0
- data/app/controllers/idioma/application_controller.rb +4 -0
- data/app/controllers/idioma/phrases_controller.rb +96 -0
- data/app/helpers/idioma/application_helper.rb +4 -0
- data/app/helpers/idioma/phrases_helper.rb +4 -0
- data/app/models/idioma/phrase.rb +115 -0
- data/app/models/idioma/phrase_exporter.rb +69 -0
- data/app/models/idioma/phrase_extractor.rb +49 -0
- data/app/models/idioma/phrase_importer.rb +50 -0
- data/app/models/idioma/redis_backend.rb +22 -0
- data/app/views/idioma/phrases/index.html.haml +45 -0
- data/app/views/layouts/idioma/application.html.haml +22 -0
- data/config/locales/idioma.en.yml +20 -0
- data/config/routes.rb +4 -0
- data/db/migrate/20140709015052_create_idioma_phrases.rb +14 -0
- data/lib/concerns/models/date_flag.rb +96 -0
- data/lib/idioma/engine.rb +27 -0
- data/lib/idioma/version.rb +3 -0
- data/lib/idioma.rb +23 -0
- data/lib/tasks/idioma_tasks.rake +15 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/spec/controllers/phrases_controller_spec.rb +91 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +28 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +83 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/i18n.rb +4 -0
- data/spec/dummy/config/initializers/idioma.rb +9 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20141115171836_create_idioma_phrases.idioma.rb +15 -0
- data/spec/dummy/db/schema.rb +30 -0
- data/spec/dummy/log/development.log +25637 -0
- data/spec/dummy/log/test.log +4291 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/0a79a4ff6e73052b217cd977d4b50fdc54118d68/_bootstrap-sprockets.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/0a79a4ff6e73052b217cd977d4b50fdc54118d68/_bootstrap.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_background-variant.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_border-radius.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_center-block.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_clearfix.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_gradients.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_grid-framework.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_hide-text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_nav-divider.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_nav-vertical-align.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_opacity.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_progress-bar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_reset-filter.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_resize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_responsive-visibility.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_size.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_tab-focus.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_table-row.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_text-emphasis.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_text-overflow.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/388135616c2e0e4a55abea5d6089cd23176cca81/_vendor-prefixes.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_background-variant.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_border-radius.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_center-block.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_clearfix.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_gradients.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_grid-framework.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_hide-text.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_image.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_nav-divider.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_nav-vertical-align.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_opacity.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_progress-bar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_reset-filter.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_resize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_responsive-visibility.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_size.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_tab-focus.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_table-row.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_text-emphasis.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_text-overflow.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/6d2c3dd352078ee620f88d0e68cd2a546af6caa9/_vendor-prefixes.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a3c1058d9af83b2a8b1bfae5d618b8a18753385f/_bootstrap-sprockets.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a3c1058d9af83b2a8b1bfae5d618b8a18753385f/_bootstrap.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_badges.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_breadcrumbs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_button-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_carousel.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_close.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_code.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_component-animations.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_dropdowns.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_glyphicons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_input-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_jumbotron.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_media.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_mixins.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_modals.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_navs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_normalize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_pager.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_popovers.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_print.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_progress-bars.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_responsive-embed.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_responsive-utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_scaffolding.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_tables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_thumbnails.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_tooltip.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_type.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_variables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/a7efb1bfb1ea736b4b985c80527151a3e8b6dbc6/_wells.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d940cd7e88bf0a9500208e10220e6b529d01020b/application.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d940cd7e88bf0a9500208e10220e6b529d01020b/forms.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_badges.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_breadcrumbs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_button-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_carousel.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_close.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_code.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_component-animations.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_dropdowns.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_glyphicons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_input-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_jumbotron.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_labels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_list-group.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_media.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_mixins.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_modals.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_navs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_normalize.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_pager.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_panels.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_popovers.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_print.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_progress-bars.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_responsive-embed.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_responsive-utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_scaffolding.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_tables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_thumbnails.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_tooltip.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_type.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_variables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/ea7b58bf4bbb3d8d5abf667eec7914942f653de6/_wells.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/02ecd6370f91c7b9aa00319b7b66ca57 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/034fda66e03e8dcfacf72397fb1616fb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0372d3378d1aec4dd7f546428d9d84df +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/071b598f6568db8d75333d67e6a54477 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0faf8e82aa4c81c82c3d5efd58fcaae2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1665127ceea38e019fda9859305342a7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/16b4a10fdb8214557970232c41d57362 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1750899b365166d7cfff321fe7fa7acd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/17e0784a695845bd1a32dd1346c280ea +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1ad97a1fb78577c298b407d3d2cc4226 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1c146cfb664a6770a3d20305f8baaee3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1d53471c5ad320073dda367e45390e1a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1f6b42e6726c8b498066fc910a16e643 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/25a65c717fc9c64ba1aba14d1c14ffee +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/291cfa25c65c3163a5815d67b5f62756 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2acbd5c6f7047cd0e95f86968fd19f46 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2e4f3bcd559a961bc58e2a0e84792662 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f31bab0beabd5a3f5c34b4e907a34fc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/306a635124154ffdea9b8e8ce8b61410 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/30e642c26825645592d13dd299e19a65 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3312b404b988f9a8763bd1c06b9952ef +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3487ff606d58ba5df51a1117dba8c84b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357d6ae318d42fc558676b425c1a9e78 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/361cc4bdb4a3f33a6ba7e9a7db1a5407 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3636dd32d14102a55225b245bd2a6489 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/36874c0716e0da5db2dde7cf47dec6ca +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/39ce7471b9ff1c273b4f1518b5aba8f0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3b25a99aa1b8d0f87755ebd53f3d7fc6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3bf04cff80d6513190387eea44e4589f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3c284cbc7d309735cbebcaddf4467d71 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3d067ab624734ad0663d1425c5b201c1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3fb41299c66c3e363e841ca3d76b11b7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4063ddd81171d5b6dc967ca64faeca75 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/40ca1415d6ca19cdf937bbc542925af9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/40e3a16192cb5bd3559b3abe6b31cefe +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/43f257974098a37cabc9a61314b816f5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/44657b24ddb307d1e7f85ad2ecca2e10 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/458ca3a8c2f4224a08e724716a2f17d4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4a368dccbd67682ba64048d4b24fd8a6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4a85c925086e64caf1d1b700d916bdbd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4ce8718297a50cd3d658b5952cd8c220 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/510c6fd27db7dfbaf0a0b0875e1a472c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/52601bfc1fdc6967ffc898526bb67c48 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/52f63d83d0a7b86318e8de59538598ce +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5369fbbcf397cc9d96948fe373705d13 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/56435206e505c649b556d17094d68fda +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5814911eaed8f6e6be8c46d6b9cb880f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/58f4e4ba656d78cf623d22cca4e118d9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5d2ca5f96ec23ecb6926eb3732d45e40 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/650130979c39b20be8a1c9af85b76638 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6a9bec079f93d94c0dbf4b7faa1441ad +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6c75734197a9efc5a8a3a6ca1064eb41 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f388bb30dc94599b503d0d9091f1d8a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f88ef16a3db4dfcde35acff34596af9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f894580ff1180ef27e44fb54bfec225 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f9d821dc32360a03e328a188908175f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7002ce8d64dafbc1a536eeeb902218c0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7005283a4d4bbbdee421e3479dc12cef +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7311218619b974306177cebe229dc84c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/744470be6e2c66f767dd3796ce78f559 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/75e87583a132b975027118095bf4818f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/764d58940328aaefb24a04bef44b3789 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/76736f185d75c28fcb1a476ae52cf30e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/772600c69b884a0036fb15de213d3232 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7a3ccc02bfad9d04783b020d3dcdb67f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7da54db8bdd56cd00dc338448b263424 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7f402d16975bdcfc442e9cef98821840 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7f992b68655a9d27c89d97eeeaae5cff +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/812a0d810b679dbb7f5d512beef887c8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/81cfdb55475e7b7a5a63ffe9c204673c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/81fce3ac36b10e033b9264e39a76d90a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/83dafa375dd3513360fd7b4553f44113 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/846430db48a99b44ec1b08022d0276ad +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8747b295bb7c63b1388aef97cfb67b3c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87bf4781cd1e8b52a4b8fc2c0e379531 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8960bbc70a2914b7ed8e6f7b5b04359f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8abcaf5a11cddb7b0c2aa424bd1e3b80 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/90edf8db23ea1dbf263e6391e93a483d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/92871f270f3bebaf37c07d62016a3d7e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/933dfcd36b972a52fa603f5234bd1e7e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/960b52015983bd58ede5592a759c08fb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/96eb906f063e4ce8718416772a28ddda +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/97c07e644cabf01abcec894d4e69d985 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9d2af4036fcf352fd6695966ba8e0006 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a011ecbdccaea9b25d06cedffa60f15b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a200c1f26bc11623541b221d0b819a31 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a3900259c72f7f6917024284b8bdc4fb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a45d05646c5fc237f0a7419ba456eaaa +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a4819b17d0802ac0d8d7e2a9d1832752 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a57c75e1396ec82ae78589a9ae6b3861 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a5d6adcfd6cbc7beef744d02302d0a8c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a6e5e94828ebb7680a0a1499dda39e2c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ada1d0f8bc5368b25d6fbaa8a95b4ef8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ada35950e2733da1d227585deb4a09fd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/aefe71c7ac3edd29fbbb6a3e4bfe84a4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b0376faf689d528b625a5a88ef0dcc7a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b7e39ee40edb822dde438cae9f5b0987 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b8c774f83a302c891103bdf82662bc8d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bb86516784ddda57801c5b5ca185e838 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/be81012acaf20ecb9f67c32dbc2ee5ae +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bfa847822a8d7778ab5f8b469491b114 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c7e523ec10215d71cb5d98fe9e069b35 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c82292a064ec438357e22805eee89191 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c843a7a53cf4a5dc94dfea6a59f04e4f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d05de76ba0f58b49a47dea63d2a5b4a6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d5022437eeb42f08dd710ee8f240de2a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d71a839bca3a6881f8b7b42b7f05bda6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d976a7c91926f70a3e80c2603de3bf69 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/dd677fcb17536b3f6c2bf936f571a02e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/df9a7d2c532e121a104d5b63b4441b2d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e29bdfdcad985cd8d26e1d31a09f00b1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e46bf23d379db0e7483b2ccc0fbff9f3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e5fa939c3fa26ae0df54d40f316bec75 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e6f47dfc8b9542ee9c6f54b1ecfde664 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e75d8f8a9ec139a10086a83dca74e9b3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/eb29baddef1d85815159f3d1089e3be4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/efa76e374b3ab82bde4b35f9d76d9caf +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f1262794e42011b8c57f36f71b9815a0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f5268ce26d4948c182f520c4df83b261 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f6f7145113c3cd4e160e3d39f7f1f56b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f757aee56e52254e2fb14b4f6424c937 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fbf4527e3604500e4c3521c4fd2deaf6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ff4769a8564990f599f4e977ccd8e661 +0 -0
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/spec/dummy/tmp/restart.txt +0 -0
- data/spec/factories/phrase.rb +8 -0
- data/spec/models/phrase_exporter_spec.rb +38 -0
- data/spec/models/phrase_extractor_spec.rb +53 -0
- data/spec/models/phrase_importer_spec.rb +30 -0
- data/spec/models/phrase_spec.rb +80 -0
- data/spec/spec_helper.rb +23 -0
- metadata +851 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
%h1
|
2
|
+
= t('idioma.phrases')
|
3
|
+
.pull-right
|
4
|
+
= link_to phrases_url(q: params[:q], format: :csv), class: "btn btn-default" do
|
5
|
+
%span.glyphicon.glyphicon-download
|
6
|
+
= t('idioma.csv')
|
7
|
+
= link_to phrases_url(q: params[:q], format: :yaml), class: "btn btn-default" do
|
8
|
+
%span.glyphicon.glyphicon-download
|
9
|
+
= t('idioma.yaml')
|
10
|
+
|
11
|
+
.highlight
|
12
|
+
= form_tag(phrases_path, method: :get, class: "form-inline search") do
|
13
|
+
= select_tag :locale, options_for_select(Idioma.configuration.locales, selected: params[:locale]), class: "form-control"
|
14
|
+
= text_field_tag :q, params[:q], placeholder: t('idioma.key_value'), class: "form-control"
|
15
|
+
= submit_tag t('idioma.search'), class: "btn btn-default"
|
16
|
+
|
17
|
+
%table.table
|
18
|
+
%thead
|
19
|
+
%tr
|
20
|
+
%th= t('idioma.locale')
|
21
|
+
%th= t('idioma.key')
|
22
|
+
%th= t('idioma.value')
|
23
|
+
%th
|
24
|
+
- @phrases.each do |phrase|
|
25
|
+
%tr
|
26
|
+
%td= phrase.locale
|
27
|
+
%td= phrase.i18n_key
|
28
|
+
%td
|
29
|
+
- if phrase.locale.to_sym != Idioma.configuration.default_locale
|
30
|
+
- from_default = t(phrase.i18n_key.to_sym, locale: Idioma.configuration.default_locale, default: "")
|
31
|
+
- if from_default.present?
|
32
|
+
%small= from_default
|
33
|
+
%br/
|
34
|
+
.form-group
|
35
|
+
%input.i18n_value.form-control.col-sm-12{id: "PhraseI18nValue#{phrase.id}", value: phrase.i18n_value, data: {url: phrase_url(phrase)}}
|
36
|
+
%td
|
37
|
+
- if phrase.untranslated?
|
38
|
+
%span.label.label-warning= t('idioma.untranslated')
|
39
|
+
|
40
|
+
= will_paginate @posts
|
41
|
+
|
42
|
+
:javascript
|
43
|
+
$(function() {
|
44
|
+
new InlinePhraseUpdater();
|
45
|
+
});
|
@@ -0,0 +1,22 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Idioma
|
5
|
+
= stylesheet_link_tag "idioma/application", media: "all"
|
6
|
+
= javascript_include_tag "idioma/application"
|
7
|
+
%meta{name: "viewport", content: "width=device-width, initial-scale=1"}/
|
8
|
+
= csrf_meta_tags
|
9
|
+
%body
|
10
|
+
.navbar.navbar-default.navbar-fixed-top{role: "navigation"}
|
11
|
+
.container
|
12
|
+
%a.navbar-brand{href: "#"} Idioma
|
13
|
+
%ul.nav.navbar-nav
|
14
|
+
%li= link_to t('idioma.phrases'), phrases_url
|
15
|
+
|
16
|
+
- flash_lookups = {notice: "info", success: "success", error: "danger"}
|
17
|
+
- flash.each do |type, value|
|
18
|
+
- flash_class = flash_lookups[type.to_sym] || "info"
|
19
|
+
.alert{class: "alert-#{flash_class}"}= value
|
20
|
+
|
21
|
+
.container
|
22
|
+
= yield
|
@@ -0,0 +1,20 @@
|
|
1
|
+
en:
|
2
|
+
idioma:
|
3
|
+
record_not_found: "Record not found"
|
4
|
+
record_updated: "Record has been updated"
|
5
|
+
edit: "Edit"
|
6
|
+
search: "Search"
|
7
|
+
locale: "Locale"
|
8
|
+
key: "Key"
|
9
|
+
value: "Value"
|
10
|
+
key_value: "Key / Value"
|
11
|
+
phrases: "Phrases"
|
12
|
+
untranslated: "Untranslated"
|
13
|
+
notes: "Notes"
|
14
|
+
save: "Save"
|
15
|
+
editing_phrase: "Editing Phrase"
|
16
|
+
csv: "CSV"
|
17
|
+
yaml: "YAML"
|
18
|
+
ans_yes: "Yes"
|
19
|
+
ans_no: "No"
|
20
|
+
translated: "Translated"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateIdiomaPhrases < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :idioma_phrases do |t|
|
4
|
+
t.string :locale
|
5
|
+
t.string :i18n_key
|
6
|
+
t.text :i18n_value
|
7
|
+
t.datetime :translated_at
|
8
|
+
t.datetime :flagged_at
|
9
|
+
t.text :notes
|
10
|
+
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Cloned from: https://github.com/theworkinggroup/date_flag
|
2
|
+
module Idioma::Concerns::Models::DateFlag
|
3
|
+
#VERSION = '0.1.0'
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
# Usage:
|
8
|
+
#
|
9
|
+
# class MyModel < ActiveRecord::Base
|
10
|
+
# date_flag :flagged_at, :action => :flag
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# m = MyModel.new
|
14
|
+
# m.flagged? # => false
|
15
|
+
# m.flag! # Assigns flag_at to current time
|
16
|
+
# m.flag = true # Same as flag!
|
17
|
+
# m.flagged? # => true
|
18
|
+
module ClassMethods
|
19
|
+
def date_flag(field, options = { })
|
20
|
+
action = (options[:action] ? options[:action] : field.to_s.sub(/_at$/, '')).to_sym
|
21
|
+
query = (options[:query] and options[:query].to_sym or action)
|
22
|
+
|
23
|
+
scope_name =
|
24
|
+
case (options[:scope])
|
25
|
+
when nil
|
26
|
+
action
|
27
|
+
when false
|
28
|
+
false
|
29
|
+
else
|
30
|
+
options[:scope].to_s.to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
case (scope_name)
|
34
|
+
when false, nil
|
35
|
+
# Skip this operation
|
36
|
+
when :send, :id
|
37
|
+
# TODO: Invalid names, should raise exception or warning
|
38
|
+
else
|
39
|
+
scope scope_name, lambda { |*flag|
|
40
|
+
case (flag.first)
|
41
|
+
when false
|
42
|
+
where("#{table_name}.#{field} IS NULL")
|
43
|
+
when true, nil
|
44
|
+
where("#{table_name}.#{field} IS NOT NULL")
|
45
|
+
else
|
46
|
+
where("#{table_name}.#{field} <=?", flag.first)
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method(:"#{action}=") do |value|
|
52
|
+
# The action= mutator method is used to manipulate the trigger time.
|
53
|
+
# Values of nil, false, empty string, '0' or 0 are presumed to be
|
54
|
+
# false and will nil out the time. A DateTime, Date or Time object
|
55
|
+
# will be saved as-is, and anything else will just assign the current
|
56
|
+
# time.
|
57
|
+
|
58
|
+
case (value)
|
59
|
+
when nil, false, '', '0', 0
|
60
|
+
write_attribute(field, nil)
|
61
|
+
when DateTime, Date, Time
|
62
|
+
write_attribute(field, value)
|
63
|
+
else
|
64
|
+
!read_attribute(field) and write_attribute(field, Time.zone.now.utc)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
define_method(:"is_#{action}?") do
|
69
|
+
# The action? accessor method will return true if the date is defined
|
70
|
+
# and is prior to the current time, or false otherwise.
|
71
|
+
|
72
|
+
value = read_attribute(field)
|
73
|
+
|
74
|
+
# value ? (value <= Time.zone.now.utc) : false
|
75
|
+
value.present?
|
76
|
+
end
|
77
|
+
alias_method action, :"is_#{action}?"
|
78
|
+
|
79
|
+
define_method(:"#{action}!") do |*at_time|
|
80
|
+
# The action! method is used to set the trigger time. If the time is
|
81
|
+
# already defined and is in the past, then the time is left unchanged.
|
82
|
+
# If it is undefined or in the future, then the current time is
|
83
|
+
# substituted.
|
84
|
+
|
85
|
+
value = read_attribute(field)
|
86
|
+
|
87
|
+
at_time = at_time.first || Time.zone.now.utc
|
88
|
+
|
89
|
+
unless (value and (value <= at_time))
|
90
|
+
write_attribute(field, at_time)
|
91
|
+
save!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pg'
|
2
|
+
require 'haml'
|
3
|
+
require 'will_paginate'
|
4
|
+
require 'bootstrap-sass'
|
5
|
+
require 'jquery-rails'
|
6
|
+
require 'coffee-rails'
|
7
|
+
|
8
|
+
module Idioma
|
9
|
+
class Engine < ::Rails::Engine
|
10
|
+
isolate_namespace Idioma
|
11
|
+
|
12
|
+
initializer :append_migrations do |app|
|
13
|
+
unless app.root.to_s.match root.to_s
|
14
|
+
config.paths["db/migrate"].expanded.each do |expanded_path|
|
15
|
+
app.config.paths["db/migrate"] << expanded_path
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
config.generators do |g|
|
21
|
+
g.test_framework :rspec, :fixture => false
|
22
|
+
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
23
|
+
g.assets false
|
24
|
+
g.helper false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/idioma.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "idioma/engine"
|
2
|
+
|
3
|
+
module Idioma
|
4
|
+
|
5
|
+
class Configuration
|
6
|
+
attr_accessor :default_locale, :locales, :ignore_keys, :redis_backend
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
self.default_locale = :en
|
10
|
+
self.locales = [self.default_locale]
|
11
|
+
self.ignore_keys = ["ransack", "simple_form"]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.configuration
|
16
|
+
@configuration ||= Configuration.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.configure
|
20
|
+
yield(configuration) if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :idioma do
|
2
|
+
desc "Import from extraction"
|
3
|
+
task :import_from_extraction => :environment do
|
4
|
+
Idioma::PhraseImporter.import_from_extraction
|
5
|
+
end
|
6
|
+
|
7
|
+
# rake idioma:duplicate_for_locales base_locale=en new_locale=es
|
8
|
+
desc "Duplicate for locales"
|
9
|
+
task :duplicate_for_locales => :environment do
|
10
|
+
if ENV["base_locale"].nil? || ENV["new_locale"].nil?
|
11
|
+
raise new Exception("Please provide base_locale and new_locale ENV variables")
|
12
|
+
end
|
13
|
+
Idioma::Phrase.duplicate_for_locales(ENV["base_locale"], ENV["new_locale"])
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
|
2
|
+
<%%= f.error_notification %>
|
3
|
+
|
4
|
+
<div class="form-inputs">
|
5
|
+
<%- attributes.each do |attribute| -%>
|
6
|
+
<%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
|
7
|
+
<%- end -%>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="form-actions">
|
11
|
+
<%%= f.button :submit %>
|
12
|
+
</div>
|
13
|
+
<%% end %>
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Idioma::PhrasesController do
|
4
|
+
|
5
|
+
routes { Idioma::Engine.routes }
|
6
|
+
|
7
|
+
describe "GET #index" do
|
8
|
+
|
9
|
+
context "html" do
|
10
|
+
it "returns results" do
|
11
|
+
phrase = create(:phrase)
|
12
|
+
get :index
|
13
|
+
expect(assigns(:phrases)).to include(phrase)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "no results" do
|
17
|
+
get :index
|
18
|
+
expect(assigns(:phrases).empty?).to eq(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "filters results" do
|
22
|
+
phrase = create(:phrase)
|
23
|
+
get :index, q: phrase.i18n_key
|
24
|
+
expect(assigns(:phrases)).to include(phrase)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "filters no results" do
|
28
|
+
phrase = create(:phrase)
|
29
|
+
get :index, q: "nope"
|
30
|
+
expect(assigns(:phrases).empty?).to eq(true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "json" do
|
35
|
+
it "returns results" do
|
36
|
+
phrase = create(:phrase)
|
37
|
+
get :index, format: :json
|
38
|
+
body_hash = JSON.parse(response.body)
|
39
|
+
expect(body_hash["phrases"].first).to eq(JSON.parse(phrase.to_json))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "includes metadata" do
|
43
|
+
phrase = create(:phrase)
|
44
|
+
get :index, format: :json
|
45
|
+
body_hash = JSON.parse(response.body)
|
46
|
+
expect(body_hash["meta"]["pagination"]).to eq({
|
47
|
+
"current_page" => 1,
|
48
|
+
"per_page" => 30,
|
49
|
+
"total_entries" => 1
|
50
|
+
})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "POST #update" do
|
57
|
+
context "json" do
|
58
|
+
it "saves and renders phrase as json" do
|
59
|
+
phrase = create(:phrase)
|
60
|
+
post :update, id: phrase, phrase: {i18n_value: "New value"}, format: :json
|
61
|
+
phrase.reload
|
62
|
+
expect(response.status).to eq(200)
|
63
|
+
expect(response.body).to eq(phrase.to_json)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "has validation errors and returns them" do
|
67
|
+
phrase = create(:phrase)
|
68
|
+
post :update, id: phrase, phrase: {locale: nil}, format: :json
|
69
|
+
expect(response.status).to eq(400)
|
70
|
+
body_hash = JSON.parse(response.body)
|
71
|
+
expect(body_hash["errors"]).to eq({"locale" => ["can't be blank"]})
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "GET #show" do
|
77
|
+
let (:phrase) { create(:phrase) }
|
78
|
+
|
79
|
+
it "when not found" do
|
80
|
+
get :show, id: 999, format: :json
|
81
|
+
expect(response.status).to eq(404)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "when found" do
|
85
|
+
get :show, id: phrase, format: :json
|
86
|
+
expect(assigns(:phrase)).to eq(phrase)
|
87
|
+
expect(response.body).to eq(phrase.to_json)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
6
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
data/spec/dummy/bin/rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
Bundler.require(*Rails.groups)
|
6
|
+
require "idioma"
|
7
|
+
|
8
|
+
module Dummy
|
9
|
+
class Application < Rails::Application
|
10
|
+
# Settings in config/environments/* take precedence over those specified here.
|
11
|
+
# Application configuration should go into files in config/initializers
|
12
|
+
# -- all .rb files in that directory are automatically loaded.
|
13
|
+
|
14
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
15
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
16
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
17
|
+
|
18
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
19
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
20
|
+
config.i18n.load_path += Dir["#{Rails.root}/config/locales/**/*.{rb,yml}"]
|
21
|
+
config.i18n.default_locale = :en
|
22
|
+
config.i18n.enforce_available_locales = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# SQLite version 3.x
|
2
|
+
# gem install sqlite3
|
3
|
+
#
|
4
|
+
# Ensure the SQLite 3 gem is defined in your Gemfile
|
5
|
+
# gem 'sqlite3'
|
6
|
+
#
|
7
|
+
default: &default
|
8
|
+
adapter: postgresql
|
9
|
+
pool: 5
|
10
|
+
timeout: 5000
|
11
|
+
encoding: unicode
|
12
|
+
|
13
|
+
development:
|
14
|
+
<<: *default
|
15
|
+
encoding: unicode
|
16
|
+
database: idioma
|
17
|
+
username: lhalliday
|
18
|
+
password:
|
19
|
+
|
20
|
+
# Warning: The database defined as "test" will be erased and
|
21
|
+
# re-generated from your development database when you run "rake".
|
22
|
+
# Do not set this db to the same as development or production.
|
23
|
+
test:
|
24
|
+
<<: *default
|
25
|
+
encoding: unicode
|
26
|
+
database: idioma_test
|
27
|
+
username: lhalliday
|
28
|
+
password:
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Rails.application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
+
|
4
|
+
# In the development environment your application's code is reloaded on
|
5
|
+
# every request. This slows down response time but is perfect for development
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
7
|
+
config.cache_classes = false
|
8
|
+
|
9
|
+
# Do not eager load code on boot.
|
10
|
+
config.eager_load = false
|
11
|
+
|
12
|
+
# Show full error reports and disable caching.
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
config.action_controller.perform_caching = false
|
15
|
+
|
16
|
+
# Don't care if the mailer can't send.
|
17
|
+
config.action_mailer.raise_delivery_errors = false
|
18
|
+
|
19
|
+
# Print deprecation notices to the Rails logger.
|
20
|
+
config.active_support.deprecation = :log
|
21
|
+
|
22
|
+
# Raise an error on page load if there are pending migrations.
|
23
|
+
config.active_record.migration_error = :page_load
|
24
|
+
|
25
|
+
# Debug mode disables concatenation and preprocessing of assets.
|
26
|
+
# This option may cause significant delays in view rendering with a large
|
27
|
+
# number of complex assets.
|
28
|
+
config.assets.debug = true
|
29
|
+
|
30
|
+
# Adds additional error checking when serving assets at runtime.
|
31
|
+
# Checks for improperly declared sprockets dependencies.
|
32
|
+
# Raises helpful error messages.
|
33
|
+
config.assets.raise_runtime_errors = true
|
34
|
+
|
35
|
+
# Raises error for missing translations
|
36
|
+
# config.action_view.raise_on_missing_translations = true
|
37
|
+
end
|