Exclude:
- 'app/controllers/api/amf_controller.rb'
- 'app/controllers/users_controller.rb'
+ - 'app/controllers/site_controller.rb'
# Offense count: 701
Metrics/AbcSize:
source "https://rubygems.org"
# Require rails
-gem "rails", "6.0.1"
+gem "rails", "6.0.2"
# Require things which have moved to gems in ruby 1.9
gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
gem "image_optim_rails"
# Load rails plugins
+gem "actionpack-page_caching", ">= 1.2.0"
gem "active_record_union"
gem "activerecord-import"
gem "bootstrap", "~> 4.3.1"
gem "http_accept_language", "~> 2.0.0"
gem "i18n-js", ">= 3.0.0"
gem "oauth-plugin", ">= 0.5.1"
-gem "openstreetmap-actionpack-page_caching", ">= 1.1.2", :require => "actionpack/page_caching"
gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
gem "rack-cors"
gem "rails-i18n", "~> 4.0.0"
SystemTimer (1.2.3)
aasm (5.0.6)
concurrent-ruby (~> 1.0)
- actioncable (6.0.1)
- actionpack (= 6.0.1)
+ actioncable (6.0.2)
+ actionpack (= 6.0.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.0.1)
- actionpack (= 6.0.1)
- activejob (= 6.0.1)
- activerecord (= 6.0.1)
- activestorage (= 6.0.1)
- activesupport (= 6.0.1)
+ actionmailbox (6.0.2)
+ actionpack (= 6.0.2)
+ activejob (= 6.0.2)
+ activerecord (= 6.0.2)
+ activestorage (= 6.0.2)
+ activesupport (= 6.0.2)
mail (>= 2.7.1)
- actionmailer (6.0.1)
- actionpack (= 6.0.1)
- actionview (= 6.0.1)
- activejob (= 6.0.1)
+ actionmailer (6.0.2)
+ actionpack (= 6.0.2)
+ actionview (= 6.0.2)
+ activejob (= 6.0.2)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (6.0.1)
- actionview (= 6.0.1)
- activesupport (= 6.0.1)
+ actionpack (6.0.2)
+ actionview (= 6.0.2)
+ activesupport (= 6.0.2)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.0.1)
- actionpack (= 6.0.1)
- activerecord (= 6.0.1)
- activestorage (= 6.0.1)
- activesupport (= 6.0.1)
+ actionpack-page_caching (1.2.0)
+ actionpack (>= 5.0.0)
+ actiontext (6.0.2)
+ actionpack (= 6.0.2)
+ activerecord (= 6.0.2)
+ activestorage (= 6.0.2)
+ activesupport (= 6.0.2)
nokogiri (>= 1.8.5)
- actionview (6.0.1)
- activesupport (= 6.0.1)
+ actionview (6.0.2)
+ activesupport (= 6.0.2)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_record_union (1.3.0)
activerecord (>= 4.0)
- activejob (6.0.1)
- activesupport (= 6.0.1)
+ activejob (6.0.2)
+ activesupport (= 6.0.2)
globalid (>= 0.3.6)
- activemodel (6.0.1)
- activesupport (= 6.0.1)
- activerecord (6.0.1)
- activemodel (= 6.0.1)
- activesupport (= 6.0.1)
+ activemodel (6.0.2)
+ activesupport (= 6.0.2)
+ activerecord (6.0.2)
+ activemodel (= 6.0.2)
+ activesupport (= 6.0.2)
activerecord-import (1.0.3)
activerecord (>= 3.2)
- activestorage (6.0.1)
- actionpack (= 6.0.1)
- activejob (= 6.0.1)
- activerecord (= 6.0.1)
+ activestorage (6.0.2)
+ actionpack (= 6.0.2)
+ activejob (= 6.0.2)
+ activerecord (= 6.0.2)
marcel (~> 0.3.1)
- activesupport (6.0.1)
+ activesupport (6.0.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
autoprefixer-rails (9.7.3)
execjs
aws-eventstream (1.0.3)
- aws-partitions (1.251.0)
- aws-sdk-core (3.84.0)
+ aws-partitions (1.254.0)
+ aws-sdk-core (3.85.1)
aws-eventstream (~> 1.0, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
- aws-sdk-kms (1.26.0)
+ aws-sdk-kms (1.27.0)
aws-sdk-core (~> 3, >= 3.71.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.59.0)
popper_js (>= 1.14.3, < 2)
sassc-rails (>= 2.0.0)
browser (2.7.1)
- builder (3.2.3)
+ builder (3.2.4)
bzip2-ffi (1.0.0)
ffi (~> 1.0)
cancancan (3.0.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
- json (2.2.0)
+ json (2.3.0)
jwt (2.2.1)
kgio (2.11.2)
kramdown (2.1.0)
omniauth-windowslive (0.0.12)
multi_json (~> 1.12)
omniauth-oauth2 (~> 1.4)
- openstreetmap-actionpack-page_caching (1.1.2)
- actionpack (>= 5.0.0)
openstreetmap-deadlock_retry (1.3.0)
parallel (1.19.1)
parser (2.6.5.0)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rack-uri_sanitizer (0.0.2)
- rails (6.0.1)
- actioncable (= 6.0.1)
- actionmailbox (= 6.0.1)
- actionmailer (= 6.0.1)
- actionpack (= 6.0.1)
- actiontext (= 6.0.1)
- actionview (= 6.0.1)
- activejob (= 6.0.1)
- activemodel (= 6.0.1)
- activerecord (= 6.0.1)
- activestorage (= 6.0.1)
- activesupport (= 6.0.1)
+ rails (6.0.2)
+ actioncable (= 6.0.2)
+ actionmailbox (= 6.0.2)
+ actionmailer (= 6.0.2)
+ actionpack (= 6.0.2)
+ actiontext (= 6.0.2)
+ actionview (= 6.0.2)
+ activejob (= 6.0.2)
+ activemodel (= 6.0.2)
+ activerecord (= 6.0.2)
+ activestorage (= 6.0.2)
+ activesupport (= 6.0.2)
bundler (>= 1.3.0)
- railties (= 6.0.1)
+ railties (= 6.0.2)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.4)
actionpack (>= 5.0.1.x)
rails-i18n (4.0.2)
i18n (~> 0.6)
rails (>= 4.0)
- railties (6.0.1)
- actionpack (= 6.0.1)
- activesupport (= 6.0.1)
+ railties (6.0.2)
+ actionpack (= 6.0.2)
+ activesupport (= 6.0.2)
method_source
rake (>= 0.8.7)
thor (>= 0.20.3, < 2.0)
DEPENDENCIES
SystemTimer (>= 1.1.3)
aasm
+ actionpack-page_caching (>= 1.2.0)
active_record_union
activerecord-import
annotate
omniauth-mediawiki (>= 0.0.4)
omniauth-openid
omniauth-windowslive
- openstreetmap-actionpack-page_caching (>= 1.1.2)
openstreetmap-deadlock_retry (>= 1.3.0)
pg
poltergeist
r2 (~> 0.2.7)
rack-cors
rack-uri_sanitizer
- rails (= 6.0.1)
+ rails (= 6.0.2)
rails-controller-testing
rails-i18n (~> 4.0.0)
rinku (>= 2.0.6)
hr {
border: none;
- background-color: #ccc;
- color: #ccc;
+ background-color: $grey;
+ color: $grey;
height: 1px;
}
/* Utility for de-emphasizing content */
.deemphasize {
- color: #999;
+ color: $darkgrey;
a {
color: $blue;
}
}
.disabled a {
- color: #ccc;
+ color: $grey;
cursor: default;
.caret {
- border-top-color: #ccc;
+ border-top-color: $grey;
}
}
}
&.active {
- background-color: #9ed485;
+ background-color: $vibrant-green;
}
.icon {
overflow: auto;
.section {
- border-bottom: 1px solid #DDD;
+ border-bottom: 1px solid $grey;
padding: 10px 20px;
}
font-size:20px;
line-height:10px;
color:#222;
- border:1px solid #ddd;
+ border:1px solid $grey;
}
.tooltip {
opacity: 1;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
.tooltip-arrow {
- border-top-color: #ccc;
+ border-top-color: $grey;
}
}
}
font-size: 13px;
margin-bottom: 8px;
}
- li.disabled { color: #999; }
+ li.disabled { color: $darkgrey; }
}
}
position: relative;
padding: $lineheight/2 $lineheight;
// background: $offwhite;
- // border-bottom: 1px solid #ccc;
+ // border-bottom: 1px solid $grey;
> .close {
float: right;
margin-top: 2px;
input:focus {
outline: none;
- box-shadow: 0px 0px 7px #9ED485;
+ box-shadow: 0px 0px 7px $vibrant-green;
}
input[type=submit].float {
td.instruction, td.distance {
padding-top: $lineheight/5;
padding-bottom: $lineheight/5;
- border-bottom: 1px solid #DDD;
+ border-bottom: 1px solid $grey;
}
td.distance {
- color: #BBB;
+ color: $darkgrey;
text-align: right;
font-size: x-small;
}
#sidebar .changesets {
li {
padding: 15px 20px;
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid $grey;
cursor: pointer;
&.selected { background: $list-highlight; }
.comments {
float: right;
- color: #999;
+ color: $darkgrey;
}
.comments-0 {
#sidebar_content {
.browse-section {
padding: $lineheight/2 $lineheight;
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid $grey;
h4:first-child {
margin-top: 0;
.paginate {
float: right;
padding: 1px 6px;
- border: 1px solid #eee;
+ border: 1px solid $lightgrey;
border-radius: 3px;
}
h4 {
padding: 5px 0 5px 10px;
font-size: 12px;
- border: 1px solid #CCC;
+ border: 1px solid $grey;
border-radius: 4px 4px 0 0;
background-color: #F6F6F6;
}
padding: 7px 10px;
font-size: 12px;
background-color: #FFF;
- border: 1px solid #CCC;
+ border: 1px solid $grey;
border-top: 0;
border-radius: 0 0 4px 4px;
}
.browse-tag-list {
background-color: #F6F6F6;
- border: 1px solid #ddd;
+ border: 1px solid $grey;
border-radius: 3px;
font-size: 12px;
table-layout: fixed;
border-collapse: separate;
th, td {
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid $grey;
}
tr:last-child th, tr:last-child td {
}
.browse-tag-v {
- border-left: 1px solid #ddd;
+ border-left: 1px solid $grey;
background-color: #fff;
}
ul {
li {
padding: 15px 20px;
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid $grey;
&.query-result {
cursor: pointer;
}
.export_boxy {
- background: #eee;
- border: 1px solid #ccc;
+ background: $lightgrey;
+ border: 1px solid $grey;
border-radius: 3px;
#maxlat { margin-top: -1px; }
position: relative;
width: 45%;
height: 400px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
margin-bottom: $lineheight;
float: right;
}
.activity-block {
clear: left;
- border-bottom: 1px solid #ccc;
+ border-bottom: 1px solid $grey;
padding-bottom: $lineheight;
float: left;
h3 {
position: relative;
padding-top: $lineheight;
padding-bottom: $lineheight/2;
- border-top: 1px solid #ccc;
+ border-top: 1px solid $grey;
&:first-of-type {
margin-top: $lineheight/2;
position: relative;
width: 90%;
height: 400px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
display: none;
margin-bottom: $lineheight;
}
#newcomment {
- border-top: 1px solid #ccc;
+ border-top: 1px solid $grey;
padding-top: $lineheight;
margin-top: $lineheight/2;
}
max-width: 740px;
}
.diary-comment {
- border-top: 1px dashed #ccc;
+ border-top: 1px dashed $grey;
padding-top: $lineheight/2;
padding-bottom: $lineheight/2;
&:first-child {
margin-top: $lineheight/2;
padding-top: $lineheight;
- border-top: 1px solid #ccc;
+ border-top: 1px solid $grey;
}
&.deemphasize {
background-color: #fee;
.users-terms {
.legale {
- border: 1px solid #ccc;
+ border: 1px solid $grey;
padding: $lineheight;
margin-bottom: $lineheight;
overflow: auto;
position: relative;
width: 500px;
height: 400px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
}
#accountForm .user_image {
.messages {
width: 100%;
- border: 1px solid #ddd;
+ border: 1px solid $grey;
input[type="submit"] {
margin: auto;
}
tbody tr {
- border-top: 1px solid #ccc;
+ border-top: 1px solid $grey;
}
.inbox-row {
- background: #f8f8ff;
+ background: $offwhite;
}
.inbox-row-unread {
.info-line {
margin-bottom: $lineheight;
padding: $lineheight/4 0px 4px 0px;
- border-bottom: 1px solid #ccc;
+ border-bottom: 1px solid $grey;
form, form div {
display: inline;
textarea {
color: #222;
background-color: #fff;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
padding: 2px 5px;
margin: 0;
width: 200px;
img.user_image {
max-width: 100px;
max-height: 100px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
margin-bottom: $lineheight;
float: left;
margin-right: $lineheight;
img.user_thumbnail {
max-width: 50px;
max-height: 50px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
margin-right: $lineheight;
}
height: auto;
max-width: 25px;
max-height: 25px;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
}
/* Rules for geo microformats */
display: block;
float: left;
list-style: none;
- border-left: 1px solid #ccc;
+ border-left: 1px solid $grey;
padding-left: $lineheight/2;
margin-right: $lineheight/2;
&:first-child {
.prose {
h1, h2 {
padding-bottom: $lineheight/2;
- border-bottom: 1px dashed #cccccc;
+ border-bottom: 1px dashed $grey;
margin-bottom: $lineheight/2;
}
code {
font-size: 13px;
- background: #e8e8e8;
+ background: $lightgrey;
padding: 2px 3px;
}
pre {
font-size: 13px;
- background: #e8e8e8;
+ background: $lightgrey;
padding: 2px 3px;
white-space: pre-wrap;
border-left: $lineheight solid $offwhite;
padding-left: $lineheight;
margin: 0;
- color: #7E7E7E;
+ color: $darkgrey;
}
ul, ol {
display: inline-block;
vertical-align: top;
margin-left: 15px;
- background-color: #f8f8ff;
+ background-color: $offwhite;
padding: $lineheight/2;
width: 220px;
}
h4.heading, li {
- border-bottom: 1px solid #ccc;
+ border-bottom: 1px solid $grey;
margin-bottom: $lineheight/4;
padding-bottom: $lineheight/4;
}
.note_list {
tr.creator {
- background-color: #eeeeee;
+ background-color: $lightgrey;
}
td {
margin: 0;
list-style: none;
background-color: #ffffff;
- border: 1px solid #ccc;
+ border: 1px solid $grey;
border-radius: 0 3px 3px;
*border-right-width: 2px;
*border-bottom-width: 2px;
margin: 9px 1px;
*margin: -5px 0 5px;
overflow: hidden;
- background-color: #e5e5e5;
+ background-color: $lightgrey;
border-bottom: 1px solid #ffffff;
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
- color: #999999;
+ color: $darkgrey;
}
.dropdown-menu > .disabled > a:hover,
}
.site-about #content {
- //background-color: #000;
- background-color: #eee;
+ background-color: $lightgrey;
background-position: 50% 50%;
background-repeat: no-repeat;
background-size: cover;
right: 20px;
bottom: 60px;
text-shadow: #000 0px 1px 5px;
- color: #eee;
+ color: $lightgrey;
opacity: 0.8;
display: none;
}
font-weight: 300;
font-size: 34px;
span {
- color: #76c551;
+ color: $vibrant-green;
}
}
background-repeat: no-repeat;
background-image: image-url('about/osm.png');
background-size: cover;
- background-color: #76c551;
+ background-color: $vibrant-green;
}
.byosm {
font: 500 20px/24px Helvetica, Arial, sans-serif;
white-space: nowrap;
color: #fff;
- background: #76c551;
+ background: $vibrant-green;
}
.byosm span {
}
.read-reports {
- background: #eee;
+ background: $lightgrey;
opacity: 0.7;
}
$lineheight: 20px;
$typeheight: 14px;
-$offwhite: #f4f4ff;
+$offwhite: #f8f8ff;
$blue: #7092FF;
$lightblue: #B8C5F0;
$green: #7ebc6f;
+$vibrant-green: #76c551;
$grey: #CCC;
$red: red;
$lightgrey: #EEE;
# Alternative SQL queries for getway/whichways
def sql_find_ways_in_area(bbox)
- sql = <<-SQL
- SELECT DISTINCT current_ways.id AS wayid,current_ways.version AS version
- FROM current_way_nodes
- INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id
- INNER JOIN current_ways ON current_ways.id =current_way_nodes.id
- WHERE current_nodes.visible=TRUE
- AND current_ways.visible=TRUE
- AND #{OSM.sql_for_area(bbox, 'current_nodes.')}
+ sql = <<~SQL
+ SELECT DISTINCT current_ways.id AS wayid,current_ways.version AS version
+ FROM current_way_nodes
+ INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id
+ INNER JOIN current_ways ON current_ways.id =current_way_nodes.id
+ WHERE current_nodes.visible=TRUE
+ AND current_ways.visible=TRUE
+ AND #{OSM.sql_for_area(bbox, 'current_nodes.')}
SQL
ActiveRecord::Base.connection.select_all(sql).collect { |a| [a["wayid"].to_i, a["version"].to_i] }
end
def sql_find_pois_in_area(bbox)
pois = []
- sql = <<-SQL
+ sql = <<~SQL
SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.version
FROM current_nodes
LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id
def sql_find_relations_in_area_and_ways(bbox, way_ids)
# ** It would be more Potlatchy to get relations for nodes within ways
# during 'getway', not here
- sql = <<-SQL
+ sql = <<~SQL
SELECT DISTINCT cr.id AS relid,cr.version AS version
FROM current_relations cr
INNER JOIN current_relation_members crm ON crm.id=cr.id
WHERE #{OSM.sql_for_area(bbox, 'cn.')}
SQL
unless way_ids.empty?
- sql += <<-SQL
- UNION
- SELECT DISTINCT cr.id AS relid,cr.version AS version
- FROM current_relations cr
- INNER JOIN current_relation_members crm ON crm.id=cr.id
- WHERE crm.member_type='Way'
- AND crm.member_id IN (#{way_ids.join(',')})
+ sql += <<~SQL
+ UNION
+ SELECT DISTINCT cr.id AS relid,cr.version AS version
+ FROM current_relations cr
+ INNER JOIN current_relation_members crm ON crm.id=cr.id
+ WHERE crm.member_type='Way'
+ AND crm.member_id IN (#{way_ids.join(',')})
SQL
end
ActiveRecord::Base.connection.select_all(sql).collect { |a| [a["relid"].to_i, a["version"].to_i] }
def sql_get_nodes_in_way(wayid)
points = []
- sql = <<-SQL
+ sql = <<~SQL
SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,current_nodes.version
FROM current_way_nodes,current_nodes
WHERE current_way_nodes.id=#{wayid.to_i}
)
end
- if params[:node]
- bbox = Node.find(params[:node]).bbox.to_unscaled
- @lat = bbox.centre_lat
- @lon = bbox.centre_lon
- @zoom = 18
- elsif params[:way]
- bbox = Way.find(params[:way]).bbox.to_unscaled
- @lat = bbox.centre_lat
- @lon = bbox.centre_lon
- @zoom = 17
- elsif params[:note]
- note = Note.find(params[:note])
- @lat = note.lat
- @lon = note.lon
- @zoom = 17
- elsif params[:gpx] && current_user
- trace = Trace.visible_to(current_user).find(params[:gpx])
- @lat = trace.latitude
- @lon = trace.longitude
- @zoom = 16
+ begin
+ if params[:node]
+ bbox = Node.visible.find(params[:node]).bbox.to_unscaled
+ @lat = bbox.centre_lat
+ @lon = bbox.centre_lon
+ @zoom = 18
+ elsif params[:way]
+ bbox = Way.visible.find(params[:way]).bbox.to_unscaled
+ @lat = bbox.centre_lat
+ @lon = bbox.centre_lon
+ @zoom = 17
+ elsif params[:note]
+ note = Note.visible.find(params[:note])
+ @lat = note.lat
+ @lon = note.lon
+ @zoom = 17
+ elsif params[:gpx] && current_user
+ trace = Trace.visible_to(current_user).find(params[:gpx])
+ @lat = trace.latitude
+ @lon = trace.longitude
+ @zoom = 16
+ end
+ rescue ActiveRecord::RecordNotFound
+ # don't try and derive a location from a missing/deleted object
end
end
class User < ApplicationRecord
require "xml/libxml"
- self.ignored_columns = ["nearby"]
-
has_many :traces, -> { where(:visible => true) }
has_many :diary_entries, -> { order(:created_at => :desc) }
has_many :diary_comments, -> { order(:created_at => :desc) }
</div>
<div class="details" data-coordinates="<%= @note.lat %>,<%= @note.lon %>" data-status="<%= @note.status %>">
- <%= note_event("open", @note.created_at, @note.author) %>
+ <%= note_event("opened", @note.created_at, @note.author) %>
<% if @note.status == "closed" %>
<br />
<%= note_event(@note.status, @note.closed_at, @note_comments.last.author) %>
<% end %>
<table class="messages" width="100%">
- <tr>
- <th width="25%"><%= t ".post" %></th>
- <th width="25%"><%= t ".when" %></th>
- <th width="50%"><%= t ".comment" %></th>
- </tr>
+ <thead>
+ <tr>
+ <th width="25%"><%= t ".post" %></th>
+ <th width="25%"><%= t ".when" %></th>
+ <th width="50%"><%= t ".comment" %></th>
+ </tr>
+ </thead>
<% @comments.each do |comment| -%>
<% cl = cycle("table0", "table1") %>
<tr class="<%= cl %><%= " deemphasize" unless comment.visible? %>">
<%= render :partial => "notes_paging_nav" %>
<table class="note_list">
- <tr>
- <th></th>
- <th><%= t ".id" %></th>
- <th><%= t ".creator" %></th>
- <th><%= t ".description" %></th>
- <th><%= t ".created_at" %></th>
- <th><%= t ".last_changed" %></th>
- </tr>
+ <thead>
+ <tr>
+ <th></th>
+ <th><%= t ".id" %></th>
+ <th><%= t ".creator" %></th>
+ <th><%= t ".description" %></th>
+ <th><%= t ".created_at" %></th>
+ <th><%= t ".last_changed" %></th>
+ </tr>
+ </thead>
<% @notes.each do |note| -%>
<tr<% if note.author == @user %> class="creator"<% end %>>
<td>
<h3><%= t ".my_tokens" %></h3>
<p><%= t ".list_tokens" %></p>
<table>
- <tr>
- <th><%= t ".application" %></th>
- <th><%= t ".issued_at" %></th>
- <th> </th>
- </tr>
+ <thead>
+ <tr>
+ <th><%= t ".application" %></th>
+ <th><%= t ".issued_at" %></th>
+ <th> </th>
+ </tr>
+ </thead>
<% @tokens.each do |token| %>
<tr>
<td><%= link_to token.client_application.name, token.client_application.url %></td>
<p><%= t "layouts.osm_read_only" %></p>
<% elsif !current_user.data_public? %>
<p><%= t ".not_public" %></p>
- <p><%= raw t ".not_public_description", :user_page => (link_to t(".user_page_link"), :controller => "user", :action => "account", :display_name => current_user.display_name, :anchor => "public") %></p>
+ <p><%= raw t ".not_public_description", :user_page => (link_to t(".user_page_link"), :controller => "users", :action => "account", :display_name => current_user.display_name, :anchor => "public") %></p>
<p><%= raw t "site.edit.anon_edits", :link => link_to(t(".anon_edits_link_text"), t(".anon_edits_link")) %></p>
<% else %>
<%= render :partial => preferred_editor %>
<table id="block_list" cellpadding="3">
- <tr>
- <% if show_user_name %>
- <th><%= t ".display_name" %></th>
- <% end %>
- <% if show_creator_name %>
- <th><%= t ".creator_name" %></th>
- <% end %>
- <th><%= t ".reason" %></th>
- <th><%= t ".status" %></th>
- <th><%= t ".revoker_name" %></th>
- <th></th>
- <th></th>
- <% if show_revoke_link %>
- <th></th>
- <% end %>
- </tr>
+ <thead>
+ <tr>
+ <% if show_user_name %>
+ <th><%= t ".display_name" %></th>
+ <% end %>
+ <% if show_creator_name %>
+ <th><%= t ".creator_name" %></th>
+ <% end %>
+ <th><%= t ".reason" %></th>
+ <th><%= t ".status" %></th>
+ <th><%= t ".revoker_name" %></th>
+ <th></th>
+ <th></th>
+ <% if show_revoke_link %>
+ <th></th>
+ <% end %>
+ </tr>
+ </thead>
<%= render :partial => "block", :locals => { :show_revoke_link => show_revoke_link, :show_user_name => show_user_name, :show_creator_name => show_creator_name }, :collection => @user_blocks %>
</table>
<%= hidden_field_tag :ip, params[:ip] if params[:ip] %>
<%= hidden_field_tag :page, params[:page] if params[:page] %>
<table id="user_list">
- <tr>
- <td colspan="2">
- <%= t ".showing",
- :page => @user_pages.current_page.number,
- :first_item => @user_pages.current_page.first_item,
- :last_item => @user_pages.current_page.last_item,
- :items => @user_pages.item_count,
- :count => @user_pages.current_page.last_item - @user_pages.current_page.first_item + 1 %>
- <% if @user_pages.page_count > 1 %>
- | <%= raw pagination_links_each(@user_pages, {}) { |n| link_to n, @params.merge(:page => n) } %>
- <% end %>
- </td>
- <td>
- <%= check_box_tag "user_all", "1", false %>
- </td>
- </tr>
+ <thead>
+ <tr>
+ <td colspan="2">
+ <%= t ".showing",
+ :page => @user_pages.current_page.number,
+ :first_item => @user_pages.current_page.first_item,
+ :last_item => @user_pages.current_page.last_item,
+ :items => @user_pages.item_count,
+ :count => @user_pages.current_page.last_item - @user_pages.current_page.first_item + 1 %>
+ <% if @user_pages.page_count > 1 %>
+ | <%= raw pagination_links_each(@user_pages, {}) { |n| link_to n, @params.merge(:page => n) } %>
+ <% end %>
+ </td>
+ <td>
+ <%= check_box_tag "user_all", "1", false %>
+ </td>
+ </tr>
+ </thead>
<%= render @users %>
</table>
I18n.enforce_available_locales = false
+if Rails.env.test?
+ I18n.exception_handler = proc do |exception|
+ raise exception.to_exception
+ end
+end
+
Rails.configuration.after_initialize do
I18n.available_locales
end
open_title: "Unresolved note #%{note_name}"
closed_title: "Resolved note #%{note_name}"
hidden_title: "Hidden note #%{note_name}"
- open_by: "Created by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
- open_by_anonymous: "Created by anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
+ opened_by: "Created by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
+ opened_by_anonymous: "Created by anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
commented_by: "Comment from %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
commented_by_anonymous: "Comment from anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
closed_by: "Resolved by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
upload_trace: "Upload a trace"
see_all_traces: "See all traces"
see_my_traces: "See my traces"
- delete:
+ destroy:
scheduled_for_deletion: "Trace scheduled for deletion"
make_public:
made_public: "Trace made public"
revoke: Malbloki!
flash: Ĉi tiu blokado estas nuligita.
helper:
- time_future: Finiĝos %{time}.
+ time_future: Finiĝos post %{time}.
until_login: Aktiva ĝis la uzanto ensalutos.
- time_future_and_until_login: Finiĝos dum %{time} kaj post la uzanto ensalutos.
+ time_future_and_until_login: Finiĝos post %{time} kaj post la uzanto ensalutos.
time_past: Finiĝis %{time}.
block_duration:
hours:
tag: La página en el wiki con la descripción de la etiqueta %{key}=%{value}
wikidata_link: El elemento %{page} en Wikidata
wikipedia_link: El artículo %{page} en Wikipedia
+ wikimedia_commons_link: El item %{page} en Wikipedia Commons
telephone_link: Llamar al %{phone_number}
colour_preview: Vista previa del color %{colour_value}
note:
temas de cartografía.
welcome:
url: /welcome
- title: Le damos la bienvenida a OSM
+ title: Bienvenido a OpenStreetMap
description: Comenzar con esta guía rápida que cubre lo básico de OpenStreetMap.
beginners_guide:
url: https://wiki.openstreetmap.org/wiki/ES:Beginners%27_guide
wiki:
url: https://wiki.openstreetmap.org/wiki/ES:Main_Page
title: Wiki de OpenStreetMap
- description: Explora el wiki para obtener documentación detallada de OSM.
+ description: Explora el wiki para obtener documentación detallada de OpenStreetMap.
sidebar:
search_results: Resultados de la búsqueda
close: Cerrar
ایجاد کردید، نظر داد
commented_changeset: %{commenter} برای بستهٔ تغییری که %{changeset_author}
در %{time} ایجاد کرده و شما مشترک آن هستید، یک نظر نوشت
- partial_changeset_with_comment: دارای نظر «%{changeset_comment}»
+ partial_changeset_with_comment: 'با این توضیح بستهٔ تغییر: «%{changeset_comment}»'
partial_changeset_without_comment: بدون توضیح
details: 'اطلاعات بیشتر دربارهٔ بستهٔ تغییر را میتوانید اینجا ببینید: %{url}'
unsubscribe: برای لغو اطلاعرسانیهای مربوط به این بستهٔ تغییر، به %{url} بروید
description: دریافت این محدوده از یکی از آینههای پایگاهدادهٔ OpenStreetMap
geofabrik:
title: دانلودهای Geofabrik
- description: استخراج اطلاعات قارهها، کشورها، و شهرهای منتخب که بهطور منظم
+ description: گزیدهٔ اطلاعات قارهها، کشورها، و شهرهای منتخب که بهطور منظم
روزآمد میشود
metro:
title: خلاصه های مترو
# Author: Sherbrooke
# Author: Syl
# Author: The RedBurn
+# Author: Thibaut120094
# Author: Trial
# Author: Tuxxic
# Author: Urhixidur
rss:
title: Notes OpenStreetMap
description_area: Une liste de notes, signalées, commentées ou fermées dans
- votre zone [(%{min_lat} ; %{min_lon}) – (%{max_lat} ; %{max_lon})]
+ votre zone [(%{min_lat} ; %{min_lon}) – (%{max_lat} ; %{max_lon})]
description_item: Un fil RSS pour la note %{id}
opened: nouvelle note (près de %{place})
commented: nouveau commentaire (près de %{place})
met trop de temps pour être chargée.
changeset_comments:
comment:
- comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
+ comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
par %{author}
commented_at_by_html: Mis à jour le %{when} par %{user}
comments:
- comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
+ comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
par %{author}
index:
title_all: Discussion sur le groupe de modifications OpenStreetMap
- title_particular: Discussion sur le groupe de modifications OpenStreetMap nº %{changeset_id}
+ title_particular: Discussion sur le groupe de modifications OpenStreetMap nº %{changeset_id}
timeout:
sorry: Désolé, la liste des commentaires d’ensembles de modifications que vous
avez demandée est trop longue à récupérer.
new:
title: Nouvelle entrée du journal
form:
- subject: 'Sujet :'
- body: 'Corps :'
- language: 'Langue :'
- location: 'Lieu :'
- latitude: 'Latitude :'
- longitude: 'Longitude :'
+ subject: 'Sujet :'
+ body: 'Corps :'
+ language: 'Langue :'
+ location: 'Lieu :'
+ latitude: 'Latitude :'
+ longitude: 'Longitude :'
use_map_link: utiliser la carte
index:
title: Journaux des utilisateurs
login: Se connecter
no_such_entry:
title: Aucune entrée du journal correspondante
- heading: 'Aucune entrée avec l’id : %{id}'
+ heading: 'Aucune entrée avec l’id : %{id}'
body: Désolé, il n’y a aucune entrée ou commentaire dans le journal avec l’id
%{id}. Veuillez vérifier votre orthographe ou la validité du lien que vous
avez cliqué.
confirm: Confirmer
report: Signaler ce commentaire
location:
- location: 'Lieu :'
+ location: 'Lieu :'
view: Afficher
edit: Modifier
feed:
emergency_access_point: Point d’accès d’urgence
footway: Chemin piéton
ford: Gué
- give_way: Panneau « Cédez le passage »
+ give_way: Panneau « Cédez le passage »
living_street: Rue en zone de rencontre
milestone: Borne kilométrique
motorway: Autoroute
services: Services autoroutiers
speed_camera: Radar de vitesse
steps: Escalier
- stop: Panneau « Stop / Arrêt »
+ stop: Panneau « Stop / Arrêt »
street_lamp: Lampadaire
tertiary: Route tertiaire
tertiary_link: Route tertiaire
reported_user: Utilisateur signalé
not_updated: Non mis à jour
search: Rechercher
- search_guidance: 'Problèmes de recherche :'
+ search_guidance: 'Problèmes de recherche :'
user_not_found: L’utilisateur n’existe pas
issues_not_found: Aucun problème trouvé de ce type
status: État
successful_update: Votre rapport a bien été mis à jour
provide_details: Veuillez fournir les détails demandés
show:
- title: Problème %{status} nº %{issue_id}
+ title: Problème %{status} nº %{issue_id}
reports:
zero: Aucun rapport
one: 1 rapport
no_other_issues: Aucun autre problème avec cet utilisateur.
comments_on_this_issue: Commentaires sur ce problème
resolve:
- resolved: L’état du problème a été mis à « Résolu »
+ resolved: L’état du problème a été mis à « Résolu »
ignore:
- ignored: L’état du problème a été mis à « Ignoré »
+ ignored: L’état du problème a été mis à « Ignoré »
reopen:
- reopened: L’état du problème a été mis à « Ouvert »
+ reopened: L’état du problème a été mis à « Ouvert »
comments:
created_at: Le %{datetime}
- reassign_param: Réaffecter le problème ?
+ reassign_param: Réaffecter le problème ?
reports:
updated_at: Le %{datetime}
reported_by_html: Signalé comme %{category} par %{user}
helper:
reportable_title:
- diary_comment: '%{entry_title}, commentaire nº %{comment_id}'
- note: Note nº %{note_id}
+ diary_comment: '%{entry_title}, commentaire nº %{comment_id}'
+ note: Note nº %{note_id}
issue_comments:
create:
comment_created: Votre commentaire a bien été créé
title_html: Rapport %{link}
missing_params: Impossible de créer un nouveau rapport
details: Veuillez fournir plus de détails sur le problème (obligatoire).
- select: 'Sélectionnez un motif pour votre rapport :'
+ select: 'Sélectionnez un motif pour votre rapport :'
disclaimer:
intro: 'Avant d’envoyer votre rapport aux modérateurs du site, veuillez vous
- assurer que :'
- not_just_mistake: vous êtes certain que le problème n’est pas juste une erreur ;
- unable_to_fix: vous êtes incapable de régler le problème par vous-même ou
- avec l’aide des membres de votre proche communauté ;
+ assurer que :'
+ not_just_mistake: Vous êtes certain que le problème n’est pas juste une erreur
+ unable_to_fix: Vous ne pouvez pas régler le problème par vous-même ou avec
+ l’aide des membres de votre proche communauté
resolve_with_user: vous avez déjà essayé de résoudre le problème avec l’utilisateur
concerné.
categories:
user_diaries_tooltip: Voir les journaux d’utilisateurs
edit_with: Modifier avec %{editor}
tag_line: La carte wiki libre du monde
- intro_header: Bienvenue dans OpenStreetMap !
+ intro_header: Bienvenue dans OpenStreetMap !
intro_text: OpenStreetMap est une carte du monde, créée par des gens comme vous
et libre d’utilisation sous licence libre.
intro_2_create_account: Créez un compte d’utilisateur
journal'
hi: Bonjour %{to_user},
header: '%{from_user} a publié un commentaire sur un article récent du journal
- OpenStreetMap avec le sujet %{subject} :'
+ OpenStreetMap avec le sujet %{subject} :'
footer: Vous pouvez également lire le commentaire sur %{readurl}, le commenter
sur %{commenturl} ou répondre sur %{replyurl}
message_notification:
hi: Bonjour %{to_user},
header: '%{from_user} vous a envoyé un message depuis OpenStreetMap avec le
- sujet %{subject} :'
+ sujet %{subject} :'
footer_html: Vous pouvez aussi lire le message à %{readurl} et vous pouvez y
répondre à %{replyurl}
friend_notification:
hi: Bonjour %{to_user},
subject: '[OpenStreetMap] %{user} vous a ajouté comme ami'
had_added_you: '%{user} vous a ajouté comme ami dans OpenStreetMap.'
- see_their_profile: 'Vous pouvez voir son profil ici : %{userurl}.'
- befriend_them: 'Vous pouvez également l''ajouter comme ami ici : %{befriendurl}.'
+ see_their_profile: 'Vous pouvez voir son profil ici : %{userurl}.'
+ befriend_them: 'Vous pouvez également l''ajouter comme ami ici : %{befriendurl}.'
gpx_notification:
greeting: Bonjour,
your_gpx_file: Il semble que votre fichier GPX
with_description: avec la description
- and_the_tags: 'et les mots-clés suivants :'
+ and_the_tags: 'et les mots-clés suivants :'
and_no_tags: et sans mot-clé.
failure:
subject: '[OpenStreetMap] Échec de l’import GPX'
- failed_to_import: 'n’a pas pu être importé. Voici l’erreur :'
+ failed_to_import: 'n’a pas pu être importé. Voici l’erreur :'
more_info_1: Plus d’informations sur les échecs d’import GPX et comment les
éviter
- more_info_2: 'peuvent être trouvés sur :'
+ more_info_2: 'peuvent être trouvés sur :'
success:
subject: '[OpenStreetMap] Import GPX réussi'
loaded_successfully: s’est chargé correctement avec %{trace_points} des %{possible_points}
points possibles.
signup_confirm:
subject: '[OpenStreetMap] Bienvenue dans OpenStreetMap'
- greeting: Bonjour !
+ greeting: Bonjour !
created: Quelqu’un (vous, espérons-le) vient juste de créer un compte sur %{site_url}.
confirm: 'Avant que nous fassions quoi que ce soit d’autre, nous avons besoin
- d’une confirmation que cette demande provient bien de vous ; si c’est le cas,
- veuillez cliquer le lien ci-dessous pour confirmer votre compte :'
+ d’une confirmation que cette demande provient bien de vous ; si c’est le cas,
+ veuillez cliquer le lien ci-dessous pour confirmer votre compte :'
welcome: Une fois votre compte confirmé, nous vous fournirons des informations
supplémentaires pour bien démarrer.
email_confirm:
partial_changeset_without_comment: sans commentaire
details: Plus de détails sur l’ensemble de modifications à %{url}.
unsubscribe: Pour vous désabonner des mises à jour de cet ensemble de modifications,
- visitez %{url} et cliquez sur « Désabonner ».
+ visitez %{url} et cliquez sur « Désabonner ».
messages:
inbox:
title: Boîte de réception
subject: Objet
date: Date
no_messages_yet: Vous n’avez actuellement aucun message. Pourquoi ne pas entrer
- en contact avec quelques %{people_mapping_nearby_link} ?
+ en contact avec quelques %{people_mapping_nearby_link} ?
people_mapping_nearby: personnes qui cartographient aux alentours
message_summary:
unread_button: Marquer comme non lu
to: À
subject: Objet
date: Date
- no_sent_messages: Vous n’avez encore envoyé aucun message. Pourquoi ne pas entrez
- en contact avec quelques %{people_mapping_nearby_link} ?
+ no_sent_messages: Vous n’avez pas encore envoyé de message. Pourquoi ne pas
+ entrez en contact avec quelques %{people_mapping_nearby_link} ?
people_mapping_nearby: personnes proche de vous
reply:
- wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
+ wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
vous souhaitez répondre n’a pas été envoyé à cet utilisateur. Veuillez vous
connecter avec l’identifiant correct pour pouvoir répondre.
show:
destroy_button: Supprimer
back: Retour
to: À
- wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
+ wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez
vous connecter avec l’identifiant correct pour pouvoir le lire.
sent_message_summary:
site:
about:
next: Suivant
- copyright_html: © Contributeurs<br /> d’OpenStreetMap
+ copyright_html: © Contributeurs<br /> d’OpenStreetMap
used_by: '%{name} fournit des données cartographiques sur des milliers de sites
web, applications mobiles et appareils'
lede_text: OpenStreetMap est bâti par une communauté de cartographes bénévoles
communautaires</a> et \nle site web de la <a href=\"https://www.osmfoundation.org/\">Fondation
OSM</a>."
open_data_title: Données ouvertes
- open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
+ open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
de l’utiliser dans n’importe quel but tant que vous créditez OpenStreetMap
et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une
façon quelconque, vous pouvez distribuer le résultat seulement suivant la
la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
Commons paternité – partage à l’identique 2.0</a> (CC-BY-SA).
credit_title_html: Comment créditer OpenStreetMap
- credit_1_html: Nous demandons que votre crédit comporte la mention « © les
- contributeurs d’OpenStreetMap ».
+ credit_1_html: Nous demandons que votre crédit comporte la mention « © les
+ contributeurs d’OpenStreetMap ».
credit_2_html: |-
Vous devez également préciser clairement que les données sont disponibles sous la licence
ODbL (Open Database License) et, si vous utilisez les tuiles de notre carte, que la carte est sous la
licence CC BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers
<a href="https://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
- Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
+ Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
credit_3_html: |-
Pour une carte électronique navigable, le crédit devrait apparaître dans un coin de la carte.
- Par exemple :
+ Par exemple :
attribution_example:
alt: Exemple d’attribution d’OpenStreetMap sur une page Internet
title: Exemple d’attribution
contributors_title_html: Nos contributeurs
contributors_intro_html: 'Nos contributeurs sont des milliers de personnes.
Nous incluons également des données publiées sous licence ouverte par des
- agences nationales de cartographie et par d’autres sources, notamment :'
+ agences nationales de cartographie et par d’autres sources, notamment :'
contributors_at_html: |-
- <strong>Autriche</strong> : contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
+ <strong>Autriche</strong> : contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
licence <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), la
<a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région du Vorarlberg</a> et la
région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT avec amendements</a>).
contributors_au_html: |-
- <strong>Australie</strong> : contient des données sourcées de
+ <strong>Australie</strong> : contient des données sourcées de
<a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA Australia Limited</a> publiées sous la licence
<a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> accordée par le Commonwealth d’Australie.
- contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
+ contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
<em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
<em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
(Division Géographie, Statistiques du Canada).'
- contributors_fi_html: '<strong>Finlande</strong> : contient des données de
+ contributors_fi_html: '<strong>Finlande</strong> : contient des données de
la Base de données topographique de l’Inspection nationale du territoire
de Finlande et d’autres ensembles de données, sous <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licence
NLSFI</a>.'
- contributors_fr_html: '<strong>France</strong> : contient des données de la
+ contributors_fr_html: '<strong>France</strong> : contient des données de la
<em>Direction générale des finances publiques</em> (anciennement la <em>Direction
générale des impôts</em>).'
- contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
+ contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com/">www.and.com</a>).'
- contributors_nz_html: "<strong>Nouvelle-Zélande</strong> : contient des données
+ contributors_nz_html: "<strong>Nouvelle-Zélande</strong> : contient des données
provenant du <a href=\"https://data.linz.govt.nz/\">service de données LINZ</a>
et pour la réutilisation, sous licence \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC
BY 4.0</a>."
sous licence <a href="https://creativecommons.org/licenses/by/4.0/">CC BY
4.0</a> pour la réutilisation .'
contributors_za_html: |-
- <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
+ <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
Informations Géospatiales Nationales</a>, copyright de l’État réservé.
contributors_gb_html: |-
- <strong>Royaume-Uni</strong> : contient des données issues de
+ <strong>Royaume-Uni</strong> : contient des données issues de
l’<em>Ordnance Survey</em> © 2010–2019 Droits d’auteurs et de la
base de données de la Couronne.
contributors_footer_1_html: Pour plus de détails sur celles-ci et sur les
export_details: Les données d’OpenStreetMap sont publiées sous la <a href="https://opendatacommons.org/licenses/odbl/1.0/">licence
Open Data Commons Open Database</a> (ODbL).
too_large:
- advice: 'Si l’export ci-dessus échoue, veuillez envisager l’utilisation d’une
- des sources listées ci-dessous :'
+ advice: 'Si l’export ci-dessus échoue, veuillez envisager l’utilisation de
+ l’une des sources listées ci-dessous :'
body: Cette zone est trop vaste pour être exportée au format OpenStreetMap
XML. Veuillez zoomer ou sélectionner une zone plus petite, ou utiliser une
des sources suivantes pour le téléchargement de données massives.
welcomemat:
url: https://wiki.openstreetmap.org/wiki/FR:Page_principale
title: Pour les organisations
- description: Dans une organisation qui fait des plans pour OpenStreetMap ?
+ description: Dans une organisation qui fait des plans pour OpenStreetMap ?
Trouvez ce que vous avez besoin de savoir dans le tapis d’accueil.
wiki:
url: https://wiki.openstreetmap.org/wiki/FR:Page_principale
alt: Texte alternatif
url: URL
welcome:
- title: Bienvenue !
+ title: Bienvenue !
introduction_html: Bienvenue à OpenStreetMap, la carte du monde libre et éditable.
Maintenant que vous êtes enregistré, vous avez tout ce qu’il faut pour commencer
à cartographier. Ce qui suit est un petit guide des choses les plus importantes
whats_on_the_map:
title: Ce qu’il y a sur la carte
on_html: OpenStreetMap sert à cartographier des objets qui sont à la fois
- <em>réels et actuels</em> — il contient des millions de bâtiments, de routes
+ <em>réels et actuels</em> — il contient des millions de bâtiments, de routes
et d’autres détails sur des lieux. Vous pouvez cartographier n’importe quel
élément du monde réel qui vous intéresse.
off_html: Ce qui est par contre <em>exclu</em> sont les données subjectives
à propos d’un nœud ou d’un chemin, comme le nom d’un restaurant ou la limite
de vitesse d’une route.
rules:
- title: Règles !
+ title: Règles !
paragraph_1_html: OpenStreetMap a quelques règles formelles, mais nous attendons
de tous les participants une collaboration et une communication avec la
communauté. Si vous envisagez d’autres activités que la modification à la
importations</a> et <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les
modifications automatiques</a>.
questions:
- title: Des questions ?
+ title: Des questions ?
paragraph_1_html: |-
OpenStreetMap propose plusieurs ressources pour apprendre à travailler dans le projet, pour poser des questions et y répondre, et pour discuter et documenter les sujets de cartographie en collaboration avec d’autres utilisateurs.
- <a href='%{help_url}'>Trouver de l’aide ici</a>. Dans une organisation qui fait des plans pour OpenStreetMap ? <a href='https://welcome.openstreetmap.org/'>Vérifiez votre tapis d’accueil</a>.
+ <a href='%{help_url}'>Trouver de l’aide ici</a>. Dans une organisation qui fait des plans pour OpenStreetMap ? <a href='https://welcome.openstreetmap.org/'>Vérifiez votre tapis d’accueil</a>.
start_mapping: Commencer à cartographier
add_a_note:
- title: Pas le temps d’effectuer les modifications ? Ajoutez une note !
+ title: Pas le temps d’effectuer les modifications ? Ajoutez une note !
paragraph_1_html: |-
Si vous voulez juste une petite correction et n’avez pas le temps de vous
enregistrer sur le projet et d’apprendre à effectuer les modifications, il est facile d’ajouter une note.
paragraph_2_html: |-
- Allez simplement sur <a href='%{map_url}'>la carte</a> et cliquez sur l’icône note :
+ Allez simplement sur <a href='%{map_url}'>la carte</a> et cliquez sur l’icône note :
<span class='icon note'></span>. Cela ajoutera un marqueur sur la carte, que vous pouvez déplacer en faisant glisser la carte. Ajoutez votre message puis cliquez sur Enregistrer, et d’autres contributeurs iront regarder.
traces:
visibility:
delete_trace: Supprimer cette piste
trace_not_found: Trace non trouvée !
visibility: 'Visibilité :'
- confirm_delete: Supprimer cette trace ?
+ confirm_delete: Supprimer cette trace ?
trace_paging_nav:
showing_page: Page %{page}
older: Anciennes traces
confirmer votre nouvelle adresse courriel.
flash update success: Informations sur l’utilisateur mises à jour avec succès.
confirm:
- heading: Vérifiez votre courriel !
+ heading: Vérifiez votre courriel !
introduction_1: Nous vous avons envoyé un courriel de confirmation.
introduction_2: Confirmez votre compte en cliquant sur le lien dans le courriel
et vous pourrez commencer à cartographier.
press confirm button: Appuyez sur le bouton Confirmer ci-dessous pour confirmer
votre nouvelle adresse de courriel.
button: Confirmer
- success: Modification de votre adresse de courriel confirmée !
+ success: Modification de votre adresse de courriel confirmée !
failure: Une adresse de courriel a déjà été confirmée avec ce jeton d’authentification.
unknown_token: Ce code de confirmation a expiré ou n’existe pas.
set_home:
unhide_comment: démasquer
notes:
new:
- intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
+ intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la
position exacte et écrivez une note pour expliquer le problème.
advice: Votre note est publique et peut être utilisée pour mettre à jour la
user_title: Diario di %{user}
leave_a_comment: Lascia un commento
login_to_leave_a_comment: '%{login_link} per lasciare un commento'
- login: Accedi
+ login: Entra
no_such_entry:
title: Nessuna voce del diario
heading: 'Nessuna voce con l''identificativo: %{id}'
# Author: Teiron
# Author: The Polish
# Author: Ty221
+# Author: WaldiSt
# Author: Woytecr
# Author: Wpedzich
# Author: Yarl
errors:
messages:
invalid_email_address: nie wygląda na poprawny adres e-mail
+ email_address_not_routable: nie jest routowalny
models:
acl: Lista kontroli dostępu
changeset: Zestaw zmian
że udostępniający je podmiot popiera OpenStreetMap, udziela jakiejkolwiek
gwarancji lub ponosi jakąkolwiek odpowiedzialność.
infringement_title_html: Naruszenia praw autorskich
- infringement_1_html: Użytkownicy OpenStreetMap powinni pamiętać, aby nigdy
- nie dodawać danych z żadnych źródeł chronionych prawami autorskimi (jak
- np. Google Maps i większość map drukowanych) bez wyraźnego pozwolenia
- właściciela praw autorskich.
+ infringement_1_html: Autorzy OpenStreetMap powinni pamiętać, aby nigdy nie
+ dodawać danych z żadnych źródeł chronionych prawami autorskimi (jak np.
+ Google Maps i większość map drukowanych) bez wyraźnego pozwolenia właściciela
+ praw autorskich.
infringement_2_html: Jeśli uważasz, że materiał chroniony prawem autorskim
został niewłaściwie dodany do bazy OpenStreetMap, zajrzyj pod adres naszej
<a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procedury
title: Warunki
heading: Warunki
heading_ct: Warunki uczestnictwa
+ read and accept with tou: Przeczytaj Warunki uczestnictwa i Warunki użytkowania,
+ zaznacz oba pola wyboru po zakończeniu, a następnie naciśnij przycisk Kontynuuj.
+ contributor_terms_explain: Niniejsza umowa reguluje warunki twoich obecnych
+ i przyszłych wkładów.
+ read_ct: Przeczytałem i akceptuję powyższe warunki współautora
+ tou_explain_html: Te %{tou_link} regulują korzystanie ze strony internetowej
+ i innej infrastruktury zapewnianej przez OSMF. Kliknij link, przeczytaj i
+ zaakceptuj tekst.
+ read_tou: Przeczytałem i akceptuję Warunki użytkowania
consider_pd: Oprócz powyższych warunków, stwierdzam również, że mój wkład jest
w domenie publicznej
consider_pd_why: co to oznacza?
# Author: Abijeet Patro
# Author: AmaryllisGardener
# Author: John Reid
+# Author: MJL
---
sco:
time:
latitude: Latitude
longitude: Longitude
public: Public
- description: Description
+ description: Descreeption
message:
sender: Sender
title: Subject
email: Email
active: Active
display_name: Display Name
- description: Description
+ description: Descreeption
languages: Leids
pass_crypt: Passwird
editor:
centre_map: Centre cairt here
redactions:
edit:
- description: Description
+ description: Descreeption
heading: Eedit redaction
...
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
basic_authorization user.email, "test"
# simple diff to create a node way and relation using placeholders
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
</relation>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
changeset_id = @response.body.to_i
# upload some widely-spaced nodes, spiralling positive and negative
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='-20' lat='-10' changeset='#{changeset_id}'/>
<node id='-18' lon='179.9' lat='89.9' changeset='#{changeset_id}'/>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it, which used to cause an error like "PGError: ERROR:
# integer out of range" (bug #2152). but shouldn't any more.
basic_authorization changeset.user.email, "test"
# simple diff to create a node way and relation using placeholders
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
</node>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
# simple diff to create a node way and relation using placeholders
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
# simple diff to create a node way and relation using placeholders
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
</node>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
# change the location of a node multiple times, each time referencing
# the last version. doesn't this depend on version numbers being
# sequential?
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
<node id='#{node.id}' lon='9' lat='9' changeset='#{changeset.id}' version='8'/>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
<node id='#{node.id}' lon='1' lat='1' changeset='#{changeset.id}' version='1'/>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='1' lon='1' lat='1' changeset='#{changeset.id}'/>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<ping>
<node id='1' lon='1' lat='1' changeset='#{changeset.id}' />
</ping>
</osmChange>
-CHANGESET
+ CHANGESET
post :upload, :params => { :id => changeset.id }, :body => diff
assert_response :bad_request, "Shouldn't be able to upload a diff with the action ping"
assert_equal @response.body, "Unknown action ping, choices are create, modify, delete"
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify><node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}'
version='1'></node>
<member type='relation' role='some' ref='#{other_relation.id}'/>
</relation>
</modify></osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
<node id='-1' lon='2' lat='2' changeset='#{changeset.id}' version='2'/>
</delete>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id='-1' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
<node id='-1' lon='2' lat='2' changeset='#{changeset.id}' version='2'/>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
</way>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
assert_equal "Placeholder node not found for reference -4 in way -1", @response.body
# the same again, but this time use an existing way
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
</way>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
basic_authorization changeset.user.email, "test"
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
</relation>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
assert_equal "Placeholder Node not found for reference -4 in relation -1.", @response.body
# the same again, but this time use an existing relation
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<create>
<node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
</relation>
</create>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset.id }, :body => diff
changeset_id = @response.body.to_i
# add a diff to it
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
<node id='#{node.id}' lon='9' lat='9' changeset='#{changeset_id}' version='8'/>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
assert_response :success
changeset_id = @response.body.to_i
- diff = <<OSMFILE.strip_heredoc
+ diff = <<~OSMFILE
<osmChange version="0.6" generator="JOSM">
<create version="0.6" generator="JOSM">
<node id='-1' visible='true' changeset='#{changeset_id}' lat='51.49619982187321' lon='-0.18722061869438314' />
</way>
</create>
</osmChange>
-OSMFILE
+ OSMFILE
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
changeset_id = @response.body.to_i
# add a diff to it
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<delete>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
</way>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post :upload, :params => { :id => changeset_id }, :body => diff
basic_authorization user.email, "test"
- doc_str = <<OSM.strip_heredoc
+ doc_str = <<~OSM
<osm>
<relation changeset='#{changeset.id}'>
<member ref='#{node1.id}' type='node' role='first'/>
<member ref='#{way2.id}' type='way' role='fourth'/>
</relation>
</osm>
-OSM
+ OSM
doc = XML::Parser.string(doc_str).parse
put :create, :body => doc.to_s
node1 = create(:node)
node2 = create(:node)
- doc_str = <<OSM.strip_heredoc
+ doc_str = <<~OSM
<osm>
<relation changeset='#{changeset.id}'>
<member ref='#{node1.id}' type='node' role='forward'/>
<member ref='#{node2.id}' type='node' role='forward'/>
</relation>
</osm>
-OSM
+ OSM
doc = XML::Parser.string(doc_str).parse
## First try with the private user
node3 = create(:node)
node4 = create(:node)
- doc_str = <<OSM.strip_heredoc
+ doc_str = <<~OSM
<osm>
<relation changeset='#{changeset.id}'>
<member ref='#{node1.id}' type='node' role='forward'/>
<member ref='#{node2.id}' type='node' role='forward'/>
</relation>
</osm>
-OSM
+ OSM
doc = XML::Parser.string(doc_str).parse
basic_authorization user.email, "test"
assert_redirected_to :controller => :users, :action => :login, :referer => "/edit"
end
+ # Test the error when trying to edit without public edits
+ def test_edit_non_public
+ get :edit, :session => { :user => create(:user, :data_public => false) }
+ assert_response :success
+ assert_template "edit"
+ assert_select "a[href='https://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits']"
+ end
+
# Test the right editor gets used when the user hasn't set a preference
def test_edit_without_preference
get :edit, :session => { :user => create(:user) }
assert_equal 18, assigns(:zoom)
end
+ # Test editing inaccessible nodes
+ def test_edit_with_inaccessible_nodes
+ user = create(:user)
+ deleted_node = create(:node, :lat => 1.0, :lon => 1.0, :visible => false)
+
+ get :edit, :params => { :node => 99999 }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+
+ get :edit, :params => { :node => deleted_node.id }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+ end
+
# Test editing a specific way
def test_edit_with_way
user = create(:user)
node = create(:node, :lat => 3, :lon => 3)
- way = create(:way)
+ way = create(:way)
create(:way_node, :node => node, :way => way)
get :edit, :params => { :way => way.id }, :session => { :user => user }
assert_equal 17, assigns(:zoom)
end
+ # Test editing inaccessible ways
+ def test_edit_with_inaccessible_ways
+ user = create(:user)
+ deleted_way = create(:way, :visible => false)
+
+ get :edit, :params => { :way => 99999 }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+
+ get :edit, :params => { :way => deleted_way.id }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+ end
+
# Test editing a specific note
def test_edit_with_note
user = create(:user)
assert_equal 17, assigns(:zoom)
end
+ # Test editing inaccessible notes
+ def test_edit_with_inaccessible_notes
+ user = create(:user)
+ deleted_note = create(:note, :status => "hidden") do |n|
+ n.comments.create(:author_id => user.id)
+ end
+
+ get :edit, :params => { :note => 99999 }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+
+ get :edit, :params => { :note => deleted_note.id }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+ end
+
# Test editing a specific GPX trace
def test_edit_with_gpx
user = create(:user)
- gpx = create(:trace, :latitude => 1, :longitude => 1)
+ gpx = create(:trace, :latitude => 1, :longitude => 1)
get :edit, :params => { :gpx => gpx.id }, :session => { :user => user }
assert_response :success
assert_equal 16, assigns(:zoom)
end
+ # Test editing inaccessible GPX traces
+ def test_edit_with_inaccessible_gpxes
+ user = create(:user)
+ deleted_gpx = create(:trace, :deleted, :latitude => 1, :longitude => 1)
+ private_gpx = create(:trace, :latitude => 1, :longitude => 1, :visibility => "private")
+
+ get :edit, :params => { :gpx => 99999 }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+
+ get :edit, :params => { :gpx => deleted_gpx.id }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+
+ get :edit, :params => { :gpx => private_gpx.id }, :session => { :user => user }
+ assert_response :success
+ assert_template "edit"
+ assert_nil assigns(:lat)
+ assert_nil assigns(:lon)
+ assert_nil assigns(:zoom)
+ end
+
# Test the edit page redirects
def test_edit_redirect
get :edit, :params => { :lat => 4, :lon => 5 }
date = Time.new(2014, 3, 5, 21, 37, 45, "+00:00")
user = create(:user)
- assert_match %r{^Created by anonymous <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("open", date, nil)
+ assert_match %r{^Created by anonymous <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("opened", date, nil)
assert_match %r{^Resolved by <a href="/user/#{ERB::Util.u(user.display_name)}">#{user.display_name}</a> <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("closed", date, user)
end
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post "/api/0.6/changeset/#{changeset.id}/upload",
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post "/api/0.6/changeset/#{changeset.id}/upload",
# simple diff to change a node, way and relation by removing
# their tags
- diff = <<CHANGESET.strip_heredoc
+ diff = <<~CHANGESET
<osmChange>
<modify>
<node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
</relation>
</modify>
</osmChange>
-CHANGESET
+ CHANGESET
# upload it
post "/api/0.6/changeset/#{changeset.id}/upload",
class I18nTest < ActiveSupport::TestCase
I18n.available_locales.each do |locale|
define_method("test_#{locale.to_s.underscore}".to_sym) do
- # plural_keys = plural_keys(locale)
+ without_i18n_exceptions do
+ # plural_keys = plural_keys(locale)
- translation_keys.each do |key|
- variables = []
+ translation_keys.each do |key|
+ variables = []
- default_value = I18n.t(key, :locale => I18n.default_locale)
+ default_value = I18n.t(key, :locale => I18n.default_locale)
- if default_value.is_a?(Hash)
- variables.push("count")
+ if default_value.is_a?(Hash)
+ variables.push("count")
- default_value.each_value do |subvalue|
- subvalue.scan(/%\{(\w+)\}/) do
+ default_value.each_value do |subvalue|
+ subvalue.scan(/%\{(\w+)\}/) do
+ variables.push(Regexp.last_match(1))
+ end
+ end
+ else
+ default_value.scan(/%\{(\w+)\}/) do
variables.push(Regexp.last_match(1))
end
end
- else
- default_value.scan(/%\{(\w+)\}/) do
- variables.push(Regexp.last_match(1))
- end
- end
- variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
+ variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
- value = I18n.t(key, :locale => locale, :fallback => true)
+ value = I18n.t(key, :locale => locale, :fallback => true)
- if value.is_a?(Hash)
- value.each do |subkey, subvalue|
- # assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
+ if value.is_a?(Hash)
+ value.each do |subkey, subvalue|
+ # assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
- next if subvalue.nil?
+ next if subvalue.nil?
- subvalue.scan(/%\{(\w+)\}/) do
- assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
+ subvalue.scan(/%\{(\w+)\}/) do
+ assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
+ end
end
- end
- else
- assert value.is_a?(String), "#{key} is not a string"
+ else
+ assert value.is_a?(String), "#{key} is not a string"
- value.scan(/%\{(\w+)\}/) do
- assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
+ value.scan(/%\{(\w+)\}/) do
+ assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
+ end
end
end
- end
- assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
+ assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
+ end
end
end
end
end
+ ##
+ # execute a block with missing translation exceptions suppressed
+ def without_i18n_exceptions
+ exception_handler = I18n.exception_handler
+ begin
+ I18n.exception_handler = nil
+ yield
+ ensure
+ I18n.exception_handler = exception_handler
+ end
+ end
+
##
# work round minitest insanity that causes it to tell you
# to use assert_nil to test for nil, which is fine if you're